(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就登入成功了。