1. 程式人生 > >--Shiro配置檔案ini詳解

--Shiro配置檔案ini詳解

2017年07月09日 18:54:02 lfendo 閱讀數:7563

 https://blog.csdn.net/u011781521/article/details/74892074

一、INI簡介

INI配置檔案是一種key/value的鍵值對配置,提供了分類的概念,每一個類中的key不可重複,#號代表註釋,shiro.ini檔案預設在/WEB-INF/ 或classpath下,shiro會自動查詢,INI配置檔案一般適用於使用者少且不需要在執行時動態建立的情景下使用。

 

1.在web.xml中配置shiro的過濾器

要使用Shiro必須在web.xml中配置shiro,在web.xml 中自定義shiro.ini位置(預設位置)/WEB-INF/shiro.ini or classpath:shiro.ini, 加入以下內容:

 

<filter>

    <filter-name>ShiroFilter</filter-name>

    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>

    <init-param>

        <param-name>configPath</param-name>
    
        <param-value>/WEB-INF/shiro.ini</param-value>

    </init-param>

</filter>

 

 

2.shiro.ini示例

 

 
  1. 使用者

  2. [users]

  3. #使用者zhang的密碼是123,此使用者具有role1和role2兩個角色

  4. zhang=123,role1,role2

  5. wang=123,role2

  6.  
  7. #許可權

  8. [roles]

  9. #角色role1對資源user擁有create、update許可權

  10. role1=user:create,user:update

  11. #角色role2對資源user擁有create、delete許可權

  12. role2=user:create,user:delete

  13. #角色role3對資源user擁有create許可權

  14. role3=user:create

 

