在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成功,認證視為成功 |