【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

相关文章

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

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 作为一个分布式的虚拟