Shiro實戰(三)Shiro受權(上)

在上篇Shiro認證原理的最後,咱們介紹了IniRealm是如何進行認證,本篇咱們將介紹Shiro受權過程當中的幾個概念以及Shiro編程式的受權操做,並經過經常使用的用戶、角色、權限受權模式來加深理解受權的過程。apache

1 受權三大要素編程

① Permissions
Permissions是Shiro安全框架中最原子性的元素,它用來描述可以作什麼或者說Subject可以執行什麼樣的操做,好比刪除用戶、查看用戶詳情、查看商品詳情等。segmentfault

② Roles
Roles你們應該都很清楚了,某人具備某個角色,那麼就對應具備怎樣的行爲或責任,也就是一個角色表明一組行爲或責任。好比咱們的後臺管理系統,用戶的角色經常會有超級管理員、普通管理員之分,它們對應的權限是不相同的,通常超級管理員會具備更多的權限。安全

③ 用戶
Users就是咱們以前提到的Shiro三大核心概念之一的Subject。用戶與角色、權限的關係取決於咱們的應用,能夠選擇直接將權限賦給用戶,也能夠選擇將權限賦給角色,而後將角色賦給用戶,本篇咱們將經過後者來說述。bash

1.2 受權常見操做框架

咱們首先來回顧下INI配置文件,看下咱們如何經過INI配置文件指定用戶、角色、權限url

#對象以及對象的屬性,好比SecurityManager、Realms
[main]
#hashedMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
#hashedMatcher.hashAlgorithmName = MD5

#riversRealm = com.rivers.study.RiversRealm
#riversRealm.credentialsMatcher = $hashedMatcher

#securityManager.realms = $riversRealm

#用戶名以及該用戶對應的密碼以及角色
#username = password, role1, role2..., roleN
[users]
rivers = secret, admin
calabash = warrior, guest

#角色以及該角色能夠擁有的權限
#rolename = permission1, permission2..., permissionN
[roles]
admin = UserManagerment:*
guest = UserManagerment:getUserInfo

[urls]

在上面的配置文件中,咱們指定了兩個用戶rivers、calabash,用戶rivers的密碼是secret,具備admin角色,而用戶calabash的密碼是warrior,具備guest角色;角色admin具備UserManagerment:*下的全部操做,而guest只有UserManagerment:getUserInfo權限。code

① 角色判斷對象

那麼咱們如何判斷用戶(Subject)是否具備某種角色或者某些角色呢?Subject提供了hasRole*方法來幫助咱們進行處理。token

Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("calabash", "warrior");
currentUser.login(token);

if (currentUser.hasRole("admin")) {
    logger.info("用戶【" + currentUser.getPrincipal() + "】具備【admin】角色");
}

List<String> roleList = new ArrayList<String>();
roleList.add("admin");
roleList.add("guest");
boolean[] results = currentUser.hasRoles(roleList);
for (int i = 0; i < results.length; i++) {
    String tmp = results[i] ? "具備" : "不具備";
    logger.info("用戶【" + currentUser.getPrincipal() + tmp + "【" + roleList.get(i) + "】角色");
}

另外咱們也能夠經過hasAllRoles(Collection<String> roleNames)來判斷用戶是否具備全部集合中指定的角色,都存在返回true,不然返回false。

若是咱們不想作太多的邏輯處理,用戶存在角色就執行,不存在就直接拋出異常,那麼咱們能夠checkRole*系列方法。

currentUser.checkRole("admin");

② 權限判斷

那麼咱們如何判斷用戶(Subject)是否具備某種權限或者某些權限呢?Subject提供了isPermitted*方法來幫助咱們進行處理。

if (currentUser.isPermitted("UserManagerment:deleteUser")) {
    logger.info("用戶【" + currentUser.getPrincipal() + "】具備【UserManagerment:deleteUser】權限");
}

if (currentUser.isPermitted("UserManagerment:getUserInfo")) { 
    logger.info("用戶【" + currentUser.getPrincipal() + "】具備【UserManagerment:getUserInfo】權限");
}

Shiro還提供了其餘的方法供咱們使用,固然也包括checkPermission*系列,有興趣的朋友能夠去到Subject接口瞭解。

相關文章
相關標籤/搜索