SpringはShiroを統合し、SpringBootはShiroを統合する

シロ

シロの3大機能

Shiro には 3 つのコア コンポーネントがありますSubjectSecurityManagerRealm

  • 件名: について认证主体アプリケーション コードが直接対話するオブジェクトは、現在のユーザーを表す Subject です。Principalsと2 つのメッセージが含まれますCredentials
  • SecurityManager : 用安全管理员城建築の核心です。サブジェクトとのすべての対話は SecurityManager に委任されます。サブジェクトはファサードに相当し、SecurityManager が実際の実行者です。これは、Shiro の他のコンポーネントと対話する役割を果たします。
  • レルム: はい一个域Shiro とアプリケーションのセキュリティ データ間の「ブリッジ」として機能します。Shiro は Realm からセキュリティ データ (ユーザー、ロール、権限など) を取得します。つまり、SecurityManager がユーザーの ID を検証したい場合は、ユーザーの ID が合法かどうかを判断するために、比較のために Realm から対応するユーザーを取得する必要があります。また、Realm から取得する必要があります。ユーザーの対応するロールと権限は、ユーザーの操作を実行できるかどうかを確認するために使用されます。Realm は DataSource、つまり安全なデータ ソースとみなすことができます。

f1df3b80052a40ecb8482475e35e127f~tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp

  • 認証: ID 認証、ログイン、ユーザーが対応する ID を持っているかどうかを確認します。
  • 認可: 認可、つまり権限検証。認証されたユーザーが特定の権限を持っているかどうかを検証します。つまり、ユーザーが特定のロールを持っているかどうかの検証など、ユーザーが操作を実行できるかどうかを判断します。ユーザーの特定のリソースに対する特定の権限を持っていますか?
  • Session Manager : セッション管理、つまり、ユーザーがログインした後の最初のセッションです。終了する前は、すべての情報がセッション内にあります。セッションは通常の JavaSE 環境または Web 環境にすることができます。
  • 暗号化: データのセキュリティを保護するための暗号化。パスワードはクリア テキストで保存されるのではなく、暗号化されてデータベースに保存されます。
  • Web サポート: Web 環境に簡単に統合できる Web サポート。
  • キャッシュ: キャッシュすると、たとえば、ユーザーがログインした後、そのユーザー情報、ロール、権限を毎回確認する必要がなくなり、効率が向上します。
  • 同時実行性:Shiro はマルチスレッド アプリケーションの同時検証をサポートしています。つまり、1 つのスレッドで別のスレッドを開始すると、権限が自動的にそのスレッドに伝播されます。
  • テスト: テストのサポートを提供します。
  • RunAs : あるユーザーが別のユーザーになりすますことを許可します (許可されている場合)。
  • Remember Me : Remember me、これは非常に一般的な機能です。つまり、一度ログインすると、次回からログインする必要はありません。

城建築(外観)

b00b0b78d68943feae4aa9832b82bb98~tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp

外部からShiroを観察する、つまり、アプリケーションの観点から、Shiroを使用して作業を完了する方法を観察する: 対象ユーザー、SecurityManagerがすべてのユーザーのレルム接続データを管理する

  • subject : アプリケーション コードが直接対話するオブジェクトは Subject です。言い換えれば、Shiro外部 API の核心は、SubjectSubject が現在のユーザーを表すということです。このユーザーは必ずしも特定の人である必要はありません。現在のアプリケーションと対話するものはすべて Subject です。サブジェクトとのクローラ、ロボットなどとのすべての対話は SecurityManager に委任されます。サブジェクトは実際にはファサードであり、SecurityManager が実際の実行者です。
  • SecurityManager : セキュリティ マネージャー、つまり、すべてのセキュリティ関連の操作がSercurityManagerそれと対話し、すべてのサブジェクトを管理します。これは、Shiro の中核であることがわかります。Shiro の他のコンポーネントと対話する責任があります。同等です。 SpringMVC の DispatcherServlet 文字に
  • Realm :Shiro は Realm からセキュリティ データ (ユーザー、ロール、権限など) を取得します。つまり、SecurityManager がユーザーの ID を検証したい場合は、ユーザーの ID が正しいかどうかを判断するために、比較のために Realm から対応するユーザーを取得する必要があります。合法です。 Realm からユーザーを取得する必要もありますRealm。対応するロールと権限を使用して、ユーザーの操作を実行できるかどうかを確認します。Realm を DataSource として表示できます。

城建築(内部)

