【发布时间】:2020-07-23 08:14:36
【问题描述】:
我目前正在开发一个 Spring-MVC 应用程序,该应用程序托管我的 html 网页以及(某种)REST API。 问题在于访问应用程序的内容,身份验证失败的处理方式应不同:
- 如果用户使用浏览器访问页面,必须重定向到登录页面(由浏览器管理的302)
- 如果它是页面中的一个组件(在我的例子中是一个 jquery 数据表),它试图通过 Ajax 加载下一页结果,我应该收到 401 状态以允许我在我的 JS 中解释它并重定向到登录页面。
但实际上,应用程序总是返回一个由浏览器处理的 302,而我的 Javascript 没有机会正确处理它。
从我的阅读中,我发现我必须定义 2 个 WebSecurityConfigurerAdapter,我做到了,一个用于 /api,另一个用于网页,但在这两种情况下它都会发送重定向 302。
我的 API 配置是:
@Configuration
@Slf4j
@Order(SecurityProperties.BASIC_AUTH_ORDER - 5)
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/api/**")
.authenticated();
}
}
还有网络配置:
@Configuration
@Slf4j
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/action/**", "/login", "/css/**")
.permitAll()
.anyRequest().authenticated().and()
.formLogin()
.loginPage("/login")
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}
...
}
有人可以帮助我了解问题所在吗?
我看到了一些解决方案,它读取 Ajax 响应的内容并在里面有一些 html 时重定向,但我认为它应该在服务器端正确处理。
【问题讨论】:
标签: javascript spring-security