【问题标题】:Spring Security OAuth2 configuring failureUrl makes the url inaccessibleSpring Security OAuth2 配置 failureUrl 使 url 无法访问
【发布时间】:2020-12-03 00:08:08
【问题描述】:

我有一个基于 Spring Security 的启动应用程序,我为其配置了一个端点名称 /test,我为其返回一个 test.html 页面

@RequestMapping("/test")
public String test() {
  return "test.html";
}

端点本身可以​​正常工作,但是如果我将其设置为 OAuth2 failureUrl 它将变得不可用...

http.csrf().disable()
      .httpBasic().disable()
      .formLogin().disable()
      .authorizeRequests()
      .antMatchers("/test").permitAll()
      .anyRequest().authenticated()
      .and()
      .oauth2Login()
      .failureUrl("/test");

这是预期的行为吗?当我这样做时,spring security 在身份验证失败时正确重定向到/test,但/test 无法访问,最终显示生成的页面。

【问题讨论】:

    标签: spring-security spring-security-oauth2


    【解决方案1】:

    failureUrl 的行为因是否配置了自定义 loginPage 而有所不同。

    由于你没有自定义loginPage,框架会拦截失败的URL(“/test”),并生成默认的错误页面,也就是简单的带有错误信息的默认登录页面。
    这就是为什么您会看到生成的登录页面并访问“/test”。
    “/test”的控制器映射被忽略。

    要告诉框架不要生成错误页面,你可以配置failureHandler来代替。

    http
        .oauth2Login((oauth2Login) -> oauth2Login
            .failureHandler(new SimpleUrlAuthenticationFailureHandler("/test"))
        );
    

    注意:这可能会造成混淆,因为 failureUrl 的 Javadoc 没有正确描述其行为。我在 Spring Security backlog 中创建了一个GitHub issue 来解决这个问题。

    【讨论】:

    • 我有点理解你的意思,但我的想法是,由于我已将/test url 设置为permitAll,这不应该发生,/test 应该可用,因为它绕过了身份验证。我的想法不正确吗?
    • @Konstantine 端点/test 可供所有用户使用,但问题是Spring Security 过滤器不是使用您的控制器并呈现“test.html”,而是拦截对@987654332 的任何请求@ 并呈现错误页面(=登录页面)。我不确定这是否正在发生,但这是我最好的猜测。您可以通过查看浏览器中的网络选项卡来确认。如果您访问“/test”,它会重定向到“/login”吗?这意味着“/test”是安全的。或者它只是呈现页面?这意味着过滤器正在拦截它并设置响应。
    猜你喜欢
    • 2018-07-22
    • 2017-08-13
    • 2018-06-25
    • 2016-03-14
    • 1970-01-01
    • 2014-04-06
    • 2015-07-02
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多