⑥【Shiro】使多个自定义Realm规则生效。

2024-04-25 20:22:42 浏览数 (2)

⑥【Shiro】Shiro中,如何使多个自定义Realm规则生效?
  • 多个Realm实现原理
  • Shiro配置类,使多个Realm生效

多个Realm实现原理

  • 当应用程序配置多个 Realm 时,例如:用户名密码校验、手机号验证码校验等等。Shiro 的 ModularRealmAuthenticator 会使用内部的 AuthenticationStrategy 组件判断认证是成功还是失败。
  • AuthenticationStrategy 是一个无状态的组件,它在身份验证尝试中被询问 4 次(这4 次交互所需的任何必要的状态将被作为方法参数):
    • (1)在所有 Realm 被调用之前
    • (2)在调用 Realm 的 getAuthenticationInfo 方法之前
    • (3)在调用 Realm 的 getAuthenticationInfo 方法之后
    • (4)在所有 Realm 被调用之后
  • 认证策略的另外一项工作就是聚合所有 Realm 的结果信息封装至一个AuthenticationInfo 实例中,并将此信息返回,以此作为 Subject 的身份信息

Shiro中的三种认证策略

  • AtLeastOneSuccessfulStrategy:只要有一个(或更多)的 Realm 验证成功,那么认证将视为成功
  • FirstSuccessfulStrategy:第一个 Realm 验证成功,整体认证将视为成功,且后续 Realm 将被忽略
  • AllSuccessfulStrategy:所有 Realm 成功,认证才视为成功

ModularRealmAuthenticator类 内置的认证策略默认实现是 AtLeastOneSuccessfulStrategy 方式 可以通过配置修改策略。

Shiro配置类,使多个Realm生效

代码语言:javascript复制
/**
 * @author .29.
 * @create 2024-03-17 11:14
 */
@Configuration
public class ShiroConfig {
    @Autowired
    private MyRealm myRealm;

    //配置SecurityManager
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(){
        //1. 创建DefaultWebSecurityManager对象(安全管理器)
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //2. 创建认证对象
        ModularRealmAuthenticator modularRealmAuthenticator = new ModularRealmAuthenticator();
        //3. 设置认证策略为AllSuccessfulStrategy
        modularRealmAuthenticator.setAuthenticationStrategy(new AllSuccessfulStrategy());
        //4. 将设置了认证策略的认证对象存入安全管理器
        defaultWebSecurityManager.setAuthenticator(modularRealmAuthenticator);
        //5. 封装Realm集合,存入多个自定义Realm
        ArrayList<Realm> realms = new ArrayList<>();
        realms.add(myRealm1);
        realms.add(myRealm2);
        realms.add(myRealm3);
        //6.realm集合存入安全管理器
        defaultWebSecurityManager.setRealms(realms);
        //7.返回安全管理器
        return defaultWebSecurityManager; 
    }

}

0 人点赞