5.Spring Security安全注解

news/2025/2/21 14:22:10/

目录


1. Spring Security详细介绍

2. Spring Security详细使用

3. Spring Security实现JWT token验证

4. JWT(JSON Web Token,JSON令牌)

5. Spring Security安全注解




Spring Security安全注解(三种)

Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为Bean

如果要启用基于注解的方法安全性,要在配置类上使用**@EnableGlobalMethodSecurity**

①:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,jsr250Enabled = true,prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}

②:

@Configuration
@EnableWebSecurity  // 启用Spring Security
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)  // 拦截注解
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}

设置了securedEnabled = true,此时Spring将会创建一个切点,并将带有@Secured注解的方法防入切面中。同理,jsr250Enabled = true 与 prePostEnabled = true,分别表示启用@RolesAllowed与表达式驱动的注解

Controller中使用

@GetMapping(value = "/admin")
@Secured("ROLE_ADMIN")
public String admin(){return "admin";
}

(1)Spring Security自带注解:@Secured

当@EnableGlobalMethodSecurity(securedEnabled=true)的时候,@Secured可以使用:
功能:支持单一角色或者多个角色之间的任何一个角色,不支持spring EL表达式

@GetMapping("/helloUser")
// 拥有normal或者admin角色的用户都可以方法helloUser()方法
@Secured({"ROLE_normal","ROLE_admin"})
public String helloUser() {return "hello,user";
}

注意:匹配的字符串需要添加前缀“ROLE_”,如果要求,只有同时拥有admin & noremal的用户才能方法helloUser()方法,这时候@Secured就无能为力了


(2)JSR-250注解

如果选择使用@RolesAllowed的话,需要将@EnableGlobalMethodSecurity的jsr250Enabled属性设置为true,以开启此功能

注解描述
@DenyAll拒绝所有访问
@PermitAll允许所有访问
@RolesAllowed@RolesAllowed注解和@Secured注解在各个方面基本上都是一致的。唯一显著的区别在于@RolesAllowed是JSR-250定义的Java标准注解
@RequestMapping("/test")
@RolesAllowed("ROLE_ADMIN")
public String test1(){
return "test";
}
注解案例功能说明
@RolesAllowed({“USER”, “ADMIN”})该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN

(3)表达式驱动注解

基于表达式的注解,并可以自定义扩展,只需继承GlobalMethodSecurityConfiguration类就可以实现。当然,在该扩展类上添加注解:@EnableGlobalMethodSecurity(prePostEnabled = true)来启动这种注解支持。如果没有访问方法的权限,会抛出AccessDeniedException

当**@EnableGlobalMethodSecurity(prePostEnabled=true)**的时候,@PreAuthorize、@PostAuthorize、@PostFilter、@PreFilter可以使用

注解描述
@PreAuthorize在方法调用之前,基于表达式的计算结果来限制对方法的访问
@PostAuthorize允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PostFilter允许方法调用,但必须按照表达式来过滤方法的结果
@PreFilter允许方法调用,但必须在进入方法之前过滤输入值

Spring的@PreAuthorize/@PostAuthorize注解更适合方法级的安全,也支持Spring表达式语言,提供了基于表达式的访问控制

@PreAuthorize(最常用):方法进入之前

注解适合进入方法前的权限验证,@PreAuthorize可以将登录用户的roles/permissions参数传到方法中

注解案例功能说明
@PreAuthorize(“hasRole(‘ADMIN’)”)拥有ADMIN角色权限才能访问
@PreAuthorize(“hasRole(‘ADMIN’) AND hasRole(‘DBA’)”)拥有ADMIN角色和DBA角色权限才能访问
@PreAuthorize(“hasAnyRole(‘ADMIN’,‘DBA’)”)拥有ADMIN或者DBA角色均可访问
@GetMapping("/helloUser")
// 拥有normal或者admin角色的用户都可以方法helloUser()方法
@PreAuthorize("hasAnyRole('normal','admin')")
public String helloUser() {return "hello,user";
}

此时如果要求用户必须同时拥有normal和admin的话,那么可以这么编码:

@GetMapping("/helloUser")
@PreAuthorize("hasRole('normal') AND hasRole('admin')")
public String helloUser() {return "hello,user";
}

此时如果使用user/123登录的话,就无法访问helloUser()的方法了

