用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用
文章目录
- 用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用
- 首选掌握几个英文单词的意思
- 在哪里使用?
- 给Spring Security开启注解
- @Secured注解
- @PreAuthorize注解(访问方法之前进行权限认证)
- @PostAuthorize注解(访问方法之后进行权限认证)
- @PostFilter注解
- @PreFilter注解
用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用
首选掌握几个英文单词的意思
Authorize:授权
Authentication:认证
secured:保护
在哪里使用?
这五个注解都是用在控制器中方法的上面的,如下图:
给Spring Security开启注解
首先在启动类或者配置类(带@Configuration注解的)中需要先开启注解,因为Spring Security默认是禁用注解的,要想开启注解需要在启动类或者配置类上加@EnableGlobalMethodSecurity注解;
如果要开启@Secured注解那么需要在启动类或者配置类中加上@EnanleGlobalMethodSecurity(securedEnabled=true)注解,如果要开启@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这四个注解,需要在启动类或者配置类上加@EnableGlobalMethodSecurity(prePostEnabled = true)注解;
因此我们如果要想使用这五个注解,需要先在启动类上加上@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true)注解,去先在Spring Security开启这五个注解,然后才能使用它们,在启动类中开启注解如下图:
@Secured注解
@Secured注解的作用:在用户向浏览器发送一个请求时会去访问控制器中的方法,然后在访问此控制器中的方法之前会先去UserDetailsService用户细节实现类的实现方法中return的User对象查看是否具有@Secured注解中指定的角色,如果有指定的角色,那么系统允许用户访问此控制器方法,否则,系统不允许访问此控制器方法;注意在使用@Secured设置角色名字的时候,角色名的前面一定要加上ROLE_前缀;如下图:
UserDetailsService用户细节实现类中的情况如下图:
UserDetailsService中的用户具有ROLE_xzy角色,因此可以访问控制器中的update方法,在浏览器中的访问如下图:
@PreAuthorize注解(访问方法之前进行权限认证)
@PreAuthorize注解的作用:在浏览器发送一个请求后,会访问控制器中的对应的方法,@PreAuthorize注解会在访问控制器中的方法之前进行权限认证,看看UserDetailsService用户细节实现类中对应的用户有没有相应的权限,如果有那么该用户发送的请求可以进入控制器中对应的方法,如果没有相应的权限,那么用户发送的请求不能进去控制器中对应的方法;
@PreAuthorize注解的使用如下图:
UserDetailsService用户细节实现类中的情况如下图:
UserDetailsService中的用户具有admins权限,因此可以访问控制器中的update2方法,在浏览器中的访问如下图:
@PostAuthorize注解(访问方法之后进行权限认证)
@PostAuthorize注解的作用:在访问控制器中的相关方法之后(方法的return先不访问),进行权限认证,去看看UserDetailsService用户细节实现类中用户是否有对应的权限,如果有的话,那么控制器方法的最后一句return语句会执行,否则,控制器方法的最后一句return语句不会执行;
@PostAuthorize注解的使用如下图:
UserDetailsService用户细节实现类中的情况如下图:
因为用户细节实现类中的用户只有admins权限没有admins4或者admins5权限,因此控制器中的return语句不会执行,请求访问浏览器后的情况如下图:
然后可以发现idea的控制台中update3方法中的语句是可以输出的如下图:
这就表示使用@PostAuthorize注解的时候,会先执行控制器中的方法,执行到最后一句return的时候,再进行权限认证;
@PostFilter注解
注意@PostFilter注解只有在控制器方法的return返回值是一个集合的时候才可以使用;
@PostFilter注解的作用:如果控制器方法的return返回值是一个集合,此注解可以对return的这个集合进行过滤输出;
使用@PostFilte注解可以对集合类型的返回值进行过滤。使用@PostFilter时,Spring Security将移除使对应表达式即的结果为false的元素。
@PostFilter注解的使用如下图:
上图中的filterObject是使用@PreFilter和@PostFilter时的一个内置表达式,表示集合中的当前对象。
浏览器中对应的结果如下图:
@PreFilter注解
注意:只有在控制器方法的参数是集合类型的时候才能使用@PreFilter注解
@PreFilter注解的作用:可以过滤控制器方法的参数;
这个注解我在测试的时候是这五个注解里面唯一一个没有测试成功的,因此我去百度上百度了一下其他博主对此注解的总结,然后直接粘贴到了下面,如果哪位仁兄知道这个注解该怎样测试的话,还望赐教;
百度粘贴如下:
filterObject是使用@PreFilter和@PostFilter时的一个内置表达式,表示集合中的当前对象。当@PreFilter标注的方法拥有多个集合类型的参数时,需要通过@PreFilter的filterTarget属性指定当前@PreFilter是针对哪个参数进行过滤的。
如下面代码就通过filterTarget指定了当前@PreFilter是用来过滤参数ids的
@PreFilter(filterTarget="ids", value="filterObject%2==0")public void delete(List<Integer> ids, List<String> usernames) {...}
用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用相关推荐
- Spring Security 4 使用@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全
原文地址: http://blog.csdn.net/w605283073/article/details/51327182 本文探讨spring Security 4 基于@PreAuthoriz ...
- Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转
原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...
- Security注解:@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全
说明 (1)JDK版本:1.8 (2)Spring Boot 2.0.6 (3)Spring Security 5.0.9 (4)Spring Data JPA 2.0.11.RELEASE (5)h ...
- MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...
- linux中如何授权限,Linux系统下,为普通用户授权。
Linux系统下,如何为普通用户授权 编辑sudoers vi /etc/sudoers(visudo) 添加如下内容 fly ALL=(ALL) ALL (为普通用户fly赋予root权限) 第一 ...
- MySQL中新建用户,新建数据库,用户授权,删除用户,修改密码的相关操作
测试环境:WIN32 mysql5.0.45 注:本操作是在WIN命令提示符下,phpMyAdmin同样适用. 用户:phplamp 用户数据库:phplampDB 1.新建用户. //登录MYSQ ...
- MySQL中用户授权/删除授权的方法
用户授权方法 你可以通过发出GRANT语句增加新用户: 代码如下 复制代码 shell> mysql --user=root mysql mysql> GRANT ALL PRIVILE ...
- mysql中给用户添加密码_MySql中添加用户,新建数据库,用户授权,删除用户,修改密码...
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...
- 微信中html5获取手机号,微信小程序通过用户授权获取手机号
这篇文章主要介绍了微信小程序如何通过用户授权获取手机号(getPhoneNumber),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 小程序有一个获 ...
- Linux中elasticsearch:root给普通用户授权总是出现输入密码Sory try again…
Linux中elasticsearch:root给普通用户授权总是出现输入密码Sory try again- 给新创建的普通用户es,添加权限,将用户添加到sudoer列表 查看bin目录和confi ...
最新文章
- 从零开始学JavaScript一(简介)
- Python 类的定义、继承及使用对象
- 编程之美 set 12 快速找出故障机器
- [Qt入门]QMainWindow创建
- JMeter学习(四)参数化、断言、集合点
- leetcode44. 通配符匹配 又是一道没有解释的字符串dp困难题
- 每天一道算法题(39)——含有重复字符的全排列
- 解决Azure中COULD NOT LOAD FILE OR ASSEMBLY问题
- 做人做事,就两个字!
- 深入浅出分布式系统Raft协议
- 两台redhat7虚拟机配置ssh免密访问
- linux ubuntu 加密狗,ubuntu – 将usb加密狗连接到KVM VM
- simplis汉化包_Simtrix.simplis中文教程.pdf
- BUCK-BOOST反激变压器设计
- 支付宝转账银行卡/隐藏卡号
- 酒店管理系统数据库SQl设计思路
- adb连接木木模拟器
- IP获取方法二:太平洋网络IP地址查询Web接口
- matlab pie 空隙,编码解决饼图(Pie)的标签重叠问题
- sqlite优化简单分析
热门文章
- 跟我一起水疗的哥俩儿,其实挺猛的!
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
- 一行python代码能实现什么丧心病狂的功能_一行Python 能实现什么丧心病狂的功能...
- Unity3D+moba+技能指示器(二)
- 书名带冒号_书名号、引号、括号和冒号如何套用
- 人工智能学习-高等数学
- 主流注意力机制介绍以及如何添加到YOLOV5
- Spring Data Rest学习篇----@Projection
- 私有网盘搭建——Ubuntu使用宝塔面板安装Nextcloud及优化 ------超详细
- .doc文件不显示word图标的解决方法