说明

(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)hibernate5.2.17.Final

(6)MySQLDriver 5.1.47

(7)MySQL 8.0.12

需求缘起

在之前的章节中我们介绍过通过注解的方式进行权限的控制了,这里再详细的讲解下方法级安全的几个注解。

一、注解式方法级安全开启

需要在WebSecuirtyConfig添加配置:

@Configuration@EnableWebSecurity //启用Spring Security.

会拦截注解了@PreAuthrize注解的配置.@EnableGlobalMethodSecurity(prePostEnabled=true)public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

}

二、允许的注解

这里主要@PreAuthorize, @PostAuthorize, @Secured这三个注解可以使用。

2.1 @Secured

当@EnableGlobalMethodSecurity(securedEnabled=true)的时候,@Secured可以使用:

@GetMapping("/helloUser")@Secured({"ROLE_normal","ROLE_admin"})public String helloUser() {    return "hello,user";}

说明:拥有normal或者admin角色的用户都可以方法helloUser()方法。另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“

如果我们要求,只有同时拥有admin & noremal的用户才能方法helloUser()方法,这时候@Secured就无能为力了。

2.2 @PreAuthorize

Spring的 @PreAuthorize/@PostAuthorize 注解更适合方法级的安全,也支持Spring 表达式语言,提供了基于表达式的访问控制。

当@EnableGlobalMethodSecurity(prePostEnabled=true)的时候,@PreAuthorize可以使用:

@GetMapping("/helloUser")@PreAuthorize("hasAnyRole('normal','admin')")public String helloUser() {    return "hello,user";}

说明:拥有normal或者admin角色的用户都可以方法helloUser()方法。

此时如果我们要求用户必须同时拥有normal和admin的话,那么可以这么编码:

@GetMapping("/helloUser")@PreAuthorize("hasRole('normal') AND hasRole('admin')") public String helloUser() {    return "hello,user";}

此时如果使用user/123登录的话,就无法访问helloUser()的方法了。

2.3 @PostAuthorize

@PostAuthorize 注解使用并不多,在方法执行后再进行权限验证,适合验证带有返回值的权限,Spring EL 提供 返回对象能够在表达式语言中获取返回的对象returnObject。

当@EnableGlobalMethodSecurity(prePostEnabled=true)的时候,@PostAuthorize可以使用:

@GetMapping("/helloUser")@PostAuthorize(" returnObject!=null &&  returnObject.username == authentication.name")public User helloUser() {        Object pricipal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();        User user;        if("anonymousUser".equals(pricipal)) {            user = null;        }else {            user = (User) pricipal;        }        return user;}

这三个最常用也就是@PreAuthorize这个注解了,在使用中主要是配合Spring EL表达式。

转载于:https://www.cnblogs.com/ysyy/p/10708645.html

Security注解:@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全相关推荐

  1. Spring Security 4 使用@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全

    原文地址: http://blog.csdn.net/w605283073/article/details/51327182  本文探讨spring Security 4 基于@PreAuthoriz ...

  2. Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转

    原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...

  3. Spring的aspect无法拦截有注解的jdk代理的接口方法的原因

    Spring的aspect无法拦截有注解的jdk代理的接口方法的原因 我github博客地址 背景 项目A中需要多数据源的实现,比如UserDao.getAllUserList() 需要从readon ...

  4. JSTL+EL表达式方法获取Oracle的Clob字段内容

    我们在页面获得数据的时候一般的类型还是很好获得的,但是一遇到Clob类型就比较麻烦,最常用的方法是用一个流将其读取出来.使用MVC框架的时候这些都是无所谓的事情,因为反正是写在java类中怎么写都行, ...

  5. java 注解的几大作用及使用方法详解(转载)

    ava 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注 ...

  6. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

  7. 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法 参考文章: (1)在同一个类中,一个方法调用另外一个有注解(比如@Async, ...

  8. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

  9. IDEA中实现接口时注解@Override报错的解决方法

    IDEA中实现接口时注解@Override报错的解决方法 参考文章: (1)IDEA中实现接口时注解@Override报错的解决方法 (2)https://www.cnblogs.com/liulao ...

最新文章

  1. Python Django 全局上下文代码示例
  2. python与正则表达式(part6)--re模块使用
  3. oracle中的merge into用法解析
  4. C# WebBrowser 设置独立的代理
  5. 函数c语言桶排算法,C语言基本排序算法之桶式排序实例
  6. CORS - 引入预检请求的动机是什么?
  7. 第六届华为创新杯编程大赛第二轮(2014.4.29)
  8. Linux上安装rz和sz命令
  9. 【图像计数】基于matlab灰度二值化同类物体简单计数【含Matlab源码 759期】
  10. 官方授权正版 Avast AntiTrack Premium 反跟踪工具软件
  11. cboard企业版源码_数据可视化BI平台——CBoard的部署与使用(笔记整理)
  12. 仿vista桌面小工具
  13. 向量设计丨导师简介丨客户案例丨商业活动丨跨界合作
  14. 输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,其中90-100分为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。
  15. 二维码介绍及二维码的Python生成
  16. 二年级数学计算机教学教案,人教版-小学二年级数学上册全套教案.pdf
  17. 水星路由器登录界面找不到服务器,melogin.cn打不开的解决办法(水星路由器)
  18. install vanish3.0.2
  19. 用摄像头实现远程监控咋搞不定呢
  20. 【FFT夯实基础系列】手写笔记合集|傅里叶级数、傅里叶变换

热门文章

  1. CVPR2022论文速递(2022.4.20)!共13篇!
  2. creator 挖洞 转发
  3. 市政下水道疏通机器人_市政下水道疏通机器人的制作方法
  4. 一起来写个酷炫的水波纹浪啊浪界面
  5. 怎么最快地复制一张表?
  6. mysql骚操作_关于MySQL的一些骚操作——提升正确性,抠点性能
  7. 用python画正方形
  8. Syntax error or access violation: 1305 FUNCTION *****.json_extract does not exist
  9. 【大咖有约】Garena 黄智凯:利用Docker构建自动化运维平台
  10. Microsoft OLE DB Provider for ODBC Drivers (0x80004005) 操作必须使用一个可更新的查询”错误的解决办法