1. 程式人生 > >shiro學習筆記(2)--認證策略

shiro學習筆記(2)--認證策略

一: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