Spring Security源码中 的@PreAuthorize注解究竟在哪一个拦截器里进行判断的

发布于 2022-09-11 17:03:35 字数 821 浏览 38 评论 0

@PermitAll
@PreAuthorize("isAnonymous()")
@PreAuthorize("permitAll")

各种写法都试过了,都是无效。根本无法直接请求这些免鉴权的接口。


能百度出来的写法都写全了。依然无效。

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

连源码都翻出来了,只看到在启动的时候,对这些注解的拦截构建,但是找不到在判断身份的时候,哪里有用上这些注解进行判断的。

图片描述


最终还是被无情的拦截了,看了下源码,在第13个拦截器(貌似是最后一个拦截器)里被拦截了,看了下调试,发现用来判断是否可以通过的集合,是核心代码里面配置的拦截规则,并没有管我的注解。
图片描述


核心代码
图片描述


求助(看标题)。
吐槽一句,还是自己写权限控制舒服啊。。。。什么shiro和springsecurity都是浮云。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柳若烟 2022-09-18 17:03:35
拿这个来说@PreAuthorize("isAnonymous()") 
判断条件是isAnonymous(), 走的是这个方法    
org.springframework.security.access.expression.SecurityExpressionRoot#isAnonymous()

@PreAuthorize("hasRole('ADMIN')") 走下面这个方法
org.springframework.security.access.expression.SecurityExpressionRoot#hasRole
当然休要自己添加ADMIN这个role;

/**
 * Base root object for use in Spring Security expression evaluations.
 * 用于Spring Security表达式计算的基本根对象
 * @author Luke Taylor
 * @since 3.0
 */
public abstract class SecurityExpressionRoot implements SecurityExpressionOperations;

public @interface PreAuthorize {
    /**
     * @return the Spring-EL expression to be evaluated before invoking the protected
     * method 
     * 这个值基本是上面的判断方法
     */
    String value();
}

通过这个方法调用来执行isAnonymous和hasRole方法
    org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor#invoke

@EnableGlobalMethodSecurity 是开启注解的作用
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文