资讯专栏INFORMATION COLUMN

Shiro实战(三)Shiro授权(上)

sushi / 756人阅读

摘要:授权三大要素是安全框架中最原子性的元素,它用来描述能够做什么或者说能够执行什么样的操作,比如删除用户查看用户详情查看商品详情等。用户就是我们之前提到的三大核心概念之一的。

在上篇Shiro认证原理的最后,我们介绍了IniRealm是如何进行认证,本篇我们将介绍Shiro授权过程中的几个概念以及Shiro编程式的授权操作,并通过常用的用户、角色、权限授权模式来加深理解授权的过程。

1 授权三大要素

① Permissions
Permissions是Shiro安全框架中最原子性的元素,它用来描述能够做什么或者说Subject能够执行什么样的操作,比如删除用户、查看用户详情、查看商品详情等。

② Roles
Roles大家应该都很清楚了,某人具有某个角色,那么就对应具有怎样的行为或责任,也就是一个角色代表一组行为或责任。比如我们的后台管理系统,用户的角色常常会有超级管理员、普通管理员之分,它们对应的权限是不相同的,一般超级管理员会具有更多的权限。

③ 用户
Users就是我们之前提到的Shiro三大核心概念之一的Subject。用户与角色、权限的关系取决于我们的应用,可以选择直接将权限赋给用户,也可以选择将权限赋给角色,然后将角色赋给用户,本篇我们将通过后者来讲述。

1.2 授权常见操作

我们首先来回顾下INI配置文件,看下我们如何通过INI配置文件指定用户、角色、权限

#对象以及对象的属性,比如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权限。

① 角色判断

那么我们如何判断用户(Subject)是否具有某种角色或者某些角色呢?Subject提供了hasRole*方法来帮助我们进行处理。

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

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

List roleList = new ArrayList();
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 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接口了解。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67465.html

相关文章

  • Shiro实战(一) Shiro核心概念

    摘要:是什么是功能强大简单易用的安全框架,核心功能包括认证授权加密以及管理。的主要作用就是用来执行认证和授权的逻辑,它其实就相当于与安全数据用户账号密码角色权限之间进行交互的桥梁。至此,的三个核心概念已经介绍完毕。 1、Shiro是什么 Shiro是功能强大、简单易用的Java安全框架,核心功能包括:认证、授权、加密以及Session管理。Shiro的应用范围很广泛,小型移动端应用、大型We...

    mdluo 评论0 收藏0
  • Shiro实战(二)Shiro认证原理

    摘要:认证原理与认证就是进行身份确认的过程,也就是用户对应中的需要提供证明来证实自己的身份。是的顶级抽象实现类,主要用于处理认证操作,至于授权等操作则交由该类的子类去处理。至此,认证的整体过程与底层逻辑已经全部介绍完毕。 在上篇Shiro核心概念中,我们介绍了Shiro的三大核心概念:Subject、SecurityManager、Realms,并通过示例代码QuickStart展示常用的认...

    Channe 评论0 收藏0
  • Spring Security

    摘要:框架具有轻便,开源的优点,所以本译见构建用户管理微服务五使用令牌和来实现身份验证往期译见系列文章在账号分享中持续连载,敬请查看在往期译见系列的文章中,我们已经建立了业务逻辑数据访问层和前端控制器但是忽略了对身份进行验证。 重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 评论0 收藏0
  • Shiro授权、整合Spirng、Shiro过滤器】

    摘要:表示对用户资源进行操作,相当于,对所有用户资源实例进行操作。与整合,实际上的操作都是通过过滤器来干的。将安全管理器交由工厂来进行管理。在过滤器链中设置静态资源不拦截。 前言 本文主要讲解的知识点有以下: Shiro授权的方式简单介绍 与Spring整合 初始Shiro过滤器 一、Shiro授权 上一篇我们已经讲解了Shiro的认证相关的知识了,现在我们来弄Shiro的授权 Shir...

    ralap 评论0 收藏0
  • web开发安全框架中的Apache Shiro的应用

    摘要:安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证授权加密和会话管理等功能。本质上是一个特定安全的。当配置时,必须指定至少一个用来进行身份验证和或授权。提供了多种可用的来获取安全相关的数据。 web开发安全框架中的Apache Shiro的应用前阶段就hadoop的分享了一些内容,希望对新手入门的朋友有点帮助吧!对于hadoop新手入门的,还是比较推荐大快搜索...

    2json 评论0 收藏0

发表评论

0条评论

sushi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<