Spring Security 中的四种权限控制方式

news2024/11/27 16:34:15

Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Security 提供的方式做授权,也可以自定义授权逻辑。一句话,你想怎么玩都可以!

Spring Security 中四种常见的权限控制方式。

  • 表达式控制 URL 路径权限
  • 表达式控制方法权限
  • 使用过滤注解
  • 动态权限

表达式控制 URL 路径权限

Spring Security 支持在 URL 和方法权限控制时使用 SpEL 表达式,如果表达式返回值为 true 则表示需要对应的权限,否则表示不需要对应的权限。提供表达式的类是 SecurityExpressionRoot:
在这里插入图片描述

使用案例

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("admin")
            .antMatchers("/user/**").hasAnyRole("admin", "user")
            .anyRequest().authenticated()
            .and()
            ...
}

这里表示访问 /admin/** 格式的路径需要 admin 角色,访问 /user/** 格式的路径需要 admin 或者 user 角色。

表达式控制方法权限

在方法上添加注解控制权限,需要我们首先开启注解的使用,在 Spring Security 配置类上添加如下内容:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
    ...
}

这个配置开启了三个注解,分别是:

  • @PreAuthorize:方法执行前进行权限检查
  • @PostAuthorize:方法执行后进行权限检查
  • @Secured:类似于 @PreAuthorize

使用案例

@Service
public class HelloService {
    @PreAuthorize("principal.username.equals('chenfu')")
    public String hello() {
        return "hello";
    }

    @PreAuthorize("hasRole('admin')")
    public String admin() {
        return "admin";
    }

    @PostMapping
    @ApiOperation(value = "等级变更记录分页列表")
    @PreAuthorize("@ato.hasAuthority('msg')")
    public String customer(String msg) {
        return "customer:" + msg;
    }
}

@Slf4j
@Component("ato")
public class AuthorityService {
	/**
	 * 判断接口是否有ato:xxxxx,xxxxx权限
	 *
	 * @param permissions 权限标识
	 * @return {boolean}
	 */
	public boolean hasAuthority(String... permissions) {
		if (ArrayUtil.isEmpty(permissions)) {
			return false;
		}
		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
		if (authentication == null) {
			return false;
		}
		Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
		return authorities.stream()
			.map(GrantedAuthority::getAuthority)
			.filter(StringUtils::hasText)
			.anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x));
	}
}

  1. 第一个 hello 方法,注解的约束是,只有当前登录用户名为 chenfu 的用户才可以访问该方法。
  2. 第二个 admin 方法,表示访问该方法的用户必须具备 admin 角色。
  3. 第三个 customer 方法,使用自定义类处理逻辑,校验登录用户是否具备接口权限

缺省对象除了 principal ,还有 authentication

使用过滤注解

Spring Security 中还有两个过滤函数 @PreFilter 和 @PostFilter,可以根据给出的条件,自动移除集合中的元素。

@PostFilter("filterObject.lastIndexOf('2')!=-1")
public List<String> getAllUser() {
    List<String> users = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        users.add("chenfu:" + i);
    }
    return users;
}

@PreFilter(filterTarget = "ages",value = "filterObject%2==0")
public void getAllAge(List<Integer> ages,List<String> users) {
    System.out.println("ages = " + ages);
    System.out.println("users = " + users);
}
  • 在 getAllUser 方法中,对集合进行过滤,只返回后缀为 2 的元素,filterObject 表示要过滤的元素对象。
  • 在 getAllAge 方法中,由于有两个集合,因此使用 filterTarget 指定过滤对象。

动态权限

引用

  1. Spring Security 中的四种权限控制方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现外网访问API接口

Application Programming Interface 缩写为API&#xff0c;中文翻译为“应用程序接口”&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&…

TVS管开关电源防护应用及电源防护元件的品类

瞬态抑制二极管简称TVS管。其作用原理是能够在极短的时间内承受反向电压的冲击&#xff0c;使得两极之间的电压钳位在特定电压水平上&#xff0c;有效避免了对后面电路的冲击&#xff0c;从而保护了被保护电子线路中的精密元件不受其损害。 瞬态抑制二极管TVS的钳位响应速度为为…

pytest + yaml 框架 -7.用例分层机制

前言 当我们测试流程类的接口&#xff0c;需反复去调用同一个接口&#xff0c;就会想到复用API&#xff0c;在代码里面可以写成函数去调用。 那么在yaml 文件中&#xff0c;我们可以把单个API写到一个yaml 文件&#xff0c;测试用例去调用导入API。 pip 安装插件 pip instal…

电子产品设计的流程有哪些

电子产品设计过程是指导工业外观设计的具体环节&#xff0c;主要包括产品市场需求分析、产品设计、产品原型设计、生产测试设计、大规模生产等方法和步骤。 一、电子产品设计流程是什么? 1.产品市场需求分析是电子产品设计成功的第一步&#xff0c;也是非常重要的一步。开发者…

JavaSE(数组)

1. 数组 数组创建及初始化 总结&#xff1a; 三种写法包括了动态初始化和静态初始化&#xff0c;其中省略格式不能再省略&#xff08;拆分&#xff09;&#xff1b;没有初始化时&#xff08;默认值为基类类型对应的默认值&#xff09;其中引用类型的默认值为null 三种写法 1…

