我在我的应用程序中使用Spring Security,并且暴露了REST API。 API对尝试访问API的用户进行身份验证,并且我使用的是Spring的ACL实现(放置为注释PreAuthorize,PostAuthorize等)。
问题是,有些资源可以由未登录的用户访问,而某些资源的操作只能由登录用户使用。为了提供对未登录用户的访问,我已将这些URL添加到SecurityConfiguration类:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@ImportResource("classpath:acl-config.xml")
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers("/api/v1/resource1")
.antMatchers("/api/v1/resource2")
....
现在的问题是,每当有人访问resource1或resource2时,SecurityContextHolder.getContext()。getAuthentication()都会返回null。这导致了问题,因为我正在使用Spring的ACL实现,并且实现的源文件使用SecurityContextHolder.getContext()。getAuthentication()方法并获得null作为回报。所以ACL已经停止工作了。在我自己的代码中,我可以获得here所述的身份验证实例,但不能访问ACL的源文件。
我想在配置中做一些事情,所以即使我在SecurityConfiguration中提供url,我仍然可以获得SecurityContextHolder.getContext()。getAuthentication()instance。