首页 > 其他分享 >SpringSecurity中注解讲解

SpringSecurity中注解讲解

时间:2023-09-08 11:56:40浏览次数:35  
标签:PreAuthorize Spring SpringSecurity 讲解 注解 权限 方法 public

目录

1 @EnableGlobalMethodSecurity

@EnableGlobalMethodSecuritySpring Security中的一个注解,用于启用全局方法安全性。
其中属性prePostEnabledsecuredEnabled都是它的属性,分别表示是否允许使用@PreAuthorize@Secured注解来控制方法的访问权限。
prePostEnabledtrue时,表示允许使用@PreAuthorize@Secured注解来控制方法的访问权限;当securedEnabledtrue时,表示允许使用@Secured注解来控制方法的访问权限。

点击此处了解 SpringSecurity和JWT实现认证和授权

1.1 @PreAuthorize

@PreAuthorizeSpring Security 提供的注解之一,用于在方法执行之前进行权限验证。通过使用 @PreAuthorize 注解,可以在方法级别对用户的权限进行校验,只有具备相应权限的用户才能执行被注解的方法。

@PreAuthorize注解会在方法执行前进行权限验证,支持Spring EL表达式,它是基于方法注解的权限解决方案

1.1.1 开启注解

SpringSecurity配置类上添加 @EnableGlobalMethodSecurity(prePostEnabled = true) 注解,以开启方法级别的权限验证,并支持 @PreAuthorize 注解。

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

1.1.2 使用注解原生方法

在方法上添加 @PreAuthorize 注解:找到需要进行权限验证的方法,在方法上添加 @PreAuthorize 注解,并指定相应的权限表达式

@PreAuthorize 注解支持丰富的权限表达式,可以根据具体的需求进行配置。例如,可以使用 hasRole('ROLE_ADMIN') 来验证用户是否具备指定角色,或者使用 hasAuthority('PERMISSION_ADD_USER') 来验证用户是否具备指定权限。

通过使用 @PreAuthorize 注解,可以对方法进行细粒度的权限控制,确保只有授权的用户才能执行对应的方法。

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void adminOnlyMethod(){

}

1.1.3 使用注解自定义方法

@GetMapping("/{reportId}" )
@PreAuthorize("@test.hasPermission('archsys_sysarchreport_view')" )
public R getById(@PathVariable("reportId" ) Long reportId) {
    return R.ok(sysArchReportService.getById(reportId));
}

@PreAuthorize("@test.hasPermission('archsys_sysarchreport_view')" )

  • test:是一个注册在 Spring 容器中的 Bean,对应的类是 cn.test.PermissionService;
    hasPermissionPermissionService类中定义的方法;
    当Spring EL 表达式返回TRUE,则权限校验通过;
    PermissionService.java的定义如下:
@Service("test")
public class PermissionService {	
	public boolean hasPermission(String... permissions) {
		if (ArrayUtil.isEmpty(permissions)) {
			return false;
		}
		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
		if (authentication == null) {
			return false;
		}
		Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
		return authorities.stream().map(GrantedAuthority::getAuthority).filter(StringUtils::hasText)
				.anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x));
	}
 
}

1.2 @PostAuthorize

在方法执行后再进行权限校验,适合验证带有返回值的权限

先要开启注解功能

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

使用

@PostAuthorize("hasAnyAuthority('write')")
@RequestMapping(value = "/testPostAuthorize")
@ResponseBody
public String postAuthorize() {
    System.out.println("方法进入了。。。。");
    return "preAuthorize";
}

1.3 @Secured

判断是否具有角色,注意这里匹配的字符串需要添加前缀ROLE_

开启注解功能

@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

在控制器方法上添加注解

@Secured({"ROLE_read"})
@RequestMapping(value = "/testSecured")
@ResponseBody
public String testSecured() {
    return "testSecured";
}

2 其他注解

2.1 @PostFilter

@PostFilterSpring Security框架中的一个注解,用于在请求处理之后对请求进行过滤。
该注解可以应用于方法级别或类级别,用于指定只有满足特定条件的请求才能通过过滤器。例如,我们可以使用@PostFilter注解来限制只有经过身份验证的用户才能访问某个接口。

在方法级别上,@PostFilter注解的语法如下:

@RestController
public class MyController {
    @PostFilter("hasRole('ADMIN')")
    @GetMapping("/admin")
    public String admin() {
        // ...
    }
}

其中,hasRole('ADMIN')是一个预定义的条件表达式,表示只有拥有ADMIN角色的用户才能访问该方法。如果用户没有该角色,则无法访问该方法。

2.2 @PreFilter

进入控制器之前对数据进行过滤
@PreFilterSpring Security 框架中的一个注解,用于在请求处理之前对请求进行过滤。
该注解可以应用于方法级别或类级别,用于指定只有满足特定条件的请求才能通过过滤器。例如,我们可以使用@PreFilter注解来限制只有拥有特定角色的用户才能访问某个接口。

