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

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

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


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

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

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

图片描述


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


核心代码
图片描述


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

阅读 8.9k
1 个回答
拿这个来说@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 是开启注解的作用
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题