8991ce3120e94c9baccc4aae76666875~tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp

  • 対象者: アプリケーションを操作できる任意のユーザー。
  • Security Manager : SpringMVC と同等DispatcherSerlet、Shiro です心脏. すべての特定の対話はSecurity Managerそれを通じて制御されます. すべてのサブジェクトを管理し、認証、認可、セッション、およびキャッシュの管理を担当します。
  • Authenticator : 認証を担当しSubject、カスタマイズ可能な拡張ポイントです。使用できます认证策略(認証戦略)、つまり、どのような状況でユーザー認証が通過するか?
  • Authorizer : Authorizer、つまりアクセス コントローラー。サブジェクトが対応する操作を実行する権限を持っているかどうかを判断するために使用されます。つまり、ユーザーがアプリケーション内のどの機能にアクセスできるかを制御します。
  • レルム: 1 つ以上のレルムがあり、セキュア エンティティ データ ソースとみなすことができます。つまり、セキュア エンティティを取得するために使用されます。JDBC を使用して実装することも、メモリなどに実装することもできます。ユーザーによって提供されるため、一般にすべてのアプリケーションが独自のレルムを実装する必要があります。
  • SessionManager : Sessionのライフサイクルを管理するコンポーネントShiroはWeb環境だけでなく、通常のJavaSE環境でも利用可能です。
  • CacheManager : ユーザー、ロール、権限などのキャッシュを管理するキャッシュ コントローラー。これらのデータはめったに変更されないため、キャッシュに配置するとアクセス パフォーマンスが向上します。
  • 暗号化: 暗号化モジュール、Shiro は、パスワードの暗号化、復号化などのいくつかの一般的な暗号化コンポーネントを改善します。

シロ認定プロセス

