瞭解Shiro
一Apache Shiro做用
Apache Shiro是一個功能強大且易於使用的Java安全框架,可執行身份驗證,受權,加密和會話管理,令行應用程序。java
Shiro提供了應用程序安全API來執行如下幾個方面(我喜歡稱這些爲應用程序安全的四個基石):web
(1)身份驗證 - 驗證用戶身份,一般稱爲用戶「登陸」。數據庫
(2)受權 - 訪問控制apache
(3)加密 - 保護或隱藏窺探數據緩存
(4)會話管理 - 即用戶登陸後就是一次會話,在沒有退出以前,它的全部信息都在會話中;
安全
2、shiro架構
(1) Subject
Subject:主體,用來與用戶交互的對象。好比認證用戶信息, subject.login(用戶信息)。再好比,判斷用戶是否有相關的角色 subject.hasRole("小學生");
Subject實例都綁定到(而且 須要)SecurityManager。當你與Subject進行交互時,這些交互轉化爲與SecurityManager的交互。session
(2) SecurityManager
SecurityManager即安全管理器,對所有的subject進行安全管理,它是shiro的核心,負責對全部的subject進行安全管理。經過SecurityManager能夠完成subject的認證、受權等,實質上SecurityManager是經過Authenticator進行認證,經過Authorizer進行受權,經過SessionManager進行會話管理等架構
(3) Authenticator
Authenticator即認證器,對用戶身份進行認證,Authenticator是一個接口,shiro提供ModularRealmAuthenticator實現類,經過ModularRealmAuthenticator基本上能夠知足大多數需求,也能夠自定義認證器。框架
(4) Authorizer
Authorizer即受權器,用戶經過認證器認證經過,在訪問功能時須要經過受權器判斷用戶是否有此功能的操做權限。分佈式
(5) Realm
Realm即領域,至關於datasource數據源,securityManager進行安全認證須要經過Realm獲取用戶權限數據,好比:若是用戶身份數據在數據庫那麼realm就須要從數據庫獲取用戶身份信息。
注意:不要把realm理解成只是從數據源取數據,在realm中還有認證受權校驗的相關的代碼。
(6) SessionManager
sessionManager即會話管理,shiro框架定義了一套會話管理,它不依賴web容器的session,因此shiro可使用在非web應用上,也能夠將分佈式應用的會話集中在一點管理,此特性可以使它實現單點登陸。
(7) SessionDAO
SessionDAO即會話dao,是對session會話操做的一套接口,好比要將session存儲到數據庫,能夠經過jdbc將會話存儲到數據庫。
(8) CacheManager
CacheManager即緩存管理,將用戶權限數據存儲在緩存,這樣能夠提升性能。
(9) Cryptography
Cryptography即密碼管理,shiro提供了一套加密/解密的組件,方便開發。好比提供經常使用的散列、加/解密等功能。
代碼示例
public class MyFirstTest { @Test public void test1() { //加載配置文件,並獲取工廠,這個SecurityManager當心與java.lang包下的SecurityManager衝突 Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro_1.ini"); //獲取安全管理者實例 org.apache.shiro.mgt.SecurityManager sm = factory.getInstance(); //將安全管理者放入全局對象 SecurityUtils.setSecurityManager(sm); //全局對象經過安全管理者生成Subject對象 Subject subject = SecurityUtils.getSubject(); //封裝用戶的數據 UsernamePasswordToken token = new UsernamePasswordToken("jay", "123"); //將用戶的數據token 最終傳遞到Realm中進行對比 subject.login(token); //判斷本賬號是否已經被認證 Assert.assertEquals(true, subject.isAuthenticated()); } }
shiro_1.ini配置文件內容以下,它就是數據源Realm。之後的章節數據源Realm將是JdbcRealm,數據將會被存放到數據庫中
[users] jay=123
3、過濾器
當 Shiro 被運用到 web 項目時,Shiro 會自動建立一些默認的過濾器對客戶端請求進行過濾。如下是 Shiro 提供的過濾器:
過濾器簡稱 |
對應的 Java 類 |
---|---|
anon | org.apache.shiro.web.filter.authc.AnonymousFilter |
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | org.apache.shiro.web.filter.authz.PortFilter |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl | org.apache.shiro.web.filter.authz.SslFilter |
user | org.apache.shiro.web.filter.authc.UserFilter |
logout | org.apache.shiro.web.filter.authc.LogoutFilter |
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter |
解釋:
/admins/**=anon # 表示該 uri 能夠匿名訪問 /admins/**=auth # 表示該 uri 須要認證才能訪問 /admins/**=authcBasic # 表示該 uri 須要 httpBasic 認證 /admins/**=perms[user:add:*] # 表示該 uri 須要認證用戶擁有 user:add:* 權限才能訪問 /admins/**=port[8081] # 表示該 uri 須要使用 8081 端口 /admins/**=rest[user] # 至關於 /admins/**=perms[user:method],其中,method 表示 get、post、delete 等 /admins/**=roles[admin] # 表示該 uri 須要認證用戶擁有 admin 角色才能訪問 /admins/**=ssl # 表示該 uri 須要使用 https 協議 /admins/**=user # 表示該 uri 須要認證或經過記住我認證才能訪問 /logout=logout # 表示註銷,能夠看成固定配置
注意:
anon,authcBasic,auchc,user 是認證過濾器。
perms,roles,ssl,rest,port 是受權過濾器。
想太多,作太少,中間的落差就是煩惱。想沒有煩惱,要麼別想,要麼多作。少校【4】