gpt4 book ai didi

java - Spring Security AnonymousAuthFilter 与 PreAuthenticationFilter 允许未经授权的请求

转载 作者:行者123 更新时间:2023-12-02 04:31:15 24 4
gpt4 key购买 nike

我的 Spring MVC Web 应用程序中有一个相当简单的 Spring Security 配置。我正在从远程 Web 应用程序接收 REST 请求,这些请求通过我的预身份验证过滤器进行身份验证。我只是在请求中查找 header ,如果存在,我将返回该字符串值(即用户名)作为身份验证对象。这工作得很好,当请求进来时,用户就会得到身份验证。

无论出于何种原因,每当我尝试强制执行基于模式的安全性 antMatcher 或 Controller 方法注释的安全性时,都会导致客户端收到 CORS 错误。我必须保持访问完全开放,以允许在这个跨域环境中发生实际请求。

我的问题是,一段时间后, session 似乎过期了。当用户点击我的 Controller 之一并且我尝试从主体对象获取用户名时,我收到 NullPointerException,因为主体为空。一旦过期,AnonymousAuthFilter 就会启动并允许用户以匿名身份连接。

我假设我不想要完全无状态的身份验证 session ,因为我也在使用 websockets 的 session ,并且当我使用消息模板“convertAndSendToUser”时,我需要提供用户名和 Spring 需求查找 websocket session 。但是,我想强制安全链识别传入请求是否未分配主体,以强制请求通过我的 PreAuthFilter 返回并重新建立 session 。

这可能吗?

这是我的安全配置文件中的配置方法的快速概述:

@Override
protected void configure(HttpSecurity http) throws Exception {
// Create authentication providers and authentication manager
List<AuthenticationProvider> authenticationProviders = new ArrayList<>(1);
AuthenticationProvider authProvider = preAuthenticatedAuthenticationProvider();
authenticationProviders.add(authProvider);
AuthenticationManager authenticationManager = authenticationManager(authenticationProviders);

// Create the pre-authentication filter
MyPreAuthFilter myPreAuthFilter = myPreAuthFilter(authenticationManager);
myPreAuthFilter.setAuthenticationManager(authenticationManager);

// configure http security
http
.csrf().disable()
.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
.and()
.authenticationProvider(authProvider)
.addFilter(myPreAuthFilter)
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/stomp/**").permitAll()
.antMatchers("/**").permitAll();
}

更新:所以我刚刚了解了 http 对象上的这个方法:

.anonymous().disable()

但是,当我使用它时,我所有的 CORS 请求再次失败。我认为问题在于预检 OPTIONS 请求。这无法进行身份验证——它需要匿名访问。因此,我认为要从跨域身份验证中获得我想要的行为,我需要禁用匿名过滤器,但这样做会破坏能够执行跨域请求的关键租户之一。啊。有人知道如何禁用除选项之外的所有请求的匿名吗?

最佳答案

输入CORS Filter Web 应用程序初始化程序(或 web.xml)中的 Spring Security 过滤器链之前消除 CORS 问题(通过设置 Access-Control-Allow 来允许 REST 请求的来源) - 与您的请求来源相匹配的来源)。

然后您可以使用基于角色的授权(通过 ant 匹配器和 JSR-250 注释)。对于您提供的用例来说,禁用匿名用户似乎不是一个好主意。

关于java - Spring Security AnonymousAuthFilter 与 PreAuthenticationFilter 允许未经授权的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com