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示例的更多相关文章

  1. spring security之httpSecurity使用示例

    如果在HttpSecurity中配置需要authenticate(),则如果没有登陆,或没有相关权限,则会无法访问 2017-01-02 23:39:32.027 DEBUG 10396 --- [n ...

  2. SpringBoot 整合 spring security oauth2 jwt完整示例 附源码

    废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...

  3. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  4. Spring Security(三十五):Part III. Testing

    This section describes the testing support provided by Spring Security. 本节介绍Spring Security提供的测试支持. ...

  5. Spring Security(十二):5. Java Configuration

    General support for Java Configuration was added to Spring Framework in Spring 3.1. Since Spring Sec ...

  6. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  7. Spring Security(16)——基于表达式的权限控制

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  8. Spring Security教程之基于表达式的权限控制(九)

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  9. Spring Security -SpEL表达式

    Spring Security -SpEL表达式 开启SpEL表达式 <!-- use-expressions是否开启 SpEL表达式 o.s.s.web.access.expression.W ...

随机推荐

  1. DLL的静态调用和动态调用

    // ------------------------------------DLL源代码 circle.dproj -------------------------------------libr ...

  2. php总结2——php中的变量、数据类型及转换、运算符、流程控制中的分支结构

    2.1  php中的变量: 定义变量:$变量名称=值: 变量名称:$开头    $之后的第一位必须是字母    $第二位之后可以是字母.数字或者是下划线.习惯上变量名称有实际含义,第二个单词后首字母大 ...

  3. 我的Java开发学习之旅------>Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  4. 利用wxpython显示OpenCV图像

    核心代码 import wx, cv2 import numpy as np # Start with a numpy array style image I'll call "source ...

  5. Extjs — Grid数据导出成Excel

    最近因为项目问题,需要解决Extjs导出成Excel的问题. 下面简单描述这个问题解决的步骤如下: 1.先在js文件里写了一个button的handler事件,通过点击按钮,来实现调用ExportEx ...

  6. 《avascript 高级程序设计(第三版)》 ---第三章 基本概念

    本章主要介绍Javasript语言的一些语法: 1.严格模式:开启:"use strict"; 2.变量:全部用var来定义,在函数中使用的称为局部变量,不能全局使用. 3.数据类 ...

  7. windows server 2008 r2 下发布网站excel有时候无法下载文档

    最近将公司网站服务器更新了系统,从win2003 到 win2008 r2 (64bit),一切正常,但是使用网站的过程中发现了一个比较奇怪的问题,就是,有时候网站的excel文档无法下载,但是我什么 ...

  8. python类初探

    class human: is_alive=True is_man=True def __init__(self,age): print('this is __init__() method, whi ...

  9. 高效上网教程---资源软件搜索技巧(搜索好用软件或者app去哪些网站)

    高效上网教程---资源软件搜索技巧(搜索好用软件或者app去哪些网站) 一.总结 一句话总结:查看下面这些网站用户推荐的 知乎:比如 小众软件 site:zhihu.com 简书:查看你需要的用户推荐 ...

  10. FZU 2091 播放器 (栈)

    记住:!!!栈用完之后,在下次使用的时候一定要初始化!!花费了我一上午的时间,最后还是某杰想出来的. 题意:实现一个音乐播放器的操作,有3种操作. 注意:一开始播放器会播放播放列表中的第一首歌,也就是 ...