ini配置中主要配置有四大類:main,users,roles,urls

 

 
  1. [main]

  2. #提供了對根物件 securityManager 及其依賴的配置

  3. securityManager=org.apache.shiro.mgt.DefaultSecurityManager

  4. …………

  5. securityManager.realms=$jdbcRealm

  6.  
  7. [users]

  8. #提供了對使用者/密碼及其角色的配置,使用者名稱=密碼,角色 1,角色 2

  9. username=password,role1,role2

  10.  
  11.  
  12. [roles]

  13. #提供了角色及許可權之間關係的配置,角色=許可權 1,許可權 2

  14. role1=permission1,permission2

  15.  
  16.  
  17. [urls]

  18. #用於 web,提供了對 web url 攔截相關的配置,url=攔截器[引數],攔截器

  19. /index.html = anon

  20. /admin/** = authc, roles[admin], perms["permission1"]

 

 

1、[main]

 

main主要配置shiro的一些物件,例如securityManager ,Realm,authenticator,authcStrategy 等等,例如

 

 
  1. #宣告一個realm

  2. MyRealm1=com.shiro.mutilrealm.MyRealm1

  3. MyRealm2=com.shiro.mutilrealm.MyRealm2

  4.  
  5. #配置驗證器

  6. authenticator = org.apache.shiro.authc.pam.ModularRealmAuthenticator

  7.  
  8. # AllSuccessfulStrategy 表示 MyRealm1和MyRealm2 認證都通過才算通過

  9. #配置策略

  10. #authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy

  11. authcStrategy = com.shiro.authenticationstrategy.MyAuthenticationStrategy

  12.  
  13.  
  14. #將驗證器和策略關聯起來

  15. authenticator.authenticationStrategy = $authcStrategy

  16.  
  17.  
  18. #配置驗證器所使用的Realm

  19. authenticator.realms=$MyRealm2,$MyRealm1

  20.  
  21. #把Authenticator設定給securityManager

  22. securityManager.authenticator = $authenticator


除了物件之外,也可以使用byte陣列,集合,map等等

例如:

byte陣列
 

authenticator.bytes=0x68656c6c6f69


集合

 
  1. authenticator.array=1,2,3

  2. securityManager.sessionManager.sessionListeners = $sessionListener1,$sessionListener2


map(鍵值對使用冒號來限定 key:value)

authenticator.map=$jdbcRealm:$jdbcRealm,1:1,key:abc


在web應用中,我們可以進行以下配置,表示如果使用者沒有登入進行訪問時,將自動跳轉到/login頁面

authc.loginUrl=/login

 

 

2、[users]

 

[users]允許你配置一組靜態的使用者,包含使用者名稱,密碼,角色,一個使用者可以有多個角色,可以配置多個角色,例如:

 

 

username = password, roleName1, roleName2, …, roleNameN


這裡涉及到密碼,就牽扯到加密的問題,我們可以MD5,Sha1,Sha256等演算法進行加密

 

 

 
  1. [main]

  2.  
  3. #告訴shiro我們用哪個加密演算法

  4. sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher

  5. iniRealm.credentialsMatcher = $sha256Matcher

  6.  
  7. [users]

  8.  
  9. #使用者名稱=密碼,角色

  10. admin=355b1bbfc96725cdce8f4a2708fda310a80e6d13315aec4e5eed2a75fe8032ce,role1


獲取密碼的 hex 加密字串

 

String ss = new Sha256Hash("cc").toHex();

 

 

3、[roles]

 

[roles]將角色和許可權關聯起來,格式為:角色名=許可權字串1,許可權字串2…..,例如

 

 

role1 = printer:create,printer:query


限識別符號號規則:【中間用“:”(半形冒號分隔)】

 

        |---資源:操作【user:create:表示對使用者資源進行create操作】【等價於:user:create:*(對所有的使用者例項進行操作)】
        |---資源:操作:例項【user:create:01:表示對使用者資源的01例項進行create操作】
        |---例子:【user:*:01 表示對使用者資源的01例項進行所有操作】

 

許可權表示的幾種方式:


(1)用簡單的字串來表示一個許可權,如:user (相當於:user:*)


(2)多層次管理

 

2.1 printer:print

 

其中第一部分是許可權被操作的領域(印表機),第二部分是被執行的操作

 

2.2 多個值

 

多個值使用逗號隔開,如role1 = fendo:create,fendo:query 
不一定要xxx:yyyy的形式,也可以直接使用簡單字串

 

2.3 可以使用*號表示所有

 

比如printer:* ,表示你可以對印表機進行任何操作, 
或者使用 *:query ,表示你在任何領域下,都有查詢操作

 

(3)例項級許可權:域:操作:例項


如:user:edit:manager 只能對 user 中的 manager 進行 edit。

萬用字元:user:edit:*、user:*:*、user:*:manager

等價:user:edit==user:edit:*、user == user:*:* 只能從字串結尾處省略。

 

注意:

    如果一個獨立的 permissionDefinition 需要被內部逗號分隔(例如,printer:5thFloor:print,info),則需要使用者雙引號環繞該定義,以避免錯誤解析。  

    如果角色不想關聯許可權,則不需要在 [roles] 部分把它們列出來。只需定義在 [user] 部分中定義角色名就足以建立尚不存在的角色。

    僅定義非空的 [users] 或 [roles] 部分就將自動地觸發org.apache.shiro.realm.text.IniRealm 例項的建立

 

4、[urls]

 

這部分配置主要在web應用中,格式為:url=攔截器[引數],攔截器[引數]……,例如

 

 

 
  1. /login=anon

  2. /unauthorized=anon

  3. /static/**=anon

  4. /authenticated=authc

  5. /role=authc,roles[admin]

  6. /permission=authc,perms["user:create"]

 

說明:

 

 
  1. anon: 表示匿名訪問,即不需要登入就可以訪問,例如/login這個路徑可以匿名訪問

  2. authe: 表示需要登入才能訪問

  3. roles[admin]: 表示有admin這個角色的使用者才能訪問

  4. perms["user:create"]: 表示有這個許可權的才能訪問

 

 

url萬用字元語法:

 

 

 
  1. ?:匹配一個字元

  2. *:匹配零個或多個字元

  3. **:匹配零個或多個路徑


url匹配順序是按照你配置的順序