背景:自定义权限认证,一部分接口必须要有相应的角色权限,一部分接口面向所有访问者,一部分接口任何人都不能访问。但是在使用 SpringSecurity的过程中发现,框架会将没有指定角色列表的
URL资源
直接放行,不做拦截。
用户登录认证成功后,携带Token
访问URL资源
,spring security 根据Token(请求头Authorization中)
来分辨不同用户。
用户权限数据源是一个Map
:以 URL资源
为Key,以有权访问的Key的角色列表
为Value。
使用时发现当一个接口有Key,但是Value为空或null时,spring security 框架自动放行,导致了权限失效问题。
解决方法有两种:
第一种方法:
默认rejectPublicInvocations为false。
对需要控制权限的URL资源
添加标志,以防止roleList为空,跳过了权限验证.
公共权限设置为null,不进行权限验证
第二种方法:
配置rejectPublicInvocations为true
此后roleList为空,或者没有找到URL资源
时,都为拒绝访问
需要控制权限的URL资源
,即使对应角色为空,也会进行权限验证
公共权限设置为所有角色和匿名角色,不进行权限验证
package org.springframework.security.access.intercept;
/**
* 对安全对象(访问请求+用户主体)拦截的抽象类源码
*/
public abstract class AbstractSecurityInterceptor implements InitializingBean, ApplicationEventPublisherAware, MessageSourceAware {
// ... 其他方法省略
protected InterceptorStatusToken beforeInvocation(Object object) {
Assert.notNull(object, "Object was null");
final boolean debug = logger.isDebugEnabled();
if (!getSecureObjectClass().isAssignableFrom(object.getClass())) {