通过注释的 Spring 授权不适用于自定义身份验证

Posted

技术标签:

【中文标题】通过注释的 Spring 授权不适用于自定义身份验证【英文标题】:Spring Authorization via Annotations not working with custom Authentication 【发布时间】:2012-01-03 18:47:47 【问题描述】:

我已经覆盖了 BasicAuthenticationFilter 并将其替换为我们的过滤器以从 db 获取自定义身份验证对象并通过

SecurityContextHolder.getContext().setAuthentication(auth);

这是安全配置的重要部分:

<http use-expressions="true" entry-point-ref="authEntryPoint">
    <custom-filter position="BASIC_AUTH_FILTER" ref="basicProcessingFilter" />
    <intercept-url pattern="/**" access="hasRole('user')"/>
</http>
<beans:bean id="authEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/login"/>
</beans:bean>
<global-method-security jsr250-annotations="enabled"/>

我还提供了我自己的 AuthenticationProvider,它只是一个无操作,因为身份验证过程已经在自定义过滤器中完成:

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException 
    logger.info("user:" + authentication.getPrincipal() + " pw:" + authentication.getCredentials());
    authentication.setAuthenticated(false);        
    return authentication;


@Override
public boolean supports(Class<? extends Object> authentication) 
    return MyAuthentication.class.isAssignableFrom(authentication);

现在,Spring 在启动时正确打印每个方法所需的角色,因此它可以正确检测注释。例如。删除方法的“管理员”角色:

2011-11-22 11:47:09,474 [main] 调试 org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource - 添加安全方法 [CacheKey[com.somecompany.SomeClass; public com.somecompany.ReturnType com.somecompany.SomeClass.delete()]] 具有属性 [admin]

但 Spring 不会以某种方式检查用户是否具有此角色。 相反,它会回退到安全上下文 xml 文件的 http 标记中定义的全局模式。所以,例如如果我使用角色用户访问此删除方法:[“user”],它将接受它,因为 http 标签中的 hasRole('user')。

初始化 DefaultFilterInvocationSecurityMetadataSource 对象时可能有问题,因为它不会填充删除方法的特定规则!?只有 http-tag 定义的规则是通过 addSecureUrl 方法添加的。

可能出了什么问题?

【问题讨论】:

【参考方案1】:

移动

<global-method-security jsr250-annotations="enabled"/>

从 spring 安全上下文到我“扫描”类的上下文(即我的应用程序上下文)有帮助。感谢this answer的cmets@

【讨论】:

以上是关于通过注释的 Spring 授权不适用于自定义身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Spring 安全忽略 url 不适用于我们的安全忽略方法 [重复]

Spring Boot @ControllerAdvice 部分工作,不适用于自定义异常

spring boot spring security 基于自定义令牌的身份验证和自定义授权

UIButton setImage 不适用于自定义注释视图

自定义授权适用于操作级别,但不适用于控制器级别

Spring Boot 自定义授权标头请求根本没有通过