@PostAuthorize

@PostAuthorize注解使用并不多,在方法执行后再进行权限验证,适合验证带有返回值的权限,Spring EL提供返回对象能够在表达式语言中获取返回的对象returnObject

@GetMapping("/helloUser")
@PreAuthorize("returnObject!=null && returnObject.username == authentication.name")
public User helloUser() {Object pricipal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();User user;if("anonymousUser".equals(pricipal)) {user = null;} else {user = (User) pricipal;}return user;
}

@PostFilter

在方法执行之后执行,而且这里可以调用方法的返回值,然后对返回值进行过滤或处理或修改并返回。EL变量return Object表示返回的对象。只有方法返回的是集合或数组类型的才可以使用。(与分页技术不兼容)
用于指定方法筛选表达式的注释,该表达式将在调用方法后进行计算

@PostFilter通过将规则应用于列表中的每个元素,定义了用于过滤方法返回列表的规则。如果评估值为true,则该项目将保留在列表中。否则,该项目将被删除

@PreFilter

在方法执行之前执行,而且这里可以调用方法的参数,然后对参数值进行过滤或处理或修改,EL变量filterObject表示参数,如有多个参数,使用filterTarget注解参数。只有方法参数是集合或数组才行。(很少会用到,与分页技术不兼容)

@PreFilter的工作方式非常相似,但是,过滤将应用于作为输入参数传递给带注释方法的列表


http://www.ppmy.cn/news/50141.html

相关文章

开发者必读!常用的二维码生成器 API 推荐

引言 二维码是一种能够存储信息的图形码,它在现代社会中扮演着越来越重要的角色。生成二维码的过程通常需要使用二维码生成器,而现在有很多二维码生成器 API 可以供开发者使用。 在本文中,我们将讨论二维码生成器 API 的工作原理、应用场景…

【Cisco Packet Tracer| 四.跨交换机VLAN实验】

文章目录 一.连接实验拓扑图并设置主机IP地址1.连接实验拓扑图2.设置主机的IP地址 二.划分VLAN前测试是否ping通三.划分VLAN1.给主机划分VLAN2.给交换机之间的f0/24端口从Access模式切换到Trunk模式 四.划分VLAN后测试是否ping通五.另一种测试方式-信封图标 一.连接实验拓扑图并…

如何衡量 SLO 的有效性?

衡量 SLO 及错误预算策略是否有效,其实就是看实际运行后,是否真的能达到我们的期望。我们可以从下面三个关键维度来看。 SLO 达成情况。我们用达成(Met),或未达成(Missed)来表示。“人肉”投入…

Docker私有仓库Harbor搭建及使用

文章目录 一、Harbor简介二、Harbor仓库部署三、Harbor仓库使用 一、Harbor简介 官网地址:https://github.com/goharbor/harbor Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等…

深入剖析 grep 命令

目录 介绍 正则表达式 基本用法 1. 在单个文件中查找一个单词 2. 在多个文件中查找一个单词 3. 查找包含某个字符串的文件 4. 使用正则表达式搜索 5. 统计匹配行数 高级用法 1. 在结果中显示匹配文本 2. 排除特定的文件或目录 3. 将匹配的行写入到文件中 4. 搜索特…

【面试】你在项目中遇到过慢查询问题吗?你是怎么做SQL优化的?

文章目录 前言一、找出有问题的SQL1、系统层面2、SQL语句层面 二、查看SQL执行计划三、SQL优化案例慢查询优化步骤 SQL优化小结 前言 我在面试的时候很喜欢问候选人这样一个问题:“你在项目中遇到过慢查询问题吗?你是怎么做SQL优化的?” 很多…

gpt.4.0-gpt 国内版

gpt 使用 GPT(Generative Pre-trained Transformer)是一种预训练的语言模型,可用于多种自然语言处理任务,如情感分析、文本分类、文本生成等。下面是使用GPT的一些步骤和建议: 确定任务和数据集:首先&…

Java核心技术 卷1-总结-17

Java核心技术 卷1-总结-17 同步条件对象synchronized关键字 同步 条件对象 通常,线程进入临界区,却发现在某一条件满足之后它才能执行。要使用一个条件对象来管理那些已经获得了一个锁但是却不能做有用工作的线程。这时需要用到Java库中条件对象的实现…