【shiro】(3)---瞭解Shiro

瞭解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】

相關文章
相關標籤/搜索