Spring Security 表达式(Expressions) - hasRole示例
1.概述
Spring Security使用强大的Spring Expression Language(SpEL)提供各种各样的表达式。大多数这些Security表达式是针对上下文对象(当前经过身份验证的主体)进行工作的.
这些表达式的评估由SecurityExpressionRoot执行 - 它提供了Web安全性和方法级安全性的基础。
Spring Security 3.0中引入了使用SpEL表达式作为授权机制的能力,并在Spring Security 4.x中继续使用,有关Spring Security中表达式的完整列表,请查看本指南。
2.Web授权
Spring Security提供两种类型的Web授权 - 基于URL保护整页,并根据安全规则有条件地显示JSP页面的各个部分。
2.1.Full Page授权示例
通过为http元素启用表达式,可以按如下方式保护URL模式:
<http use-expressions = "true">
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
...
</http>
使用Java配置:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN");
}
...
}
Spring Security会自动为任何角色添加前缀ROLE_。
此处使用hasRole表达式来检查当前经过身份验证的主体是否具有指定的权限。
2.2.在页面授权示例
第二种Web授权基于对Security表达式的评估有条件地显示JSP页面的某些部分。
让我们在pom.xml中为Spring Security JSP taglib支持添加所需的依赖项:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
必须在页面上启用taglib支持才能使用Security命名空间:
<%@ taglib prefix="security"
uri="http://www.springframework.org/security/tags" %>
现在可以在页面上使用hasRole表达式,当页面渲染时,基于经过身份验证的人显示/隐藏HTML元素.
<security:authorize access="hasRole('ROLE_USER')">
This text is only visible to a user
<br/>
</security:authorize>
<security:authorize access="hasRole('ROLE_ADMIN')">
This text is only visible to an admin
<br/>
</security:authorize>
3.方法级别授权示例 - @PreAuthorize
通过使用注释,Security表达式还可用于在方法级别保护业务功能。
注释@PreAuthorize和@PostAuthorize(以及@PreFilter和@PostFilter)支持Spring Expression Language(SpEL)并提供基于表达式的访问控制。
首先,为了使用方法级安全性,我们需要使用@EnableGlobalMethodSecurity在安全性配置中启用它:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
}
等效的XML配置:
<global-method-security pre-post-annotations="enabled" />
然后,我们可以使用Spring @PreAuthorize注释来保护方法:
@Service
public class FooService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public List<Foo> findAll() { ... }
...
}
现在,只有具有ADMIN角色的用户才能成功调用findAll方法。
请注意,Pre和Post注释是通过代理进行评估和强制执行的 - 如果使用CGLIB代理,则不能将类和公共方法声明为final。
4.编程检查角色
如果请求对象可用,还可以在原始Java代码中以编程方式检查用户权限:
@RequestMapping
public void someControllerMethod(HttpServletRequest request) {
request.isUserInRole("someAuthority");
}
当然,不访问请求,也可以简单的手动校验有特殊权限的已认证通过的用户。可以通过各种方式从Spring Security上下文中获取用户。
5.总结
本教程简要介绍了一般使用Spring Security Expressions,特别是hasRole表达式 - 快速介绍如何保护应用程序的各个部分。
有关Web授权示例,请查看此Github简单教程。方法级安全性示例也在GitHub上。
Spring Security 表达式(Expressions) - hasRole示例的更多相关文章
- spring security之httpSecurity使用示例
如果在HttpSecurity中配置需要authenticate(),则如果没有登陆,或没有相关权限,则会无法访问 2017-01-02 23:39:32.027 DEBUG 10396 --- [n ...
- SpringBoot 整合 spring security oauth2 jwt完整示例 附源码
废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...
- Spring Security(三十五):Part III. Testing
This section describes the testing support provided by Spring Security. 本节介绍Spring Security提供的测试支持. ...
- Spring Security(十二):5. Java Configuration
General support for Java Configuration was added to Spring Framework in Spring 3.1. Since Spring Sec ...
- Spring Boot中使用Spring Security进行安全控制
我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...
- Spring Security(16)——基于表达式的权限控制
目录 1.1 通过表达式控制URL权限 1.2 通过表达式控制方法权限 1.2.1 使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2 ...
- Spring Security教程之基于表达式的权限控制(九)
目录 1.1 通过表达式控制URL权限 1.2 通过表达式控制方法权限 1.2.1 使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2 ...
- Spring Security -SpEL表达式
Spring Security -SpEL表达式 开启SpEL表达式 <!-- use-expressions是否开启 SpEL表达式 o.s.s.web.access.expression.W ...
随机推荐
- Javascript代码收集
1.模仿jquery each 原文地址 function each(obj, fn){ var i; if(Object.prototype.toString.call(obj) === '[obj ...
- 网络新闻传输协议NNTP
一.Usenet与新闻组 Usenet新闻系统是一个全球存档的“电子公告板”,各种主题的新闻组一应俱全.新闻组可以是面向全球泛泛而谈,也可以是只面向某一个地区区域. 整个系统是由一个大量计算机组成的一 ...
- re.sub用法
re.sub功能是对于一个输入的字符串,利用正则表达式,来实现字符串替换处理的功能返回处理后的字符串 re.sub共有五个参数 三个必选参数pattern,repl,string 两个可选参数coun ...
- REST、DRF(View源码解读、APIView源码解读)
一 . REST 前言 1 . 编程 : 数据结构和算法的结合 .小程序如简单的计算器,我们输入初始数据,经过计算,得到最终的数据,这个过程中,初始数据和结果数据都是数据,而计算 ...
- BA模型 第10章
1.BA模型BA模型就是世界坐标到像素坐标的转换过程.这里多了一个去畸变.因为归一化平面坐标在转成像素坐标的过程中会出现畸变.这里只处理了径向畸变,径向畸变包括桶形失真和枕形失真,都是由于图像放大率随 ...
- <算法笔记>关于快速排序的算法优化排序(顺便给百度百科纠个错)
快速排序是排序算法之中的基本中的基本,虽然越来越多的接口函数将快速排序“完美的封装了起来”,比如C++中的qsort或者<algorithm>中的sort(与stable_sort相对应) ...
- mysql八:ORM框架SQLAlchemy
阅读目录 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进 ...
- &&、||和&、|的区别
1. && .|| 和 &.| 都是逻辑运算符,前两个 与后两个的区别就在于 &&.|| 有"短路"现象,而& .| 则没有. 例如 ...
- FZU 2091 播放器 (栈)
记住:!!!栈用完之后,在下次使用的时候一定要初始化!!花费了我一上午的时间,最后还是某杰想出来的. 题意:实现一个音乐播放器的操作,有3种操作. 注意:一开始播放器会播放播放列表中的第一首歌,也就是 ...
- Jmeter-配置原件-HTTP Cookie管理器
线程组右键 -- 添加 -- 配置原件 -- HTTP Cookie管理器 如何定位到自己的cookie?以Google Chrome浏览器为例: 1.打开浏览器,打开开发者工具 2.登录站点 3 ...