shiro學習筆記(2)--認證策略
阿新 • • 發佈:2018-11-14
一:shiro認證策略
1、三種認證策略的實現,可根據需要選擇
2、認證策略配置在ModularRealmAuthenticator中;我畫了一個簡單的流程圖,粗淺理解一下
說明:
(1)subject通過實現類DelegatingSubject呼叫login()方法;
(2)委託SecurityManager處理,安全管理器呼叫底層實現DefaultSecurityManager的login()方法;
(3)DefaultSecurityManager實際呼叫AuthenticatingSecurityManager的authenticate(AuthenticationToken token)方法;
(4)從圖中看出繼承關係,在RealmSecurityManager中注入Realm,在AuthenticatingSecurityManager中注入認證器實現類ModularRealmAuthenticator
(5)認證器實現類ModularRealmAuthenticator中注入認證策略AuthenticationStrategy型別實現
二:程式碼實現
1、main方法
public static void main(String[] args) { Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/shiro3.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); try { UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("ke", "123654"); subject.login(usernamePasswordToken); if (subject.isAuthenticated()) { System.out.println("認證成功"); String s = (String)subject.getPrincipal(); System.out.println(s); } }catch (Exception e){ System.out.println("認證失敗"); e.printStackTrace(); } }
2、ini配置
說明:注入實際呼叫set()方法,為此必須有set方法才能注入
1、配置dataSource並注入到Realm中
2、配置Relam並注入到SecurityManager中
3、配置策略authenticationStrategy並注入到SecurityManager中
4、配置多個Realm時,注入的是Realms
#shiro 認證策略demo #注入的物件名稱要有對應的set方法。 [main] #配置資料來源 dataSource=org.apache.commons.dbcp.BasicDataSource dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://127.0.0.1:3306/shiro dataSource.username=root dataSource.password=123456 dataSource1=org.apache.commons.dbcp.BasicDataSource dataSource1.driverClassName=com.mysql.jdbc.Driver dataSource1.url=jdbc:mysql://127.0.0.1:3306/test1 dataSource1.username=root dataSource1.password=123456 #配置realm $表示引用物件 jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm.dataSource=$dataSource jdbcRealm1=org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm1.dataSource=$dataSource1 #配置認證策略 #authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy #authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy #配置securityManager securityManager.realms=$jdbcRealm,$jdbcRealm1 securityManager.authenticator.authenticationStrategy=$authenticationStrategy