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接口了解。

相关文章
相关标签/搜索