【问题标题】:Spring security not hitting default-target-url after successful authtication成功身份验证后,Spring 安全性未命中 default-target-url
【发布时间】:2012-03-29 04:39:03
【问题描述】:

我已经在我的应用程序中实现了 spring-security,我的 spring-security.xml 有以下 form-login 标签。

<form-login login-page="/login.htm" default-target-url="/dashboard.htm"
            authentication-failure-url="/login.htm?error=true"
            authentication-success-handler-ref="authenticationSuccessHandler" />

我想从 /login.htm 登录,并且在成功认证后我希望用户点击dashboard.htm。 Everythig 工作正常,除了在成功验证后它没有命中 /dashboard.htm 而是命中上下文..但是如果我在 url 中手动输入dashboard.htm 那么一切正常......是的..我有authticationSuccessHandler 的实现。

【问题讨论】:

  • 尝试为 Spring Security 激活调试级别,看看发生了什么。您是否使用其他过滤器?作为 urlrewrite?
  • 我不是 Spring Security 方面的专家,但为什么你同时拥有 default-target-url 和 authentication-success-handler ?您可以删除 default-target-url 并在成功处理程序中进行重定向
  • Blitzkr1eg 是对的,你不应该同时拥有 authentication-success-handler-ref 和 default-target-url。从 authentication-success-handler-ref 的描述中:“对 AuthenticationSuccessHandler bean 的引用,它应该用于处理成功的身份验证请求。不应与 default-target-url (或始终使用- default-target-url) 作为实现应该始终处理到后续目的地的导航"

标签: java spring spring-security


【解决方案1】:

正如您在图片中看到的那样,存在某种糟糕的设计(IMO 它总是重定向到default-target-url)。 当您从禁止的资源进入登录表单时,它会将您重定向到该 URL,而不是通过 the default-target-url

http://i.stack.imgur.com/fj9ou.png

【讨论】:

    【解决方案2】:

    我使用来自问题spring is not redirecting to default target url? 的建议。我试过了,它工作正常。

    <form-login login-page="/login.htm" 
    default-target-url="/dashboard.htm" 
    always-use-default-target="true"/>
    

    【讨论】:

      【解决方案3】:
      <beans:bean id="loginSuccessHandler" class="com.example.LoginSuccessHandler">
          <beans:property name="defaultTargetUrl" value="/security/success"/>
          <beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
      </beans:bean>
      
      public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
      
           @Override
           public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                                          Authentication authentication) throws ServletException, IOException {
               request.getSession().setMaxInactiveInterval(60 * 60); //one hour
               System.out.println("Session set up for 60min");
               super.onAuthenticationSuccess(request, response, authentication);
            }
      }
      

      【讨论】:

      • 一个很好的答案!
      • 对于任何使用纯 Java 配置的人,您可以在构造函数中设置属性 public LoginSuccessHandler(){ super(); setAlwaysUseDefaultTargetUrl(true); setDefaultTargetUrl("/security/success"); }
      【解决方案4】:

      尝试删除default-target-url 属性并添加以下内容:

      <b:bean id="authenticationSuccessHandler" class="com.example.CustomSimpleURLAuthenticationSuccessHandler">
          <b:property name="defaultTargetUrl" value="/dashboard.htm"/>
      </b:bean>
      

      【讨论】:

      • @vasilakis 是否总是默认重定向到目标网址?
      猜你喜欢
      • 2017-06-18
      • 2019-02-21
      • 2021-08-14
      • 2011-05-04
      • 2015-02-04
      • 2020-10-24
      • 2020-02-09
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多