我已经覆盖了 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 方法添加。
有什么问题?