Spring 带有 PreAuthenticationFilter 的安全 AnonymousAuthFilter 允许未经授权的请求
Spring Security AnonymousAuthFilter With PreAuthenticationFilter Allowing Unauthorized Requests
我的 Spring MVC 网络应用程序中有一个相当简单的 Spring 安全配置。我正在接收来自远程 Web 应用程序的 REST 请求,这些请求通过我的 preauth 过滤器进行了身份验证。我只是在请求中查找 header,如果存在,我 return 那个字符串值(即用户名)作为身份验证 object。这工作正常,当收到请求时,用户会通过身份验证。
无论出于何种原因,每当我尝试实施 pattern-based 安全 antMatcher 或控制器方法注释安全时,都会导致客户端出现 CORS 错误。我必须保持访问完全打开,以允许在这个 cross-domain 环境中进行实际请求。
我的问题是,一段时间后,session 似乎过期了。当用户点击我的一个控制器并且我尝试从 Principal object 获取用户名时,我得到一个 NullPointerException,因为 Principal 为空。一旦它过期,看起来 AnonymousAuthFilter 就会启动并让用户以匿名身份连接。
我假设我不想要完全无状态的身份验证 session,因为我也在使用 session 用于 websockets,并且当我使用我的消息模板 "convertAndSendToUser",我需要提供用户名,Spring 需要查找 websocket session。但是,我想强制安全链识别传入请求是否没有分配主体,以通过我的 PreAuthFilter 和 re-establish 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 object 上了解了这个方法:
.anonymous().disable()
但是,当我使用它时,我的所有 CORS 请求再次失败。我认为问题特别在于预检 OPTIONS 请求。这无法进行身份验证——它需要匿名访问。因此,我认为要从我的 cross-domain 身份验证中获得我想要的行为,我需要禁用匿名过滤器,但这样做会破坏能够执行 cross-domain 请求的关键租户之一。啊。有人知道如何为除 OPTIONS 之外的所有请求禁用匿名吗?
在 CORS Filter before spring 安全过滤器链中放入 Web 应用程序初始化程序(或web.xml) 消除 CORS 问题(通过将 Access-Control-Allow-Origin 设置为与您的请求来源匹配来允许 REST 请求的来源)。
然后您可以使用基于角色的(通过蚂蚁匹配器和 JSR-250 注释)授权。对于您提供的用例,禁用匿名用户似乎不是一个好主意。
我的 Spring MVC 网络应用程序中有一个相当简单的 Spring 安全配置。我正在接收来自远程 Web 应用程序的 REST 请求,这些请求通过我的 preauth 过滤器进行了身份验证。我只是在请求中查找 header,如果存在,我 return 那个字符串值(即用户名)作为身份验证 object。这工作正常,当收到请求时,用户会通过身份验证。
无论出于何种原因,每当我尝试实施 pattern-based 安全 antMatcher 或控制器方法注释安全时,都会导致客户端出现 CORS 错误。我必须保持访问完全打开,以允许在这个 cross-domain 环境中进行实际请求。
我的问题是,一段时间后,session 似乎过期了。当用户点击我的一个控制器并且我尝试从 Principal object 获取用户名时,我得到一个 NullPointerException,因为 Principal 为空。一旦它过期,看起来 AnonymousAuthFilter 就会启动并让用户以匿名身份连接。
我假设我不想要完全无状态的身份验证 session,因为我也在使用 session 用于 websockets,并且当我使用我的消息模板 "convertAndSendToUser",我需要提供用户名,Spring 需要查找 websocket session。但是,我想强制安全链识别传入请求是否没有分配主体,以通过我的 PreAuthFilter 和 re-establish 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 object 上了解了这个方法:
.anonymous().disable()
但是,当我使用它时,我的所有 CORS 请求再次失败。我认为问题特别在于预检 OPTIONS 请求。这无法进行身份验证——它需要匿名访问。因此,我认为要从我的 cross-domain 身份验证中获得我想要的行为,我需要禁用匿名过滤器,但这样做会破坏能够执行 cross-domain 请求的关键租户之一。啊。有人知道如何为除 OPTIONS 之外的所有请求禁用匿名吗?
在 CORS Filter before spring 安全过滤器链中放入 Web 应用程序初始化程序(或web.xml) 消除 CORS 问题(通过将 Access-Control-Allow-Origin 设置为与您的请求来源匹配来允许 REST 请求的来源)。
然后您可以使用基于角色的(通过蚂蚁匹配器和 JSR-250 注释)授权。对于您提供的用例,禁用匿名用户似乎不是一个好主意。