Spring保护方法
Spring保护方法
一、使用注解保护方法
1.@Secured
由Spring Security提供,首先需要启用基于注解的方法安全性:
@EnableGlobalMethodSecurity(securedEnabled = true)
@Configuration
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{\
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("tang").password("123").roles("USER");
}
}
如果securedEnabled设置为true,将会创建一个切点,这样Spring Security切面就会包装带有@Secured注解的方法。
@Secured("ROLE_ROOT") //使用String数组作为参数,每个String值是一个权限
public String addUser() {
return "add";
}
如果方法被没有认证的用户或没有所需权限的用户调用,保护这个方法的切面将抛出一个Spring Security异常。
2.JSR-250的@RolesAllowed注解
该注解与@Security注解基本一致,它们的区别在于@RolesAllowed注解是JSR-250定义的标准注解。
如果使用该注解需要将@EnableGlobalMethodSecurity的jsr250Enable属性设置为true。
二、使用表达式实现方法级别的安全性
使用SpEL能够在方法调用上实现更有意思的安全性约束。如果表达式结果为true,那么安全规则通过,否则就会失败。

首先,先要设置prePostEnable属性设置为true。
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("tang").password("123").roles("USER");
}
}
@PreAuthorize和@PostAuthorize,它们能够基于表达式的计算结果来限制方法的访问。
@PreAuthorize:在方法调用之前执行,如果表达式的计算结果不为true,将会阻止方法
的执行。
@PostAuthorize:直到方法返回才执行,然后决定是否抛出安全异常。
@PreAuthorize("(hasRole('ROLE_ROOT') and #content.text.length() <= 180)")
public String addUser() {
return "add";
}
@PostAuthorize("returnObject.root.username = root.username")
public String addUser() {
return "add";
}
有时需要保护的不是方法调用,而是传入方法的数据和方法返回的数据。
事后对方法的返回值进行过滤
@PostAuthorize("returnObject.root.username == root.username")
//使用表达式计算该方法返回集合的每个成员,将计算结果为false的成员移除掉
//filterObject对象引用的是这个方法所返回List中的某一个元素
@PostFilter("hasRole('ROLE_ADMIN') || "
+ "filterObject.admin.username == principal.username")
public String addUser() {
return "add";
}
事先对方法的参数进行过滤
@PreAuthorize("hasRole({'ROLE_ADMIN', 'ROLE_USER'})")
@PreFilter("hasRole('ROLE_ADMIN') || " + "targetObject.user.username == user.name")
public void deleteSth(List<User> userList) {}
应该避免编写复杂的安全表达式,或者在表达式中嵌入太多与安全无关的业务逻辑。而且,表达式
最终只是一个设置给注解的String值,难以测试和调试。
Spring保护方法的更多相关文章
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- spring替代方法
总结spring替代方法的使用 MyValueCalculator类中的computerValue方法将会被替代 public class MyValueCalculator { public Str ...
- Spring开启方法异步执行
@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(Async ...
- Spring EL方法调用实例
Spring表达式语言(使用SpEL)允许开发人员使用表达式来执行方法和将返回值以注入的方式到属性,或叫作“使用SpEL方法调用”. Spring EL在注解的形式 了解如何实现Spring EL方法 ...
- ruby中的私有方法和保护方法
ruby中的私有方法是指方法只能被隐含调用,不能被显示调用.而当没有显示接收者的时候,会把self当成接收者.因此,只能在自身中调用私有方法,这也是私有方法的调用规则. ruby的私有方法机制目的是: ...
- Spring @async 方法上添加该注解实现异步调用的原理
Spring @async 方法上添加该注解实现异步调用的原理 学习了:https://www.cnblogs.com/shangxiaofei/p/6211367.html 使用异步方法进行方法调用 ...
- Spring Security方法级别授权使用介绍
1.简介 简而言之,Spring Security支持方法级别的授权语义. 通常,我们可以通过限制哪些角色能够执行特定方法来保护我们的服务层 - 并使用专用的方法级安全测试支持对其进行测试. 在本文中 ...
- spring security方法一 自定义数据库表结构
Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也无法满足所有企业内部对用户信息和权限信息管理的要求.基本上每个企业内部都有一套自己的用户信息管理结构,同时也 ...
- java 下载spring的方法
spring是很好用,可惜的是,貌似现在没有办法从网站上找到整合在一起的包了... 我以前只能通过maven去抓... 今天终于知道了一个方法: 访问如下地址: http://repo.spring. ...
随机推荐
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
- Python 数据分析4
本章概要 数据加载.存储与文件格式 数据加载.存储与文件格式 读取文本格式数据 read_csv 默认是按照逗号分割,也可设定其他分割符 df = pd.read_csv('file', sep='| ...
- 1、Altium Designer 入门
一.新建工程 File-->new-->Project-->newPCB Project 1.添加原理图 在Project面板选中项目,右键Add New to Project--& ...
- 面向对象原生JavaScript案例炫彩小球
面向对象其实对于初学者来说还是比较难以理解的,以前看到一个面试题目 面向对象是什么? 面向对象是一种思想,千万别入坑了: 这次给大家带来的是一个鼠标移动产生小球的案例,不是我不想给大家分享如何去认识面 ...
- Java中的String、StringBuilder以及StringBuffer
https://www.cnblogs.com/dolphin0520/p/3778589.html
- IDEA内的SpringBoot插件安装与SpringBoot项目生成地址
最新安装idea,在新建项目时没有spring initializr选项,也没有spring assistant选项.因此需要安装相应插件 在菜单栏 file>>settings>& ...
- jQuery概念
- HttpListener 实现web服务器
一.使用方法 1. Start()方法 允许此实例接受传入的请求.即开始监听 2. Stop()方法 处理完所有当前排队的请求后关闭HttpListener对象 3. GetContext()方法 ...
- 简单测试Elasticsearch 7.0
发现不同的地方 1.创建index (注意:7.0版本之前mappings中需要增加_doc,7.0版之后已去掉) PUT http://10.10.x.x:9200/test 2.Elastics ...
- 基于flask+gunicorn+nginx来部署web App
基于flask+gunicorn&&nginx来部署web App WSGI协议 Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求.Web框架和Web服务 ...