W%A~CHW4PLQ`@4B%1@KF4Y0.png

hiro認証プロセス

b418716f335d4f10bde6a62cfa97fa3f~tplv-k3u1fbpfcp-watermark.png

しろ使用

SaaSExport 実践プロジェクトの使用法 (ssm)

pom.xml の依存関係

 
 

XML

コードをコピーする

<!--Shiro和Spring整合--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3.2</version> </dependency> <!--Shiro核心包--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency>

web.xml

 
 

XML

コードをコピーする

<!--服务器启动时加载Spring配置文件--> <context-param>   <param-name>contextConfigLocation</param-name>   <param-value>     classpath:spring.xml     classpath:shiro.xml   </param-value> </context-param>   <!--Shiro核心过滤器--> <filter>   <filter-name>shiroFilter</filter-name>   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping>   <filter-name>shiroFilter</filter-name>   <url-pattern>/*</url-pattern> </filter-mapping>

shiro.xml

 
 

XML

コードをコピーする

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> ​   <!--id=shiroFilter不能写错,大小写敏感,这个id的值与filter的名字相同-->   <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">       <property name="securityManager" ref="defaultWebSecurityManager"/>       <!--**表示当前路径下所有资源,包括一级目录,二级目录,等等-->       <!--anon放在最前面,authc放在最后面-->       <property name="filterChainDefinitions">           <value>               /css/** = anon               /img/** = anon               /make/** = anon               /plugins/** = anon               /login.do = anon ​               /system/dept/list.do = perms["部门管理"]               /system/user/list.do = perms["用户管理"]               /system/company/list.do = perms["企业管理"]               /system/module/list.do = perms["模块管理"]               /system/role/list.do = perms["角色管理"]               /system/syslog/list.do = perms["日记管理"] ​               /** = authc           </value>       </property>       <property name="unauthorizedUrl" value="/unauthorized.jsp"/>   </bean> ​ ​   <bean id="defaultWebSecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">       <property name="realm" ref="authReaml"/>   </bean> ​ ​   <bean id="authReaml" class="com.it.shiro.AuthReaml"> <!--       &lt;!&ndash;将123456转成MD5格式的密码,然后再和数据库中的MD5密码进行比较&ndash;&gt;--> <!--       &lt;!&ndash;所以在企业开发中,配置方式很常用,可拔插&ndash;&gt;--> <!--       <property name="credentialsMatcher" ref="hashedCredentialsMatcher"/>-->   </bean> ​   <!--我们使用MD5加密器--> <!--   <bean id="hashedCredentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">--> <!--       <property name="hashAlgorithmName" value="MD5"/>--> <!--   </bean>--> ​ ​ </beans>

権限パラメータテーブル

QQ画像 20230807165205.png

AuthReamlクラスを実装する

この演習プロジェクトの権限は RBAC モデルに基づいており、ユーザー テーブル、ロール テーブル、モジュール テーブル、および 2 つの中間テーブルを使用して、ユーザーとロールの中間テーブルを通じてユーザーの対応するロールを取得し、対応する権限を取得します。ロールとモジュールの中間テーブルを介して取得される これも典型的なアンチスリーパラダイムのデータテーブル設計です(どのスリーパラダイムか忘れましたが、スリーパラダイムを厳密に守ってデータテーブルを設計する人はいるのでしょうか?) ?)

 
 

ジャワ

コードをコピーする

package com.it.shiro; ​ import com.it.model.module.Module; import com.it.model.user.User; import com.it.service.module.ModuleService; import com.it.service.user.UserService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; ​ import java.util.List; ​ /** * 自定义Shiro认证和权授的业务逻辑 */ public class AuthReaml extends AuthorizingRealm {    @Autowired    private UserService userService;    @Autowired    private ModuleService moduleService;    /**     * 认证     */    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {        System.out.println("认证");        //1. 将AuthenticationToken接口强转成UsernamePasswordToken实现类并从中获取用户输入的用户名(邮箱)和密码        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;        String username = token.getUsername();        String password = new String(token.getPassword());//char[]->java.lang.String        //2. 根据用户名(邮箱)去数据库中查询用户是否存在,userDB中有密码        User userDB = userService.findByEmail(username);        //3. 如果用户不存在,就返回null        if(userDB == null){            System.out.println("用户不存在");            return null;       }        System.out.println("uid   "+userDB.getUserId());        System.out.println("password   "+userDB.getPassword()); ​        //4. 如果用户存在,就返回AuthenticationInfo接口的SimpleAuthenticationInfo实现类对象,该对象中封装三个信息:        a)认证后的userDB对象        b)认证后的userDB对象封装的数据库密码        c)Realm的别名,可以为""        AuthenticationInfo info = new SimpleAuthenticationInfo(userDB,userDB.getPassword(),"");        //Shiro会在后台对userDB.getPassword()数据库密码和password用户填写的密码在内存中对比        return info;   } ​    /**     * 授权     */    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {        System.out.println("授权");        //1. 使用SecurityUtils获取Subject对象        Subject subject = SecurityUtils.getSubject();        //2. 使用Subject对象获取User对象        User loginUser = (User) subject.getPrincipal();        //3. 根据用户ID查询该用户可以访问的模块,这里的moduleList集合中Module只有模块名name属性        List<Module> moduleList = moduleService.findModuleByUid(loginUser.getUserId()); //       List<Module> moduleList = moduleService.findByUserId(loginUser.getId());        //4. 遍历模块集合,将每一个模块的编号或名称封装到        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();        for (Module module : moduleList) {            //info.addStringPermission("部门管理");            info.addStringPermission(module.getName());       }        //SimpleAuthorizationInfo对象中,以便Shiro内容进行授权控制        //5. 返回SimpleAuthorizationInfo对象        return info;   } ​ ​ }

呼び出しメソッド

 
 

スクス

コードをコピーする

//1.使用SecurityUtils获取subject对象 Subject subject = SecurityUtils.getSubject(); //2.使用AuthenticationToken接口的UsernamePasswordToken实现类封装用户输入的用户名(邮箱)和密码信息 AuthenticationToken token = new UsernamePasswordToken(username,password); //3.调用subject的login()进行认证,底层调用AuthRealm.doGetAuthenticationInfo()认证方法 subject.login(token); //4. 调用subject的getPrincipal()获取认证后的用户,这个userDB就是数据库的密码 User userDB = (User) subject.getPrincipal(); //5. 将用户放入session中 request.getSession().setAttribute("loginUser",userDB);

SpringBootの使い方(インターネットから抜粋)

pom.xml

org.apache.hiro シロスプリング 1.4.1

構成設定

新しい構成パッケージを作成し、ShiroConfig と UserRealm を作成します

 
 

タイプスクリプト

コードをコピーする

@Controller public class ShiroConfig {    //三大核心要素: ​    //ShiroFilterFactoryBean    //第三步:    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();        //设置安全管理器        bean.setSecurityManager(defaultWebSecurityManager);        return bean;   } ​    //DafaultWebSecurityManager    //第二步:    @Bean(name="securityManager")    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();        //关联UserRealm        securityManager.setRealm(userRealm);        return securityManager;   } ​    //创建realm对象,需要自定义类    //第一步:    @Bean    public UserRealm userRealm(){        return new UserRealm();   } }

 
 

スカラ

コードをコピーする

public class UserRealm extends AuthorizingRealm {    //授权    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {        System.out.println("执行了=》授权doGetAuthorizationInfo");        return null;   } ​    //认证    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {        System.out.println("执行了=》认证doGetAuthenticationInfo");        return null;   } }

関連情報

SpringBoot はhiro を統合します

おすすめ

転載: blog.csdn.net/Trouvailless/article/details/132166281