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. flask+mod_wsgi+apache在windows上的布署

    已经安装过python3.5 1.安装flask: pip install flask 2.安装apache: Apache是开源软件,针对windows环境,它不直接提供编译版本.可以在http:/ ...

  2. python开发基础之数据类型、字符编码、文件操作

    一.知识点 1.身份运算: 2.现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码.用记事本编辑的时候,从文件 ...

  3. DC综合简单总结(2)

    DC综合简单总结(2) 建立时间和保持时间和数据输出延时时间 一.概念 建立时间和保持时间都是针对触发器的特性说的. 建立时间(Tsu:set up time) 是指在触发器的时钟信号上升沿到来以前, ...

  4. 集成方法 Bagging原理

    1.Bagging方法思路 Bagging独立的.并行的生成多个基本分类器,然后通过投票方式决定分类的类别 Bagging使用了自助法确定每个基本分类器的训练数据集,初始样本集中63.2%的数据会被采 ...

  5. spring boot 框架设计步骤

    spring boot 框架设计步骤: 1.poem.xml配置 2.application.yml配置 3.entiry实体 4.realm.Myrealm extends AuthorizingR ...

  6. java学习笔记04-基本数据类型

    编写一款可用的软件,离不开对数据的操作(经常有人说:程序=数据+算法).数据可能有很多类型,比如对于年龄来说,数据就是整数. 对于金额来,数据是带小数的.在java中,可以分为内置数据类型和引用数据类 ...

  7. VGA、DVI、HDMI三种视频信号接口

    目前,电脑显示器常见的接口主要有HDMI.DP.DVI.VGA等4种接口.显示器数据线性能排名:DP>HDMI>DVI>VGA.其中 
VGA是模拟信号,已经被主流所淘汰,DVI.H ...

  8. 游记-HNOI2019

    Day -1 最后一场考试依旧没有ak(达成成就:\(\mathrm{OI}\) 生涯 AK 次数仅一次) Day 0 听dalao们说现在做题已经没有意义了,不如多口胡几道题,拓展视野 虽然很抗拒但 ...

  9. Tomcat使用shutdown.bat关闭会将其他Tomcat关掉的问题

    Tomcat使用shutdown.bat关闭会将其他Tomcat关掉的问题 shutdown.bat文件有一句if not "%CATALINA_HOME%" == "& ...

  10. VUE项目快速构建

    IDE  :VScode 1.新建项目文件夹 ctrl+~   调出命令板,/IDE找到当前文件夹右键 点击‘在命令提示符中打开’ 安装 node:官网(https://nodejs.org/en/d ...