Spring 安全 OAuth 2.0 Google:在未经授权的请求而不是请求 URL 后重定向到默认值 URL
Spring Security OAuth 2.0 Google: redirect to default URL after unauthorized request instead of requested URL
我正在使用 Spring Security OAuth 2.0 和 Google 作为身份提供者。我在正确处理 session 超时和重新验证时遇到问题。
场景:
- 在 session 超时后对 REST API 的一些请求。
- 前端处理 HTTP 403 并显示带有 link 到 Spring 安全登录端点的屏幕。
- 用户点击此 link。 Spring 使用必要的参数(代码、状态等)重定向到 Google 登录页面。用户成功重新验证。
当前行为:
- 登录后 Google 重定向到之前请求的 REST API URL。结果用户在浏览器中看到一些 JSON。我根本不明白应用程序的哪一部分可以保存下来。我禁用了一切。 (见配置下面的评论class。)
期望的行为:
- 登录后 Google 重定向到某个起始 UI 屏幕。
我的配置class:
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.security.web.authentication.Http403ForbiddenEntryPoint
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler
@Configuration
@EnableWebSecurity
class WebSecurityConfiguration: WebSecurityConfigurerAdapter() {
@Value("${app.security.oauth2.defaultSuccessUrl}")
lateinit var defaultSuccessUrl: String
@Throws(Exception::class)
override fun configure(httpSecurity: HttpSecurity) {
val successHandler = SimpleUrlAuthenticationSuccessHandler()
successHandler.setUseReferer(false)
httpSecurity
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/js/**", "/error**").permitAll()
.anyRequest().authenticated()
.and().oauth2Login()
.successHandler(successHandler)
.defaultSuccessUrl(defaultSuccessUrl)
.and().logout().logoutSuccessUrl("/login").deleteCookies("JSESSIONID").permitAll()
.and()
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(Http403ForbiddenEntryPoint())
}
}
defaultSuccessUrl
设置为所需的 UI 屏幕。
- 我已经将成功处理程序更改为
SimpleUrlAuthenticationSuccessHandler
而不是 SavedRequestAwareAuthenticationSuccessHandler
以关闭 Spring 请求的保存。
successHandler.setUseReferer(false)
在 HTTP 级别禁用 Referer
header。
- 我正在使用
Http403ForbiddenEntryPoint()
只是在 session 超时时发出 HTTP 403。前端处理这个并显示登录屏幕 link 到 Spring 安全登录 URL.
我做错了什么?
提前致谢。
UPD:根据 Steve Riesenberg 的回答更新了代码:
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.security.web.authentication.Http403ForbiddenEntryPoint
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler
@Configuration
@EnableWebSecurity
class WebSecurityConfiguration: WebSecurityConfigurerAdapter() {
@Value("${app.security.oauth2.defaultSuccessUrl}")
lateinit var defaultSuccessUrl: String
@Throws(Exception::class)
override fun configure(httpSecurity: HttpSecurity) {
val successHandler = SimpleUrlAuthenticationSuccessHandler(defaultSuccessUrl)
successHandler.setUseReferer(false)
httpSecurity
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/js/**", "/error**").permitAll()
.anyRequest().authenticated()
.and().oauth2Login()
.successHandler(successHandler)
.and().logout().logoutSuccessUrl("/login").deleteCookies("JSESSIONID").permitAll()
.and()
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(Http403ForbiddenEntryPoint())
}
}
设置 defaultSuccessUrl
将覆盖您的 successHandler()
,因为设置 URL 实际上会添加您想替换的 SavedRequestAwareAuthenticationSuccessHandler
。顺序很重要,因为 oauth2Login
配置器中只有一个 successHandler
。
相反,您需要将 defaultSuccessUrl
传递给 SimpleUrlAuthenticationSuccessHandler
的构造函数,并且只设置 successHandler(successHandler)
.
我正在使用 Spring Security OAuth 2.0 和 Google 作为身份提供者。我在正确处理 session 超时和重新验证时遇到问题。
场景:
- 在 session 超时后对 REST API 的一些请求。
- 前端处理 HTTP 403 并显示带有 link 到 Spring 安全登录端点的屏幕。
- 用户点击此 link。 Spring 使用必要的参数(代码、状态等)重定向到 Google 登录页面。用户成功重新验证。
当前行为:
- 登录后 Google 重定向到之前请求的 REST API URL。结果用户在浏览器中看到一些 JSON。我根本不明白应用程序的哪一部分可以保存下来。我禁用了一切。 (见配置下面的评论class。)
期望的行为:
- 登录后 Google 重定向到某个起始 UI 屏幕。
我的配置class:
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.security.web.authentication.Http403ForbiddenEntryPoint
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler
@Configuration
@EnableWebSecurity
class WebSecurityConfiguration: WebSecurityConfigurerAdapter() {
@Value("${app.security.oauth2.defaultSuccessUrl}")
lateinit var defaultSuccessUrl: String
@Throws(Exception::class)
override fun configure(httpSecurity: HttpSecurity) {
val successHandler = SimpleUrlAuthenticationSuccessHandler()
successHandler.setUseReferer(false)
httpSecurity
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/js/**", "/error**").permitAll()
.anyRequest().authenticated()
.and().oauth2Login()
.successHandler(successHandler)
.defaultSuccessUrl(defaultSuccessUrl)
.and().logout().logoutSuccessUrl("/login").deleteCookies("JSESSIONID").permitAll()
.and()
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(Http403ForbiddenEntryPoint())
}
}
defaultSuccessUrl
设置为所需的 UI 屏幕。- 我已经将成功处理程序更改为
SimpleUrlAuthenticationSuccessHandler
而不是SavedRequestAwareAuthenticationSuccessHandler
以关闭 Spring 请求的保存。 successHandler.setUseReferer(false)
在 HTTP 级别禁用Referer
header。- 我正在使用
Http403ForbiddenEntryPoint()
只是在 session 超时时发出 HTTP 403。前端处理这个并显示登录屏幕 link 到 Spring 安全登录 URL.
我做错了什么?
提前致谢。
UPD:根据 Steve Riesenberg 的回答更新了代码:
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.security.web.authentication.Http403ForbiddenEntryPoint
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler
@Configuration
@EnableWebSecurity
class WebSecurityConfiguration: WebSecurityConfigurerAdapter() {
@Value("${app.security.oauth2.defaultSuccessUrl}")
lateinit var defaultSuccessUrl: String
@Throws(Exception::class)
override fun configure(httpSecurity: HttpSecurity) {
val successHandler = SimpleUrlAuthenticationSuccessHandler(defaultSuccessUrl)
successHandler.setUseReferer(false)
httpSecurity
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/js/**", "/error**").permitAll()
.anyRequest().authenticated()
.and().oauth2Login()
.successHandler(successHandler)
.and().logout().logoutSuccessUrl("/login").deleteCookies("JSESSIONID").permitAll()
.and()
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(Http403ForbiddenEntryPoint())
}
}
设置 defaultSuccessUrl
将覆盖您的 successHandler()
,因为设置 URL 实际上会添加您想替换的 SavedRequestAwareAuthenticationSuccessHandler
。顺序很重要,因为 oauth2Login
配置器中只有一个 successHandler
。
相反,您需要将 defaultSuccessUrl
传递给 SimpleUrlAuthenticationSuccessHandler
的构造函数,并且只设置 successHandler(successHandler)
.