【Shiro】Apache Shiro架构之权限认证(Authorization)

2024-06-22 05:32

本文主要是介绍【Shiro】Apache Shiro架构之权限认证(Authorization),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Shiro系列文章: 
【Shiro】Apache Shiro架构之身份认证(Authentication) 
【Shiro】Apache Shiro架构之集成web 
【Shiro】Apache Shiro架构之自定义realm 
【Shiro】Apache Shiro架构之实际运用(整合到Spring中)

   
  上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权。如下: 
授权 
  本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authorization.html。 
  本文遵循以下流程:先介绍Shiro中的权限认证,再通过一个简单的实例来具体说明一下API的使用(基于maven)。

1. 权限认证的核心要素

  权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。在权限认证中,最核心的三个要素是:权限,角色和用户:

权限(permission):即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利; 
角色(role):指的是用户担任的的角色,一个角色可以有多个权限; 
用户(user):在Shiro 中,代表访问系统的用户,即上一篇博文提到的Subject认证主体。

  它们之间的的关系可以用下图来表示: 
关系
  一个用户可以有多个角色,而不同的角色可以有不同的权限,也可由有相同的权限。比如说现在有三个角色,1是普通角色,2也是普通角色,3是管理员,角色1只能查看信息,角色2只能添加信息,管理员都可以,而且还可以删除信息,类似于这样。

2.1 基于角色的访问控制

  也就是说,授权过程是通过判断角色来完成的,哪个角色可以做这件事,哪些角色可以做这件事等等。它有如下API:

方法 作用
hasRole(String roleName) 判断是否有该角色访问权,返回boolen
hasRoles(List<String> roleNames) 判断是否有这些这些角色访问权,返回boolean[]
hasAllRoles(Collection<String> roleNames) 判断是否有这些这些角色访问权,返回boolean

  对这三个API,做一下简单的说明,第一个很简单,传入一个role即可,判断是否拥有该角色访问权,第二个方法是传入一个role的集合,然后Shiro会根据集合中的每一个role做一下判断,并且将每次的判断结果放到boolean[]数组中,顺序与集合中role的顺序一致;第三个方法也是传入一个role的集合,不同的是,返回boolean类型,必须集合中全部role都有才为true,否则为false。 
  用法如下:

Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {//show the admin button or do administrator's things
} else {//don't show the button?  Grey it out? or others...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  除了这三个API外,Shiro还提供了check的API,与上面不同的是,has-xxx会返回boolean类型的数据,用来判断,而check-xxx不会返回任何东西,如果验证成功就继续处理下面的代码,否则会抛出一个异常,可以用来通过捕获异常来处理。API如下:

方法 作用
checkRole(String roleName) 如果判断失败抛出AuthorizationException异常
checkRoles(String... roleNames) 如果判断失败抛出AuthorizationException异常
checkRoles(Collection<String> roleNames) 如果判断失败抛出AuthorizationException异常

  类似的使用方法如下:

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

2.2 基于权限的访问控制

  基于权限的访问控制和基于角色的访问控制在原理上是一模一样的,只不过API不同而已,我不再做过多的解释,API如下:

方法 作用
isPermitted(String perm) 判断是否有该权限,返回boolen
isPermitted(List<String> perms) 判断是否有这些这些权限,返回boolean[]
isPermittedAll(Collection<String> perms) 判断是否有这些这些权限,返回boolean
checkPermission(String perm) 如果判断失败抛出AuthorizationException异常
checkPermissions(String... perms) 如果判断失败抛出AuthorizationException异常
checkPermissionsAll(Collection<String> perms) 如果判断失败抛出AuthorizationException异常

3. 权限认证示例代码

  不管是身份认证还是权限认证,首先都需要创建SecurityManager工厂,SecurityManager,所以首先新建一个工具类专门做这个事情。

public class ShiroUtil {public static Subject login(String configFile, String username,String password) {// 读取配置文件,初始化SecurityManager工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);// 获取securityManager实例SecurityManager securityManager = factory.getInstance();// 把securityManager实例绑定到SecurityUtilsSecurityUtils.setSecurityManager(securityManager);// 得到当前执行的用户Subject currentUser = SecurityUtils.getSubject();// 创建token令牌,用户名/密码UsernamePasswordToken token = new UsernamePasswordToken(username, password);try{// 身份认证currentUser.login(token);   System.out.println("身份认证成功!");}catch(AuthenticationException e){e.printStackTrace();System.out.println("身份认证失败!");}return currentUser;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

  提供一个静态方法,返回当前用户,在应用程序中我们直接调用这个类中的静态方法即可返回当前认证的用户了。 
  maven中的pom.xml文件内容和上一节一样的,不再赘述。 
  Shiro的配置文件shiro.ini:

#用户,role表示各个角色
[users]
csdn1=123,role1,role2,role3
csdn2=123,role1,role2#定义不同角色都拥有哪些权限
[roles]
role1=user:select
role2=user:add,user:update
role3=user.delete
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

角色认证:

public class RoleTest {@Testpublic void testHasRole() {String configFile = "classpath:shiro.ini";String username = "csdn2";String password = "123";Subject currentUser = ShiroUtil.login(configFile, username, password);//测试hasRoleSystem.out.println(currentUser.hasRole("role2")? "有role2这个角色" : "没有role2这个角色");//测试hasRolesboolean[] results = currentUser.hasRoles(Arrays.asList("role1","role2","role3"));System.out.println(results[0]? "有role1这个角色" : "没有role1这个角色");System.out.println(results[1]? "有role2这个角色" : "没有role2这个角色");System.out.println(results[2]? "有role3这个角色" : "没有role3这个角色");//测试hasAllRoles     System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2","role3")));currentUser.logout();}@Testpublic void testCheckRole() {String configFile = "classpath:shiro.ini";String username = "csdn2";String password = "123";Subject currentUser = ShiroUtil.login(configFile, username, password);//      currentUser.checkRole("role3");//没有返回值。有就不报错,没有就会报错
//      currentUser.checkRoles(Arrays.asList("role1","role2","role3")); //同上currentUser.checkRoles(Arrays.asList("role1","role2")); //同上currentUser.logout();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

  权限认证和角色认证的测试一样的,我就不再赘述了。当然了,这里只是单纯的测试,实际中,认证完了后还要做一些具体的业务逻辑处理。

      本文转自:csdn-博主:eson_15

这篇关于【Shiro】Apache Shiro架构之权限认证(Authorization)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083418

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖:

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激

【系统架构设计师】黑板架构详解

黑板架构(Blackboard Architecture)是一种软件架构模式,它模仿了多个专家系统协作解决问题的场景。在这种架构中,“黑板”作为一个中央知识库,存储了问题的当前状态以及所有的解决方案和部分解决方案。黑板架构特别适合于解决那些没有确定算法、需要多个知识源(或称为“专家”)共同作用才能解决的复杂问题。 一、黑板架构的组成 黑板架构主要由以下几个部分组成: 黑板(Blackboa