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. php异步任务处理: gearman

    Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡 准备软件包 gearmand-1.1.12.tar.gz gearman-1. ...

  2. ABAP div / mod的用法

    1.divdiv是用于取两数相除的商的,c = a div b,得到的c的值就是a除b的商.2.// 是用于取两数相除的结果的.c = a / b,如果c是i数据类型的,这个语法会进行四舍五入的.3. ...

  3. C++ 结构体多元素sort排序调用时的写法

    //总结一下,结构体数据排序的快速写法 //以后在遇到需要写的时候,不要迟疑快速写完 struct node { int u, v, w; }a[10000]; //假设该结构体有3个元素 //现在仅 ...

  4. 关于NIO编程

    NIO概述 什么是NIO? Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. Ja ...

  5. PYTHON 爬虫笔记六:PyQuery库基础用法

    知识点一:PyQuery库详解及其基本使用 初始化 字符串初始化 html = ''' <div> <ul> <li class="item-0"&g ...

  6. Ubuntu 17.4下如何安装VMwareTools

    解压vmware-tools-distrib 运行vmware-install.pl安装过程中间出现错误,要求选择"ifconfig"工具.由于ifconfig工具过时逐渐被各大厂 ...

  7. ES搜索排序,文档相关度评分介绍——Field-length norm

    Field-length norm How long is the field? The shorter the field, the higher the weight. If a term app ...

  8. 如何用js获取日期(转载)

    本文介绍了js获取日期的方法,可以获取前天.昨天.今天.明天.后天. 代码: <html> <head> <meta http-equiv="Content-T ...

  9. 【MFC】动态创建CMFCToolbar图标不显示问题

    最近遇到一个问题,需要动态的从xml文件读取一系列图标文件,加载到一个toolbar中,由于使用的是vs2008 with sp1 feature pack,自然想到用CMFCToolbar来做,思路 ...

  10. Stop logging "internal dummy connection" in Apache

    Apache 2.x keeps child processes alive by creating internal connections which appear in the log file ...