• Spring Security 表达式(Expressions)


    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

  • 相关阅读:
    Vue 环境配置
    Vue-think脚手架
    搭建vue环境网站
    数组 还是 字符串
    javascript jquery console调试方法说明
    获取 stoken 或者id MVC写法
    它山之石
    Android学习笔记_44_apk安装、反编译及防治反编译
    (转)超级实用且不花哨的js代码大全
    Android学习笔记_43_网络通信之文件断点上传
  • 原文地址:https://www.cnblogs.com/xjknight/p/10887791.html
Copyright © 2020-2023  润新知