SpringSecurity 实现拥有者(owner)才能访问接口 的一些想法 (AccessDecisionVoter/ @PreAuth)

文章探讨了在处理非owner用户的权限拦截时,从使用@PostAuthorize进行后置拦截到转向@PreAuthorize进行前置效验的转变。作者提到了@PostAuthorize的两个缺点,包括需要返回用户数据和在更新操作时的数据回滚问题。然后介绍了尝试使用AccessDecisionVoter的方案,但发现该方案与执行路径耦合。接着,作者提出了自定义@PreAuth方法和使用EL表达式的方法,最后找到了更简洁的实现,即通过@PreAuthorize直接调用Request参数进行判断,利用SpringContext工具类获取上下文信息,从而提高了代码的效率和可读性。

具体思路:最开始想使用@PostAuthorize 对非owner用户进行后置拦截,
方法中查出来,再返回
但是想了想 这样有两个缺点: 1. 必须返回用户的数据 (用户名/ID之类的可以用于与authtication效验的)
2. 如果是update,则需要对数据进行回滚

所以:希望可以实现 在执行业务方法之前对数据进行效验

1. 最开始的实现方式: 查了一些资料 ,其中提到可以使用AccessDecisionVoter 进行效验,
但是缺点也很明显, 我的实现方式中执行路径与参数名耦合

在这里插入图片描述
2. 自定义@PreAuth中的方法:
如图 _keyword 是request中的参数名,_elMethod 可以理解是可以被EL表达式解析的方法字符串
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/ae1089ece815408aa3aa71afbac7d965.png

如图:具体的使用方法,传入需要被解析的paramName,然后提供一个方法的EL表达式字符串

在这里插入图片描述
勉强也能实现吧,但是我发现了更更更更更更正常的实现方法,让我之前的想法都变得很蠢

@PreAuthorize调用Request参数方法进行判断:

具体实现: 主要是 GetCreator()方法
在这里插入图片描述

在这里插入图片描述
定义一个能获取到SpringContext上下文的工具类即可
在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值