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保护方法的更多相关文章

  1. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  2. spring替代方法

    总结spring替代方法的使用 MyValueCalculator类中的computerValue方法将会被替代 public class MyValueCalculator { public Str ...

  3. Spring开启方法异步执行

    @EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(Async ...

  4. Spring EL方法调用实例

    Spring表达式语言(使用SpEL)允许开发人员使用表达式来执行方法和将返回值以注入的方式到属性,或叫作“使用SpEL方法调用”. Spring EL在注解的形式 了解如何实现Spring EL方法 ...

  5. ruby中的私有方法和保护方法

    ruby中的私有方法是指方法只能被隐含调用,不能被显示调用.而当没有显示接收者的时候,会把self当成接收者.因此,只能在自身中调用私有方法,这也是私有方法的调用规则. ruby的私有方法机制目的是: ...

  6. Spring @async 方法上添加该注解实现异步调用的原理

    Spring @async 方法上添加该注解实现异步调用的原理 学习了:https://www.cnblogs.com/shangxiaofei/p/6211367.html 使用异步方法进行方法调用 ...

  7. Spring Security方法级别授权使用介绍

    1.简介 简而言之,Spring Security支持方法级别的授权语义. 通常,我们可以通过限制哪些角色能够执行特定方法来保护我们的服务层 - 并使用专用的方法级安全测试支持对其进行测试. 在本文中 ...

  8. spring security方法一 自定义数据库表结构

    Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也无法满足所有企业内部对用户信息和权限信息管理的要求.基本上每个企业内部都有一套自己的用户信息管理结构,同时也 ...

  9. java 下载spring的方法

    spring是很好用,可惜的是,貌似现在没有办法从网站上找到整合在一起的包了... 我以前只能通过maven去抓... 今天终于知道了一个方法: 访问如下地址: http://repo.spring. ...

随机推荐

  1. Go语言入门: Chapter1

    书籍官网: http://www.gopl.io 环境配置: https://studygolang.com/articles/8284  安装go和vscode中go的相关插件 主要命令学习: go ...

  2. 【bzoj 4449】[Neerc2015]Distance on Triangulation

    Description 给定一个凸n边形,以及它的三角剖分.再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b. I ...

  3. JWT使用

    原文链接:http://www.bleachlei.site/blog/2017/06/09/Nodejs-Expressjs-JWT%EF%BC%8CJWT%E4%BD%BF%E7%94%A8/ J ...

  4. [系统集成] 基于telegraf, influxdb, grafana 建立 esxi 监控

    之前在 nagios 上建立了 esxi 监控,指标少.配置麻烦.视觉效果差.最近我把 esxi 监控迁移到了 influxdb+grafana 平台上,无论是监控指标.可操作性还是视觉效果都有了很大 ...

  5. python日志重复输出

    ​ 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日志函数,比如下面这样: # 这里为了便于理解, ...

  6. 7zip,命令行解压报错:7-Zip cannot find the code that works with archives.

    简单的命令: 7z x zipfile.7z 7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 Error: 7-Zip cannot ...

  7. module.exports与exports区别

    CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. ...

  8. 05mycat父子表

    表连接的难题在mycat中是不允许跨分片做表连接查询的 创建t_orders表 create table t_orders( id int PRIMARY key, customer_id int n ...

  9. bzoj 3998

    我们分成两种情况来分析这个问题:t=0和t=1 t=1时,每一个子串出现的次数就是他在parent树上所在子树内前缀节点的个数,这一点我们已经说的很清楚了 利用SAM有向无环的性质,我们可以在pare ...

  10. github徽标引入

    官网: https://shields.io/ 示例: ![](https://img.shields.io/badge/language-go-cccfff.svg?style=popout-squ ...