当前位置: 首页 > news >正文

Security6.2 中的SpEL 表达式应用(权限注解使用)

最近学习若依框架,里面的权限注解涉及到了SpEL表达式 @PreAuthorize("@ss.hasPermi('system:user:list')"),若依项目中用的是自己写的方法进行权限处理, 也可以只用security 来实现权限逻辑代码,下面写如何用security 实现。

security中  @PreAuthorize("hasPermission(Object target, Object permission)")  的hasPermission方法,是通过PermissionEvaluator实现,默认继承类是DenyAllPermissionEvaluator,所有方法返回false,所以注解后的结果只有拒绝权限;所以继承PermissionEvaluator重写hasPermission即可。

逻辑如下:

1、securityConfig文件上加入注解@EnableMethodSecurity,且引入自定义评估器:CustomPermissionEvaluator

2、编写CustomPermissionEvaluator文件

:security 6.2.1 中 EnableGlobalMethodSecurity 已弃用,改使用 EnableMethodSecurity 且prePostEnabled为ture,只需添加注解@EnableMethodSecurity 即可

package com.example.securityDemo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;/*** @description: security配置类* @author: mml* @create: 2024/01/26*/
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {// 引入自定义评估器@Beanstatic MethodSecurityExpressionHandler methodSecurityExpressionHandler(CustomPermissionEvaluator permissionEvaluator) {DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();handler.setPermissionEvaluator(permissionEvaluator);return handler;}@BeanUserDetailsService userDetailsService(){UserDetails user = User.withDefaultPasswordEncoder().username("mml").password("123").roles("USER").authorities("system:user:update","system:user:list").build();return new InMemoryUserDetailsManager(user);}/*** 是Spring Security 过滤器链,Spring Security 中的所有功能都是通过这个链来提供的* @date 2024/1/26*/@BeanSecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {// 拦截所有请求,但是不经过任何过滤器
//        return new DefaultSecurityFilterChain(new AntPathRequestMatcher("/**"));httpSecurity.authorizeHttpRequests(p -> p.anyRequest().authenticated()).csrf(c -> c.disable()).formLogin((form) -> form.loginPage("/login").permitAll());return httpSecurity.build();}}

自定义评估器代码

import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;import java.io.Serializable;
import java.util.Collection;/*** @description: 自定义权限评估器* @author: mml* @create: 2024/02/17*/
@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {// 获取当前用户的角色Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();for (GrantedAuthority authority : authorities) {// 权限判断if (antPathMatcher.match(authority.getAuthority(), (String) permission)){// 说明有权限return true;}}return false;}@Overridepublic boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {return false;}
}

接口层:

@RestController
public class UserController {@RequestMapping("/list")@PreAuthorize("hasPermission('/list','system:user:list')")public String list() {return "get list ";}@RequestMapping("/add")@PreAuthorize("hasPermission('/add','system:user:add')")public String add() {return "post add ";}
}

可以使用postman测试

测试结果如下:

list-有权限

add 方法-没有权限

security参考链接:方法安全 :: Spring Security

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录三刷day02
  • Tomcat(3)IDEA集成Tomcat新建web应用
  • python+django+vue汽车票在线预订系统58ip7
  • 网络安全(黑客)自学day1
  • Discuz! X收藏列表页调用封面图片详细教程
  • 【开源软件的影响力有多大?】
  • 嵌入式基础
  • 2024前端面试准备之Vue3篇
  • 60秒表达力训练法:快速提高表达能力,摆脱嘴笨带来的困扰
  • 蓝桥杯刷题--python-8(2023 填空题)
  • html的表格标签
  • 基于python+django+mysql的小区物业管理系统
  • 数字化转型导师坚鹏:政府数字化转型之数字化技术
  • 【使用IDEA总结】01——新增作者信息、方法参数返回值
  • 解决Edge浏览器,微博无法查看大图(Edge Image Viewer)
  • 【译】理解JavaScript:new 关键字
  • AWS实战 - 利用IAM对S3做访问控制
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • conda常用的命令
  • ECMAScript入门(七)--Module语法
  • HTTP那些事
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Java方法详解
  • React-redux的原理以及使用
  • Sass Day-01
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SQLServer之索引简介
  • Sublime Text 2/3 绑定Eclipse快捷键
  • uva 10370 Above Average
  • VuePress 静态网站生成
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 免费小说阅读小程序
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 山寨一个 Promise
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • linux 淘宝开源监控工具tsar
  • raise 与 raise ... from 的区别
  • 函数计算新功能-----支持C#函数
  • ​flutter 代码混淆
  • ​io --- 处理流的核心工具​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ## 基础知识
  • #pragam once 和 #ifndef 预编译头
  • (06)Hive——正则表达式
  • (1)常见O(n^2)排序算法解析
  • (4)Elastix图像配准:3D图像
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (办公)springboot配置aop处理请求.
  • (二)测试工具
  • (剑指Offer)面试题34:丑数
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他