Shiro學習筆記(2)-Shiro配置

前言

本文具體解析Shiro的配置機制,主要分爲如下兩部分:編碼式配置和INI文件配置。

編碼式配置

通過編碼方式配置比較簡單,但是可重用性低,現實使用中用的不是很多,這邊給一個簡單示例

     //獲取Realm對象
     Realm realm = ...
     //創建SecurityManager對象
     SecurityManager securityManager = new DefaultSecurityManager(realm);
     
     //設置組件 如SessionDAO 
     SessionDAO sessionDAO = new CustomSessionDAO();
     ((DefaultSessionManager)securityManager.getSessionManager()).setSessionDAO(sessionDAO);
     
     //設置SecurityManager全局獲取
     SecurityUtils.setSecurityManager(securityManager);
     

INI文件配置

INI配置可以使用文件的方式進行配置也可以使用代碼的方式進行配置,具體如下:

通過INI對象進行配置

這種方式用代碼的方式代替配置文件的編寫,效果等同。

 Ini ini = new Ini();
 ini.setSectionProperty(...);

通過Resource配置

這種方式用配置文件進行配置,和Ini效果配置等同。

    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    SecurityManager securityManager = factory.getInstance();
    SecurityUtils.setSecurityManager(securityManager);

具體部分


[main]
# 此部分用來定義SecurityManager, Realms以及任何需要組成SecurityManager的組件都定義在這個部分

[users]
# 用來定義少量的用戶賬號

[roles]
# 用來定義少量的角色

[urls]
用來對web應用的url進行過濾配置

下面分別講解各部分具體的配置:

[main]

案例如下:

[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher

# 實例化一個MyRealm並且名字爲myRealm
myRealm = com.mamba.MyRealm

# 自定義了兩個屬性,會被賦值給myRealm對象
myRealm.username = jsmith
myRealm.password = secret

# 引用屬性
myRealm.credentialsMatcher = $sha256Matcher

# 嵌套賦值
securityManager.sessionManager.globalSessionTimeout = 1800000

注意:ini配置文件支持數據類型

  • 嵌套類型
    例子是將securityManager這個對象的嵌套對象sessionManager的globalSessionTimeout變量進行了賦值
    securityManager.sessionManager.globalSessionTimeout = 1800000
  • 集合
    securityManager.sessionManager.sessionListeners = $sessionListener1, $sessionListener2

  • map
    object1 = com.company.some.Class
    object2 = com.company.another.Class
    ...
    anObject = some.class.with.a.Map.property
    
    anObject.mapProperty = key1:$object1, key2:$object2

[users]

正如上面所說的,該部分是用來定義一組靜態的用戶賬號,這適用某些特定賬號的定義(例如一些特定權限的賬號)。

# 語法: =左邊代表的是username(必填),=右邊第一個值代表的是密碼(必填),往後用,隔開的值代表的是對應的角色(選填)。
[users]
admin = 123
lonestarr = 123, consumer, manager
darkhelmet = 123, consumer, boss

對密碼進行加密
需要在main指定加密方式,然後將密碼賦值成加密後的值

[main]
...
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
...
iniRealm.credentialsMatcher = $sha256Matcher
...

[users]
# user1 = sha256-hashed-hex-encoded password, role1, role2, ...
user1 = 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b, role1, role2, ...

[roles]

這部分用來定義具體角色說具有的權限

  # 通過*可以代表admin具有所有的權限
  admin=*
  # 賦予lonestarr這個角色sendInfo權限
  lonestarr=sendInfo
  # 賦予lonestarr這個角色message下的sendInfo權限(通過:分隔)
  lonestarr=message:sendInfo
  # 賦予darkhelmet這個角色對id爲1和2 message進行sendInfo的權限(實體:權限:實體id) 注意用"包裝起來
  darkhelmet="message:sendInfo:1,2"  

後面在Permission的部分還會詳細介紹權限相關的配置

[urls]

這部分主要是針對Web應用,對指定的url進行過濾和攔截。具體會在整合web章節進行詳細講解。

總結

通過本片文章比較直觀的瞭解了Shiro的配置過程,並且配置的主要機制進行了講解。接下來就是Shiro的核心內容認證和授權,下篇開始會進行詳細講解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章