【java】Spring Security源码中 的@PreAuthorize注解究竟在哪一个拦截器里进行判断的
@PermitAll
@PreAuthorize("isAnonymous()")
@PreAuthorize("permitAll")
各种写法都试过了,都是无效。根本无法直接请求这些免鉴权的接口。
能百度出来的写法都写全了。依然无效。
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
连源码都翻出来了,只看到在启动的时候,对这些注解的拦截构建,但是找不到在判断身份的时候,哪里有用上这些注解进行判断的。
最终还是被无情的拦截了,看了下源码,在第13个拦截器(貌似是最后一个拦截器)里被拦截了,看了下调试,发现用来判断是否可以通过的集合,是核心代码里面配置的拦截规则,并没有管我的注解。
核心代码
求助(看标题)。
吐槽一句,还是自己写权限控制舒服啊。。。。什么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