在方法级别上,@PreFilter注解的语法如下:

@RequestMapping("/getTestPreFilter")
@PreFilter("hasRole('ADMIN')")
@ResponseBody
public List<UserPO> getTestPreFilter(@RequestBody List<UserPO> list) {
    list.forEach(t -> {
        System.out.println(t.getId() + "\t" + t.getUsername());
    });
    return list;
}

3 权限表达式

Spring Security中,权限表达式是一种控制访问权限的方式。它可以通过方法级别的注解@PreAuthorize@PostAuthorize@PreFilter@PostFilter来实现。其中,@PreAuthorize@PostAuthorize注解用于控制方法级别的访问权限,而@PreFilter@PostFilter注解用于控制请求级别的过滤。

除了这些注解之外,Spring Security还提供了一些其他的注解和类来实现权限控制。例如,可以使用WebExpressionVoter类来解析权限表达式,并根据表达式的结果来判断用户是否拥有对应的权限。此外,还可以使用SecurityExpressionRoot类来构建表达式,并将其应用于URL路径或方法上。

标签:PreAuthorize,Spring,SpringSecurity,讲解,注解,权限,方法,public
From: https://www.cnblogs.com/jingzh/p/17687218.html

相关文章

  • @Override注解
    @Override是一个Java注解(Annotation),它用于表示一个方法(包括构造方法和非静态、非私有的方法)重写(覆盖)了其父类或实现的接口中的方法1。使用@Override注解可以让编译器帮助我们检查方法是否正确地覆盖了父类或接口中的方法,以避免在运行时出现意外情况。如果父类或接口中没有要重写......
  • @Component注解
    @Component是Spring框架中的一种注解,用于标注一个类作为组件。@Component注解可以标注一个类,这个类将会被Spring容器自动创建和管理。使用@Component注解标注的类,可以通过Spring提供的API进行获取和管理,也可以通过@Autowired注解将该类的实例注入到其他类中。除了@Component,Spr......
  • @Documented注解
    @Documented注解是一个标记注解,用于指示将被注解的元素包含在生成的Java文档中1。它本身没有任何属性或配置选项,通常用于自定义注解时,确保其注解信息能在生成的文档中显示1。例如:如果声明注解时指定了@Documented,则它会被javadoc之类的工具处理,所以注解类型信息也会被包括在生成......
  • [SpringSecurity5.6.2源码分析四]:WebSecurityConfiguration
    WebSecurityConfiguration的重点是通过WebSecurity创建FilterChainProxy• 先分析内部的方法1、elegatingApplicationListener• 看名字就能看出来注册了一个委托类型的监听器publicclassWebSecurityConfigurationimplementsImportAware,BeanClassLoaderAware{............
  • @Scheduled注解与参数
    基本参数用法@Scheduled由Spring定义,用于将方法设置为调度任务。如:定时执行一次或定时轮询执行一段代码)参数详解1、fixedDelay上一次任务执行完毕时间点之后多长时间再执行,任务的执行要等上一个任务执行结束。@Scheduled(fixedDelay=60*60*1000)  //每隔1小时执行2、fixedRate......
  • 详细讲解斐波那契数
    前置知识斐波那契数列是一种经典的数学序列,它以递归的方式定义。斐波那契数列的前两个数是0和1,之后的每个数都是前两个数之和。换句话说,数列中的每个数(从第三个数开始)都是前两个数之和。斐波那契数列的数学表达式如下:F(0)=0F(1)=1F(n)=F(n-1)+F(n-2)(对于n≥2)根......
  • springsecurity
    编辑 pom.xml,添加 spring-boot-starter-securtiy 依赖即可。添加后项目中所有的资源都会被保护起来。<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-security</artifactId></dependency>编写SecurityConfig......
  • Spring注解开发
    在Spring4之后,要使用注解开发,必须保证aop的依赖包导入。这里我们在maven的pom.xml中导入spring-webmvc这个大的依赖整合包就可以了。<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.11</version></d......
  • java http传参及使用的注解
    javahttp传参及使用的注解:TTP协议组成协议内容示例对应Spring注解pathinfo传参/articles/12(查询id为12的文章,12是参数)@PathVariableURLQueryString传参/articles?id=12@RequestParamBody传参Content-Type:multipart/form-data@RequestParamBod......
  • Spring 参数校验注解失效
    问题描述使用@Notnull、@Max、@Min等参数校验注解时失效。解决在Controller层请求参数前加入@Valid注解//查询用Get@GetMapping("/query-list")//@Valid让req中的验证注解生效publicCommonResp<List<PassengerQueryResp>>queryList(@ValidPasse......