標籤:return 密碼 傳回值 綜合 miss 建立 pre 功能 怎樣
前言
圖片描述(最多50字)
前面說到如何使用INI檔案進行登入認證,但是這一篇部落客要講的是Shiro的另外一個重要功能就是授權操作,這裡簡單說明一下,授權操作就是來定義合法使用者的許可權操作.這一篇我們仍然使用INI檔案的形式,看一下,我們如何來進行授權操作.
RBAC簡單闡述
基於角色的許可權存取控制(Role-Based Access Control)作為傳統存取控制(自主訪問,強制訪問)的有前景的代替受到廣泛的關注。在RBAC中,許可權與角色相關聯,使用者通過成為適當角色的成員而得到這些角色的許可權。這就極大地簡化了許可權的管理。在一個組織中,角色是為了完成各種工作而創造,使用者則依據它的責任和資格來被指派相應的角色,使用者可以很容易地從一個角色被指派到另一個角色。角色可依新的需求和系統的合并而賦予新的許可權,而許可權也可根據需要而從某角色中回收。角色與角色的關係可以建立起來以囊括更廣泛的客觀情況。(選自百度百科.)
上面所說的可以用一句話來簡單闡述什麼樣的使用者是怎樣的角色.擁有什麼的許可權.在Shiro的授權方面就是遵循這一規則.下面我們就基於前面的一篇部落格Shiro認證篇來編寫我們的授權碼.來看一下使用INI檔案如何?使用者授權的.
編寫INI檔案,實現授權
上一篇部落格中我們的INI檔案,定義了使用者名稱稱以及密碼,如下所示.
[users]
root=123456
admin=admin
下面我們來分不同情況說一下我們如何給使用者添加角色和許可權.
最常見的就是某個使用者擁有一個角色和一種許可權,假設root是role1角色.擁有許可權permission1.那麼,在INI檔案中我們首先要編寫[roles]標籤,和[users]標籤類似.然後我們添加使用者的角色以及標籤,代碼如下所示.
[users]
root=123456,role1
[roles]
roles = permission1
那麼,一個使用者是否可以擁有多個角色和多個許可權呢?答案是肯定的,下面我就直接舉例說明了,假設admin使用者是role1,role2角色.同時,role2角色擁有permission2和permission3的許可權,那麼綜合第一種情況,我們就可以如下編寫代碼.
[users]
root=123456,role1
admin=admin,role1,role2
[roles]
role1 = permission1
role2 = permission2,permission3
查詢使用者是否擁有角色
上面我們編寫了什麼樣的使用者對應什麼樣的角色和許可權(其實已經完成了授權的操作),下面我們來看一下如何查詢某個使用者是否擁有某個角色.當然了,這個操作必須要在使用者已經登入認證完成之後才能進行操作.我們首先把我們所需要的三個認證方法.具體方法和使用情景如下所示.
hasRole用於單一角色判斷,參數為角色名稱,傳回值類型是布爾值.true表示擁有該角色,false表示未擁有該角色.
boolean hasRole(String var1);
hasAllRoles用於判斷是否擁有某些角色,參數為角色數組,傳回值類型是布爾值.true表示全部擁有,false表示未全部擁有.
boolean hasAllRoles(Collection<String> var1);
hasRoles用於判斷是否擁有某些角色,,參數為角色數組,傳回值是布爾值的數組.
boolean[] hasRoles(List<String> var1);
現在我們就接著上一篇文章中的MyShiro來進行一下邏輯代碼的編寫,MyShiro中的原始代碼如下所示.
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;br/>@Component
public Map<String,Object> userLoginAction (String userName,String passWord){
Map<String,Object> resultMap = new HashMap<>();
//初始化SecurityManager對象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//通過SecurityManager工廠對象,擷取SecurityManager執行個體對象.
SecurityManager securityManager = factory.getInstance();
// 把 securityManager 執行個體 綁定到 SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//組建Subject主體.
Subject subject = SecurityUtils.getSubject();
//建立 token 令×××
UsernamePasswordToken token = new UsernamePasswordToken(userName,passWord);
//使用者登入操作.
try{
subject.login(token);
resultMap.put("code","200");
resultMap.put("msg","使用者登入成功");
}catch (AuthenticationException e){
//登入失敗原因 1 使用者不存在 2 使用者密碼不正確
resultMap.put("code","-1");
resultMap.put("msg","使用者登入失敗");
}
return resultMap;
}
}
由於,使用者必須通過認證操作,所以在登入失敗的情況下我們無法進行角色的判斷.我們只能在使用者登入成功的情況下進行角色是否含有的操作.所以我們就只在try成功的情況下進行驗證操作.如所示.
圖片描述(最多50字)
代碼比較簡單,我就直接把三個方法直接使用進行代碼的編寫.如下所示.
//使用者登入操作. try{ subject.login(token); resultMap.put("code","200"); resultMap.put("msg","使用者登入成功"); if (subject.hasRole("role1")){ resultMap.put("roleMsg1","使用者擁有角色1"); }else { resultMap.put("roleMsg1","使用者未擁有角色1"); } if (subject.hasAllRoles(Arrays.asList("role1","role2"))){ resultMap.put("roleMsg2","使用者同時擁有角色1和角色2"); }else { resultMap.put("roleMsg2","使用者未同時擁有角色1和角色2"); } //這裡就不返回第三種方法了,直接列印了 System.out.println(Arrays.asList(subject.hasRoles(Arrays.asList("role1","role2")))); }catch (AuthenticationException e){ //登入失敗原因 1 使用者不存在 2 使用者密碼不正確 resultMap.put("code","-1"); resultMap.put("msg","使用者登入失敗"); }
我們啟動下程式,然後使用介面登入一下查看是否正確.驗證結果如下所示.
使用者 root
圖片描述(最多50字)
使用者 admin
圖片描述(最多50字)
查詢使用者是否擁有許可權
查詢使用者是否含有某種許可權的大致過程和使用者是否含有某種角色的大致過程是大體相同的.方法如下所示.
boolean isPermitted(String var1);
boolean isPermittedAll(String... var1);
boolean[] isPermitted(String... var1);
具體實現代碼如下所示.
if (subject.isPermitted("permission1")){ resultMap.put("PermittedMsg1","使用者擁有許可權1"); }else { resultMap.put("PermittedMsg1","使用者未擁有許可權1"); } if (subject.isPermittedAll("permission2","permission3")){ resultMap.put("PermittedMsg2","使用者同時擁有許可權1和許可權2"); }else { resultMap.put("PermittedMsg2","使用者未同時擁有許可權1和許可權2"); }
接下來我們依然驗證正確性,然後使用介面登入一下查看是否正確.驗證結果如下所示.
使用者 root
圖片描述(最多50字)
使用者 admin
圖片描述(最多50字)
結語
本篇整合Shiro之INI授權篇到此就結束了,這裡做一個簡單的總結,使用INI檔案的方式雖然簡單,但是由於使用硬式編碼方式,所以可維護性比較差,大家酌情使用! 好了,今天就到這裡了.如果有任何問題歡迎在評論區留言.希望大家繼續關注.謝謝嘍~
SpringBoot:整合Shiro之INI授權篇