【Shiro】5.多個Realm的使用和實現

陆陆无为而治者發表於2024-10-14

在Realm的使用中,可能使用多個Realm。比如,支援賬號、密碼登入;支援手機號驗證碼登入;支援微信登入等。

1. 建立多個自定義Realm

建立多個自定義的Realm,分別處理不同型別的認證和授權邏輯。

public class CustomRealm1 extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 實現Realm1的授權邏輯
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 實現Realm1的認證邏輯
    }
}

public class CustomRealm2 extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 實現Realm2的授權邏輯
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 實現Realm2的認證邏輯
    }
}

2. 配置Shiro

在Shiro配置類中配置多個Realm,並指定認證策略。

 1 @Configuration
 2 public class ShiroConfig {
 3 
 4     @Bean
 5     public SecurityManager securityManager(CustomRealm1 customRealm1, CustomRealm2 customRealm2) {
 6         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
 7         List<Realm> realms = new ArrayList<>();
 8         realms.add(customRealm1);
 9         realms.add(customRealm2);
10         securityManager.setRealms(realms);
11 
12         // 設定認證策略,這裡使用AtLeastOneSuccessfulStrategy,只要一個Realm驗證成功即可
13         ModularityRealmAuthenticator authenticator = new ModularityRealmAuthenticator();
14         authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
15         securityManager.setAuthenticator(authenticator);
16 
17         return securityManager;
18     }
19 
20     @Bean
21     public CustomRealm1 customRealm1() {
22         return new CustomRealm1();
23     }
24 
25     @Bean
26     public CustomRealm2 customRealm2() {
27         return new CustomRealm2();
28     }
29 }

在上述程式碼中,建立了兩個自定義的Realm:CustomRealm1和CustomRealm2,並在Shiro配置類中配置了這兩個Realm。透過設定SecurityManager的Realms屬性,可以指定多個Realm來處理認證和授權操作。同時,還設定了認證策略為AtLeastOneSuccessfulStrategy,表示只要一個Realm驗證成功即可認證透過。
認證策略包括3種:

認證方式 描述
AtLeastOneSuccessfulStrategy
只要有一個Realm認證成功,那麼認證將視為成功
FirstSuccessfulStrategy
第一個Realm認證成功,整體認證將視為成功,且後續ReaLm被忽略
AllSuccessfulStrategy
所有Realm成功,認證視為成功

相關文章