gpt4 book ai didi

spring - 在带有 CORS 的 REST 中使用 Spring 登录时出现问题

转载 作者:行者123 更新时间:2023-12-03 01:38:38 26 4
gpt4 key购买 nike

我正在尝试使用 REST 实现一个网站。我对用户进行身份验证的策略包括向用户发送 JWT token ,以回复通过 POST 发送的用户名/密码组合。我的安全配置中最相关的部分如下所示。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/images/**", "/scripts/**", "/styles/**", "favicon.ico");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.exceptionHandling()
.authenticationEntryPoint(new RESTAuthenticationEntryPoint()).and()
.formLogin()
.successHandler(authenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.loginProcessingUrl("/login") //Not necesary because is the default
.permitAll().and()
.authorizeRequests()
.antMatchers("/api/getStatistics").permitAll()
.anyRequest().denyAll().and()
.addFilterBefore(new JwtTokenAuthenticationFilter(jWTTokenService()), UsernamePasswordAuthenticationFilter.class);
}

@Bean
public SavedRequestAwareAuthenticationSuccessHandler authenticationSuccessHandler() {
return new RESTAuthenticationSuccessHandler(jWTTokenService());
}

@Bean
public JWTTokenService jWTTokenService() {
return new JWTTokenServiceImpl();
}

为了允许 CORS 访问,我在 WebMvcConfigurerAdapter 的扩展类中编写了以下几行

@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedHeaders("Origin", "X-Requested-With", "Content-Type", "Accept")
.allowedMethods("GET", "POST", "OPTIONS")
.allowCredentials(true).maxAge(3600);
registry.addMapping("/login")
.allowedOrigins("*")
.allowedHeaders("Origin", "X-Requested-With", "Content-Type", "Accept")
.allowedMethods("POST", "OPTIONS")
.allowCredentials(true).maxAge(3600);
}

因此,当我调用/login 发送用户名和密码时,Spring 会捕获该请求,对其进行处理,然后重定向到成功或失败处理程序。

好吧,相反,我在 CORS 预检期间收到了 403 Forbidden 响应。我决定调试该程序,因为我认为当我编写 formLogin() 时,UsernamePasswordAuthenticationFilter 创建一个新的 AntPathRequestMatcher,其值为 ("/login", "POST")。

我在调试控制台中发现的内容如下 请求“OPTIONS/login”与“POST/login”不匹配

当然不是!几个小时后,尝试解决问题,我发现如果我声明一个空方法/login,一切都会正常,因为在预检期间,Spring 找到该方法,然后向客户端发送 200OK,这样客户端就可以发送捕获的 POST通过用户名密码验证过滤器。

@Controller
public class LoginController {

@RequestMapping(value = { "/login" }, method = RequestMethod.POST)
public void dummyLogin() {

}
}

所以,我的问题是:我真的应该在 CORS 预检期间声明一个空方法来“作弊”吗?或者只是我错过了一些东西?因为当您确实想将作业委托(delegate)给 UsernamePasswordAuthenticationFilter 时,声明一个虚拟方法并不是那么优雅...

最佳答案

问题是 org.springframework.security.web.authentication.logout.LogoutFilterorg.springframework.security.web.authenticationUsernamePasswordAuthenticationFilter 不会继续使用过滤器如果他们处理登录/注销,则链。而且由于通过 WebSecurityConfigurerAdapter 的配置是在链中稍后处理的,因此 CorsProcessor 永远不会应用。

我决定保留旧的解决方案并使用org.springframework.web.filter.CorsFilter

关于spring - 在带有 CORS 的 REST 中使用 Spring 登录时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33588785/

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