0

Можно ли настроить Spring Security для правильного понимания хеш-фрагментов в одностраничных приложениях (построенных с помощью системы Vaadin 7)?Spring Security redirect url и отдельные хэш-фрагменты страницы

После успешного входа мне нужно перенаправить моих пользователей на правильную страницу с помощью хеш-фрагментов, но Spring Security разрушает исходный путь.

ответ

0

Фиксированный на следующий трюк (я использую ThymeLeaf в качестве шаблона двигателя):

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> 
    <head> 
     <title>Login</title> 

     <script th:inline="javascript"> 
      function getLoginAction(form){ 
       var hash = unescape(self.document.location.hash.substring(1)); 
       form.action = [[@{/login}]] + '#' + hash; 
       return true; 
      } 
     </script> 

    </head> 
    <body> 
     <h3>Please login</h3> 
     <p th:if="${param.error}"> 
      Bad Credentials: 
     </p> 
     <form th:action="@{/login}" method="POST" onsubmit="getLoginAction(this);"> 
      User Name : <input type="text" name="username"/> <br/><br/> 
      Password: <input type="password" name="password"/> <br/><br/> 
      <input type='checkbox' name="remember-me"/>Remember Me? <br/><br/> 
      <input type="submit" value="Login"/> 
     </form> 
    </body> 
</html> 
1

Вы можете принести хэш часть в форму авторизации и отправить хэш обратно после успешного входа в систему.


Принесите хэш часть с представлением формы Логин:

<form name='login_form' action="/perform_login" method='POST' onsubmit="getHashPart()"> 
    <table> 
     <tr> 
      <td>User:</td> 
      <td><input type='text' name='username' value=''></td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type='password' name='password'/></td> 
     </tr> 
     <input type="hidden" name="hashPart" value=""/> 
     <tr> 
      <td><input name="submit" type="submit" value="submit"/></td> 
     </tr> 
    </table> 
</form> 

<script type="text/javascript"> 
    var getHashPart = function() { 
     login_form.hashPart.value = location.hash; 
    } 
</script> 

Создать MyAuthenticationSuccessHandler:

public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) 
     throws ServletException, IOException { 
     String hashPart = request.getParameter("hashPart"); 
     if (hashPart == null || hashPart.trim().equals("")) { 
      super.onAuthenticationSuccess(request, response, authentication); 
     } else { 
      this.getRedirectStrategy().sendRedirect(request, response, "/" + hashPart); 
     } 
    } 
} 

Поместите свой обработчик в SecurityConfig:

 http 
      ...... 
      .and() 
      .formLogin() 
      .loginPage("/login") 
      .loginProcessingUrl("/perform_login") 
      .successHandler(myAuthenticationSuccessHandler)