ruoyi-vue版本(二十九)Spring Security 安全框架的使用与解析

2023-07-08 18:51:07 浏览数 (2)

1 Spring Security 简介

springboot系列学习(二十四):springboot项目里面整合spring Security框架。一步一步带你整合使用,小白必看(一)

springboot系列学习(二十五):springboot项目里面整合spring Security框架。一步一步带你整合使用,小白必看(二)

springboot系列学习(二十八): springsecurity自定义的登录的逻辑,也就是我们从数据库中拿用户名和密码 (五)

springboot系列学习(二十九): springsecurity自定义的登录的逻辑,也就是我们从数据库中拿用户名和密码 (二)

2 Spring Security 配置介绍

2.1 @EnableWebSecurity 和 @EnableGlobalMethodSecurity 区别

代码语言:javascript复制
@EnableWebSecurity和@EnableGlobalMethodSecurity是
Spring Security框架中的两个注解,用于配置安全性相关的功能。
它们之间的区别如下:


@EnableWebSecurity:这个注解用于启用Web安全性配置。
当您在Spring Boot应用程序中使用Spring Security时,
通常会在一个配置类上添加@EnableWebSecurity注解。
它允许您自定义Web安全性配置,例如配置认证提供者、
设置登录页面、配置访问规则等。通过使用@EnableWebSecurity,
您可以自定义应用程序的全局安全性配置。


@EnableGlobalMethodSecurity:这个注解用于启用方法级别
的安全性配置。当您需要在方法级别对特定方法进行安全性控制时,
可以在配置类上添加@EnableGlobalMethodSecurity注解。
它允许您在方法上使用注解(例如@PreAuthorize、@PostAuthorize等)
来定义方法的访问规则和权限要求。通过使用
@EnableGlobalMethodSecurity,您可以在应用程序
中实现更精细的方法级别的安全性控制。


总结起来,@EnableWebSecurity用于全局的Web安全性配置,而
@EnableGlobalMethodSecurity用于方法级别的安全性配置。
您可以根据需求选择在配置类上添加这些注解来实现相应的安全性功能。

2.2 注解说明

代码语言:javascript复制
A. prePostEnabled = true:会开启 @PreAuthorize 
和 @PostAuthorize 两个注解。
@PreAuthorize注解会在方法执行前进行验证,
支持Spring EL表达式;
@PostAuthorize 注解会在方法执行后进行验证,
不经常使用, 适用于验证带有返回值的权限。
Spring EL提供了returnObject,
用于能够在表达式语言中获取返回的对象信息;

B. securedEnabled = true:
会开启@Secured 注解,
用来定义业务方法的安全配置,
在调用的接口或方法上使用该注解。
在需要安全控制(一般使用角色或者权限进行控制)的方法上指定@Secured,
达到只有具备那些角色/权限的用户才可以访问该方法。

指定角色时必须以ROLE_开头,不可省略;

不支持Spring EL表达式;如果想要使用@Secured注解指定"AND"条件,
即调用deleteAll方法需同时拥有ADMIN和DBA角色的用户时,

@Secured便不能实现,只能使用@PreAuthorize/@PostAuthorize注解。

3 @PreAuthorize 这个注解的参数是写什么

@PreAuthorize是Spring Security框架提供的注解之一,用于在方法执行之前对访问权限进行预验证。它可以应用于方法级别或者控制器级别的方法上。

@PreAuthorize注解的参数是一个SpEL(Spring Expression Language)表达式,用于定义访问权限的条件。SpEL表达式可以使用方法参数、Spring Security的安全表达式语言、上下文变量等来定义权限条件。

@PreAuthorize注解的使用逻辑如下:

当调用带有@PreAuthorize注解的方法时,Spring Security会在方法执行之前评估注解中定义的权限条件。 如果权限条件满足(即为true),则方法会被执行;否则,将抛出AccessDeniedException异常,表示访问被拒绝。 @PreAuthorize注解的出现是为了简化在方法级别进行权限验证的过程。通过将权限验证逻辑直接注解在方法上,开发人员可以更方便地定义和管理访问控制规则,而无需在每个方法中编写显式的权限检查代码。

以下是一个示例展示了@PreAuthorize注解的使用:

代码语言:javascript复制
import org.springframework.security.access.prepost.PreAuthorize;

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void deleteProduct(int productId) {
    // 删除产品的逻辑
}

在上述示例中,deleteProduct()方法使用了@PreAuthorize注解,并且指定了hasRole(‘ROLE_ADMIN’)作为权限条件。这意味着只有具有"ROLE_ADMIN"角色的用户才能调用该方法进行产品删除操作。

@PreAuthorize注解的出现可以提高代码的可读性和可维护性,同时也简化了权限验证的逻辑处理。

4 @PreAuthorize(“@ss.hasPermi(‘monitor:job:list’)”) 代表的意思

@PreAuthorize(“@ss.hasPermi(‘monitor:job:list’)”) 是一个使用了@PreAuthorize注解的方法级别权限验证的例子。

这个注解的意思是,在调用被注解的方法之前,将会进行权限验证。具体的权限验证逻辑由@PreAuthorize注解中的SpEL表达式定义。

@ss.hasPermi(‘monitor:job:list’) 是一个自定义的SpEL表达式,用于检查当前用户是否具有执行名为monitor:job:list的权限。hasPermi()是一个自定义的方法,用于检查用户是否具有指定的权限。

在这个例子中,@PreAuthorize(“@ss.hasPermi(‘monitor:job:list’)”) 的意思是,只有在当前用户具有执行monitor:job:list权限时,才能调用被注解的方法。

这种方式可以通过自定义的权限检查逻辑,灵活地定义和管理方法级别的访问控制规则。

请注意,@PreAuthorize注解需要与Spring Security一起使用,并正确配置了权限验证的策略和访问控制规则。

5 参数里面的@ 是什么意思,为什么这么写

在@PreAuthorize(“@ss.hasPermi(‘monitor:job:list’)”)中,@符号是用于表示SpEL表达式的开始。SpEL(Spring Expression Language)是一种用于在运行时评估表达式的语言。

@PreAuthorize注解中的参数需要是一个SpEL表达式,用于定义访问权限的条件。为了表示这是一个SpEL表达式,需要在表达式的开始处添加@符号。

为什么要使用@符号呢?这是为了与普通的Java代码进行区分。在Java代码中,@符号通常用于注解的表示,而在SpEL表达式中,@符号用于表示表达式的开始。

通过在@PreAuthorize注解中使用@符号,可以明确指示其参数是一个SpEL表达式,并将其与普通的Java代码进行区分。

例如,@PreAuthorize(“@ss.hasPermi(‘monitor:job:list’)”)中的"@ss.hasPermi(‘monitor:job:list’)"就是一个SpEL表达式,其中@ss表示调用名为ss的对象或方法,hasPermi(‘monitor:job:list’)是该对象或方法的具体调用或表达式。

这种写法使得在注解中可以直接使用SpEL表达式来定义权限验证的条件,提供了更灵活和强大的访问控制规则的定义方式。

0 人点赞