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