身份验证后重定向到受保护的页面
Posted
技术标签:
【中文标题】身份验证后重定向到受保护的页面【英文标题】:Redirect to protected page after authentication 【发布时间】:2018-03-28 05:19:03 【问题描述】:默认情况下,身份验证后的 Spring Security 会将您重定向到您之前尝试访问的受保护页面。
当我实现自己的成功处理程序时
@Component
class MyS: AuthenticationSuccessHandler
override fun onAuthenticationSuccess(request: HttpServletRequest?, response: HttpServletResponse?, authentication: Authentication?)
response?.sendRedirect(request?.getHeader(HttpHeaders.REFERER))
class SecurityConfigTH(@Autowired private val myHandler: MyS) : WebSecurityConfigurerAdapter()
...
.formLogin()
.loginPage("/en/login")
.successHandler(myHandler)
.permitAll()
我无法达到同样的效果。我尝试重定向到referrer,但在这种情况下,referrer 是/en/login 页面。
基本上:
-
用户尝试访问受保护的 url
/protected
将用户重定向到/login
页面
身份验证后,用户应再次重定向到/protected
自定义的successHandler怎么做?
【问题讨论】:
【参考方案1】:在我的项目中,我使用了满足我要求的DefaultSavedRequest
。 DefaultSavedRequest
类被 AbstractAuthenticationProcessingFilter 和 SavedRequestAwareWrapper 用来在认证成功后重现请求。 ExceptionTranslationFilter 在身份验证异常时存储此类的一个实例。
https://docs.spring.io/spring-security/site/docs/4.1.2.RELEASE/apidocs/org/springframework/security/web/savedrequest/DefaultSavedRequest.html
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException
DefaultSavedRequest defaultSavedRequest = (DefaultSavedRequest) session.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
if(defaultSavedRequest != null)
String targetURL = defaultSavedRequest.getRedirectUrl();
redirectStrategy.sendRedirect(request, response, targetURL);
return;
【讨论】:
【参考方案2】:感谢 Mhod 的回答,这成功了。
@Component
class MyS: AuthenticationSuccessHandler
override fun onAuthenticationSuccess(request: HttpServletRequest?, response: HttpServletResponse?, authentication: Authentication?)
val defaultSavedRequest = request?.session?.getAttribute("SPRING_SECURITY_SAVED_REQUEST") as DefaultSavedRequest
response?.sendRedirect(defaultSavedRequest.requestURI)
【讨论】:
以上是关于身份验证后重定向到受保护的页面的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs和PassportJs:如果身份验证失败,则不会调用passport.authenticate后重定向中间件