Spring Boot 2.6之后,动态权限控制终于可以用起来了!
Spring Security 5.6 发布有些时间了。随着Spring Boot 2.6的发布Spring Security 5.6终于有机会上生产了。在Spring Security 5.6中动态权限控制更加清晰简单了,今天就带你来尝尝鲜。
节奏快起来
是的,现在不光Java在提速,连Spring的速度现在也提起来了。新的东西越来越多。现在Spring Boot的版本生命周期缩短了到半年,每半年就发一个版本。而Spring Security的版本生命周期也有类似的改变。
作为Spring工程师而言,学习的节奏也不得不加快了。这是一个残酷的事实,这里简单提一下,好了,我们回归正题。
Spring Security动态权限
如果你的接口权限非常稳定,我推荐你使用注解方式;反之,使用动态权限控制。动态权限控制更加灵活和贴近现实,但是开发成本也高。
最常见的方式
之前Spring Security提供的动态权限控制门槛挺高的,需要实现一个FilterInvocationSecurityMetadataSource
接口。而且目前网上大部分的教程还是这样的,因此就不再赘述了。
基于SpEL方式
上面方法的成本太高了,因此在后续的版本中基于Spring表达式语言又提供了一种可以实现动态权限的方式。这种方式有一定的要求:
首先要有一个Spring Bean。
这个Spring Bean必须包含一个公开方法;返回值为布尔值;参数列表有两个参数,第一个参数是当前认证的信息
Authentication
,第二个参数是当前请求HttpServletRequest
。很好理解就是拿着当前请求去和当前认证信息中包含的角色进行访问控制判断。然后按照
@bean名称.方法名(authentication,request)
的格式配置到HttpSecurity
对象中。
伪代码是这样的:
@BeanRoleChecker roleChecker() {// 包含了一个符合SpEL要求的方法// boolean check(Authentication authentication, HttpServletRequest request);return new JdbcRoleChecker();}
配置到HttpSecurity:
httpSecurity.authorizeRequests().anyRequest().access("@roleChecker.check(authentication,request)");
在Spring Security 5.6之前这样做是最简单的,需要你深入了解Spring Security和SpEL才行。
AuthorizationManager
Spring Security 5.6 增加了一个新的授权管理器接口AuthorizationManager<T>
,它让动态权限的控制接口化了。它用来检查当前认证信息Authentication
是否可以访问特定对象T
。上面的RoleChecker
不就是AuthorizationManager<HttpServletRequest>
么?AuthorizationManager
将这种访问决策抽象的更加泛化。
@FunctionalInterface
public interface AuthorizationManager<T> {default void verify(Supplier<Authentication> authentication, T object) {AuthorizationDecision decision = check(authentication, object);// 授权决策没有经过允许就403if (decision != null && !decision.isGranted()) {throw new AccessDeniedException("Access Denied");}// todo 没有null 的情况}// 钩子方法。@NullableAuthorizationDecision check(Supplier<Authentication> authentication, T object);}
在Spring Security 5.6中,我们就可以这样去实现了:
httpSecurity.authorizeHttpRequests().anyRequest().access((authenticationSupplier, requestAuthorizationContext) -> {// 当前用户的权限信息 比如角色Collection<? extends GrantedAuthority> authorities = authenticationSupplier.get().getAuthorities();// 当前请求上下文// 我们可以获取携带的参数Map<String, String> variables = requestAuthorizationContext.getVariables();// 我们可以获取原始request对象HttpServletRequest request = requestAuthorizationContext.getRequest();//todo 根据这些信息 和业务写逻辑即可 最终决定是否授权 isGrantedboolean isGranted = true;return new AuthorizationDecision(isGranted);});
这样门槛是不是低多了呢?
你还会选择每次修改权限都要打jar包发版的注解权限控制吗?
往期推荐
OAuth 2.0中的scope和RBAC中的role有什么关系
Spring Boot 2.6 正式发布:循环依赖默认禁止、增加SameSite属性...
Spring OAuth2 授权服务器配置详解
使用 @Transactional 时常犯的N种错误
授权服务框架Spring Authorization Server的过滤器链
技术交流群
最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!
点击阅读原文,送你免费Spring Boot教程!
Spring Boot 2.6之后,动态权限控制终于可以用起来了!相关推荐
- java 接口权限控制_手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!...
SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/- 摘要 权限控管理作为后台管理系统中必要的功能,mall项目中结合Spring Secu ...
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- Spring Boot 2 尝鲜-动态 Banner
Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来 ...
- Spring Security 实战干货: RBAC权限控制概念的理解
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...
- spring boot + mybatis + layui + shiro后台权限管理系统
后台管理系统 版本更新 后续版本更新内容 链接入口: springboot + shiro之登录人数限制.登录判断重定向.session时间设置:https://blog.51cto.com/wyai ...
- Spring Boot实现简单的用户权限管理(超详细版)
2020-11-21 更新:解决由于.yml文件引起的数据库链接问题 文章目录 一.前言 二.项目环境 三.项目文件结构 四.项目代码 数据库连接配置 1.Entity层 2.dao层 3.servi ...
- Spring Boot + Mybatis多数据源和动态数据源配置
转载自 http://blog.csdn.net/neosmith/article/details/61202084 网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种方式 ...
- Spring Boot实现定时任务的动态增删启停
欢迎关注方志朋的博客,回复"666"获面试宝典 作者 | jessehua 来源 | https://www.jianshu.com/p/0f68936393fd 在spring ...
- Spring Boot 实现定时任务的动态增删启停
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:jianshu.com/p/0f68936393fd 添加执 ...
最新文章
- 6、删除视图(DORP VIEW)
- AGAGA XOOORRR CodeForces - 1516B
- 设置MongoDB副本集分为4个步骤
- 深入Java核心:JVM中的栈和局部变量
- github push代码出错fatal: Authentication failed for ‘https:/
- delphi7下实现http的post_ASP.NET Core Web API 实现过程
- pytorch: 将一序列操作串联
- ImageView中的几个属性
- Java8 装逼for循环写法
- 安卓多媒体开发!Android高级工程师面试实战,系列篇
- 计算机视觉、模式识别、机器学习牛人主页
- 【计算机网络】因特网概述
- C语言比较两个字符串相等为什么不是用“==”
- 计算机设备维修预算申,维修费用申请报告
- 如何将多个PDF文件合并为一个PDF文件?PDF文件合并教程
- 单片机外围电路设计之五:三极管
- 树莓派入门(十) 树莓派系统升级
- 活跃用户增长与饿了么口碑相差近3倍,美团的下一步去哪儿?
- 计算机软件财务记账归入科目,开票用的电脑、打印机计入什么科目
- 我的世界服务器显示器,我的世界数字显示器怎么做 数字显示屏教程[图文+视频]...
热门文章
- win8中离线安装net framework 3.5
- postgresql的安装与配置
- linux yum install libsdl-dev 报错:No package libsdl-dev available 解决方法
- linux c 报错 warning: large integer implicitly truncated to unsigned type[-Woverflow]
- golang 全局变量
- python3 异步 asyncio get_event_loop new_event_loop 使用
- linux shell 数组添加元素
- python3 import 和__import__() 的区别
- linux sudo漏洞 可导致用户以 root 权限运行命令
- msvc/gcc:中用#pragma指令关闭特定警告(warning)