1. 程式人生 > >(1)shiro簡介和第一個demo

(1)shiro簡介和第一個demo

之前一直在用shiro開發,不過只是會使用,並沒有深入瞭解,最近有時間學習了一下,把最近學習所得分享一下。

 shiro簡介

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。使用Shiro的易於理解的API,您可以快速、輕鬆地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式,

相比於spring security更加的簡潔和使用方便了。

三個核心元件

元件看不懂可以先把demo跑起來,然後回頭再看,慢慢的體會就明白了。

Subject:代表了當前訪問系統的使用者,不一定是人,也可以是爬蟲等其他東西。

SecurityManager:安全管理器,是shiro框架的核心。管理者subject,session等。

Realms:可以看成是一個許可權的資料來源,使用者登入認證和授權都是通過realm來進行的,可以設定多個realm。

第一個demo

新增pom檔案

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.2.2</version>
</dependency>

在classpath下新增一個shiro.ini檔案。檔案內容如下:(意思就是在這個系統中存在zhang這個使用者,密碼是123,後期會用儲存在資料庫中的賬戶密碼,這裡方便測試和講解。。)

[users]
zhang=123

測試程式碼:

        Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");
        //得到安全管理器
        SecurityManager securityManager = factory.getInstance();

        SecurityUtils.setSecurityManager(securityManager);

        Subject subject 
= SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); } System.out.println(subject.isAuthenticated()); subject.logout(); System.out.println(subject.isAuthenticated());

最後輸出

truefalse。

1首先通過IniSecurityManagerFactory和shiro.ini檔案生成一個SecurityManager工廠。

2獲得該工廠的例項並託管給SecurityUtils這個類,其實就是放在了SecurityUtils這個類的一個static變數中,下面操作的底層還是SecurityManager裡面的方法。

3通過SecurityUtils得到一個主體物件,此時這個物件裡面是沒有資料的,也沒有通過認證和授權,在SecurityUtils.getSubject獲取的同時將當這個subject繫結到了當前執行緒裡面。(如果你再getSubject也是該subject)

4建立一個token繫結使用者名稱和密碼。然後呼叫subject.login進行登入(其實就是呼叫了SecurityManager進行認證和授權)

shiro核心架構圖:

Authentication身份認證,通常用於校驗密碼等操作。

Authorization授權,許可權驗證,校驗使用者是否擁有某種角色,或者某種更細的資源。

建立SecurityManager步驟

我們建立Security物件在java環境下建立了DefalutSecurityManager,它預設繼承了AuthenticatingSecurityManager(認證器管理器),AuthorizingSecurityManager(授權器管理器)。

這兩個管理器分別持有Authenticator(認證器)和Authorizer(授權器)兩個變數。(這裡只貼圖一張,還有一個可以看看原始碼)

這兩個在java環境下的實現類分別是,ModularRealmAuthenticator(預設認證器)和ModularRealmAuthorizer(預設授權器)

並且在讀取shiro.ini檔案後預設建立了IniRealm物件,注入到上面的認證器和授權器中。(授權器也有個realms物件,realms存放著賬號密碼,對應的許可權等資訊)

最後建立了一個SecurityManager物件。

在呼叫subject.login(token);方法時候。會最終呼叫這個安全管理器的認證器對應的方法。

登入的時候如果賬號密碼異常,會丟擲對應的異常。(這裡還綁定了session,shiro的session和web中的session是兩個概念,後面介紹)

到這裡這個zhang的subject就登入成功了。