0

我在我的应用程序中使用 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 已经停止工作。在我自己的代码中,我可以获得此处提到的身份验证实例,但不能在 ACL 的源文件中。

我想一次性在配置中做一些事情,这样即使我在 SecurityConfiguration 中提供了 url,我仍然可以获得 SecurityContextHolder.getContext().getAuthentication() 实例。

4

0 回答 0