Shiro的第一個例子(模擬登陸)及其詳細流程(一)

項目結構:

1)引入需要的jar包

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.3</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.2.2</version>
    </dependency>

2)因爲不連接數據庫,所以創建個shiro.ini文件模擬用戶記錄

[users]
#模擬數據庫用戶列表,賬號=密碼
zhangsan=666
lisi=888

3)執行shiro登錄登出操作

public class ShiroTest {
    public static void main(String[] args) {
        //1.創建SecurityManager工廠對象,並加載配置文件
        Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");
        //2.通過工廠對象,創建SecurityManager對象
        SecurityManager securityManager =factory.getInstance();
        //3.講SecurityManager綁定到當前運行環境中,讓系統隨時隨地都可以訪問securitymanager對象
        SecurityUtils.setSecurityManager(securityManager);
        //4.創建當前登錄主體,注意,此時主體沒有經過認證
        Subject subject =SecurityUtils.getSubject();

        //5.收集主體登陸的身份/憑着,即賬號密碼
        UsernamePasswordToken token =new UsernamePasswordToken("zhangsan","666");

        try {
            //6.主體登陸,如果賬號或者密碼其中一個錯誤,則拋出異常
            subject.login(token);
        }catch (Exception e){

        }
        //7.判斷是否成功
        System.out.println("登陸是否成功"+subject.isAuthenticated());

        //8.登出(註銷)
        subject.logout();
        System.out.println("登陸是否成功"+subject.isAuthenticated());
    }
}

控制檯輸出:

注意:登陸失敗即會拋出異常

詳細流程:

1、調用subject.login方法進行登錄,其會自動委託給securityManager.login方法進行登錄;
2、securityManager通過Authenticator(認證器)進行認證;
3、Authenticator的實現ModularRealmAuthenticator調用realm從ini配置文件取用戶真實的賬號和密碼,這裏使用的是IniRealm(shiro自帶,相當於數據源);
4、IniRealm先根據token中的賬號去ini中找該賬號,如果找不到則給ModularRealmAuthenticator返回null,如果找到則匹配密碼,匹配密碼成功則認證通過。
5、最後調用Subject.logout進行退出操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章