RK3288-8.1-添加一个人体感应的开关-pir_pin_status

收到一个人体感应的需求,在设置添加一个开关 第一步,确定人体感应接口的GPIO 可知GPIO7_B5为对应GPIO 第二步,注册对应DTS 然后去驱动内注册对应的节点 很基础的东西,就不多说了,省略一万字......................(得到节点) cat sys/devices/platform/attr/pir_pin_status …

CAD尺寸标注不显示数值

在创建一个新的CAD图纸后&#xff0c;使用CAD尺寸标注会看见只有一条直线而没有数字显示&#xff0c;这是为什么呢&#xff1f;实际上是存在数值的&#xff0c;只是默认的数值很小&#xff0c;如果图形尺寸过大就看不清楚需要放大才能看见&#xff0c;就需要调整CAD尺寸标注的格…

RSS Can:借助 V8 让 Golang 应用具备动态化能力(二)

继续聊聊之前做过的一个小东西的踩坑历程&#xff0c;如果你也想高效获取信息&#xff0c;或许这个系列的内容会对你有用。 写在前面 在上一篇文章《RSS Can&#xff1a;使用 Golang 实现更好的 RSS Hub 服务&#xff08;一&#xff09;》里&#xff0c;我们简单介绍了使用 G…

数字孪生技术在智慧园区领域的实践

随着云计算、物联网、大数据、人工智能、5G 等为代表的技术迅速发展和 深入应用&#xff0c;“智慧园区”建设已成为全球园区发展的新趋势。近年来&#xff0c;党中央 和国务院更加注重智慧园区的建设与发展&#xff0c;相继出台了多项政策推动智慧园区的建设&#xff0c;智慧园…

数据镜像软件

什么是数据镜像 数据镜像是复制已传输到 USB 设备或在 USB 设备中修改的文件内容的过程。创建镜像副本后&#xff0c;可以在受密码保护的网络共享中维护这些副本。此共享文件夹最好保存在远程位置&#xff0c;以节省本地计算机上的空间。这样&#xff0c;只有管理员或受信任的…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于疫情防控下社区管理平台my3tu

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

Flutter自定义MultiChildRenderObjectWidget实现圆环布局效果

一、本文主要是学习巩固一下自定义RenderObject这一块内容&#xff0c;用所了解到的知识实现一个圆环布局效果 本篇文章主要参考了恋猫de小郭Flutter 完整开发实战详解&#xff08;十六、详解自定义布局实战&#xff09;文章&#xff0c;大家可以先看完这篇文章再来阅读本篇这…

生产制造企业用的ERP系统——流程管理

ERP的含义是企业资源计划&#xff0c;主要是对企业所拥有各种资源进行综合规划和优化管理&#xff0c;用以降低成本&#xff0c;提高效率&#xff0c;增加利润。 作为一个低代码开发平台&#xff0c;百数在办公领域已有10年历史&#xff0c;为企业信息化发展提供丰富的功能模块…

Java如何实现截取字符串

文章目录0 写在前面1 .substring()2 split()正则表达式3 StringUtils.substring()4 写在最后0 写在前面 在实际工作中有一些地方需要用到截取字符串的方法&#xff0c;所以在此记录下截取字符串的几种方法。 .substring() StringUtils.substring() split()正则表达式 1 .subs…

最高月薪15.5K,成大事不在于力量的大小,而在于能坚持多久~

在前几天的世界杯八强赛中&#xff0c;阿根廷通过点球战胜了荷兰&#xff0c;闯入了四强。 说起阿根廷&#xff0c;就不得不提起梅西&#xff0c;这个被众多球迷誉为天才的球王&#xff0c;可实际上&#xff0c;在他的父亲眼中&#xff0c;却从不称自己的儿子为天才&#xff0…

java 课设-超级玛丽游戏

题目&#xff1a; 本程序是针对超级玛丽小游戏的 JAVA 程序&#xff0c;进入游戏后首先用鼠标点击 GUI 窗口&#xff0c;然后开始游 戏&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马里 奥的可移动性…

.net 移动开发 MAUI

.net 移动开发 MAUI新建一个Hello World运行效果修改一下&#xff0c;做个加法运算吧运行效果创建新的内容页修改xaml内容添加逻辑内容主页面添加一个按钮并且增加路由按钮事件添加路由整体感受第一&#xff1a;WPF第二&#xff1a;小程序所有的页面跳转都是借助路由第三&#…

Win11怎么更改时区?

Win11可以自动检测配置用户的时区来显示正确的时间&#xff0c;如果由于一些特殊原因导致系统时区错误&#xff0c;显示时间也错误的话&#xff0c;这时候要怎么调整呢&#xff1f;下面小编就来教教大家更换Windows 11时区的方法。 方法一&#xff1a;在 Windows 11 上更改时区…

新旧电脑数据如何迁移?电脑数据导入到另一台电脑

新旧电脑数据如何迁移&#xff1f;换电脑是一件好事&#xff0c;换更新版本的电脑&#xff0c;还可以体验新功能。您需要找到将数据传输到新电脑的有效方法。电脑数据导入到另一台电脑&#xff0c;接下来的内容将为大家揭晓答案&#xff01; 方法1、使用专业的数据传输迁移数据…

[附源码]计算机毕业设计的玉石交易系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…