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

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

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


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

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


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

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


最终还是被无情的拦截了,看了下源码,在第13个拦截器(貌似是最后一个拦截器)里被拦截了,看了下调试,发现用来判断是否可以通过的集合,是核心代码里面配置的拦截规则,并没有管我的注解。
【java】Spring Security源码中 的@PreAuthorize注解究竟在哪一个拦截器里进行判断的


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


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

回答

拿这个来说@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 是开启注解的作用

以上是 【java】Spring Security源码中 的@PreAuthorize注解究竟在哪一个拦截器里进行判断的 的全部内容, 来源链接: utcz.com/a/74865.html

回到顶部