2017-01-28 9 views
0

私はSpringとHibernateを初めて使用しています。私は、成功したログインのフォームを、ログイン時に選択した選択オプションに基づいて特定のページにリダイレクトする最良の方法を見つけようとしています。私はこれが最善の方法であるかどうかわからないので、あなたの提案を助けてください。SpringのAuthenticationSuccessHandlerを使用したログインページのリダイレクト

これは非常に私のソリューションです:

public AuthenticationSuccessHandler loginSuccessHandler() { 
     //return (request, response, authentication) -> response.sendRedirect("/"); 
     return (request, response, authentication)-> { 
      HttpSession session = request.getSession(false); 
      if(session != null){ 
       request.setAttribute("program","program"); 
       if(request.getAttribute("program") != null) { 
        response.sendRedirect("/cert-prog"); 
       } 
      } 
      response.sendRedirect("/"); 
     }; 
    } 

この私が選択オプションとして使用しています私のフォームの一部:

 <select class="form-control input-lg"> 
        <option value="" disabled="disabled">[Select Program Type]</option> 
        <option th:each="program : ${programs}" th:value="${program.values}" th:text="${program.name}" >Certificate programs</option> 
       </select> 

マイログインフォーム:

<form class="myform" th:action="@{/login}" th:object="${user}" method="post"> 
     <div class="form-group"> 
      <select class="form-control input-lg"> 
       <option value="" disabled="disabled">[Select Program Type]</option> 
       <option th:each="program : ${programs}" th:value="${program.values}" th:text="${program.name}" >Certificate programs</option> 
      </select> 
     </div> 
     <div class="form-group"> 
      <div class="input-group input-group-lg"> 
       <span class="input-group-addon" id="sizing-addon1">@</span> 
       <input type="text" class="form-control" placeholder="LoginID" th:field="*{username}" aria-describedby="sizing-addon1" /> 
      </div> 
     </div> 
      <div class="form-group"> 
      <div class="input-group input-group-lg"> 
       <span class="input-group-addon form-wrapper" id="sizing-addon2">@</span> 
       <input type="password" class="form-control showpassword" placeholder="Pin" th:field="*{password}" aria-describedby="sizing-addon1" /> 
       <span class="input-group-btn"> 
       <button class="btn btn-default toggle" type="button">Show Pin</button> 
       </span> 
      </div> 
     </div> 
     <div> 
      <label> 
       <input type="checkbox" value="1" id="checkbox" /> <p class="login-caution">I have carefully read all instructions as well as programme requirements in the Admission Brochure and i here my accept any responsibility for any omission(s) or error(s) on my submitted form.</p> 
      </label> 
     </div> 
     <button type="submit" id="btnCheck" class="btn btn-primary btn-lg btn-block">Login</button> 
    </form> 

LoginController.java

@Controller 
    public class LoginController { 

     @RequestMapping(path = "/login", method = RequestMethod.GET) 
     public String loginForm(Model model, HttpServletRequest request) { 
      model.addAttribute("user", new User()); 
      // model.addAttribute("programs", Programs.values()); 
      try { 
       Object flash = request.getSession().getAttribute("flash"); 
       model.addAttribute("flash", flash); 

       request.getSession().removeAttribute("flash"); 
      } catch (Exception ex) { 
       // "flash" session attribute must not exist...do nothing and proceed normally 
      } 
      return "login"; 
     } 

     @RequestMapping("/access_denied") 
     public String accessDenied() { 
      return "access_denied"; 
     } 
    } 

SecurityConfig.java:

@Configuration 
    @EnableWebSecurity 
    public class SecurityConfig extends WebSecurityConfigurerAdapter { 

     @Autowired 
     private UserService userService; 

     @Autowired 
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{ 
      auth.userDetailsService(userService); 
     } 

     @Override 
     public void configure(WebSecurity web) throws Exception { 
      web.ignoring().antMatchers("/assets/**"); 

     } 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
        .authorizeRequests() 
         .anyRequest().hasRole("USER") 
         .and() 
        .formLogin() 
         .loginPage("/login") 
         .permitAll() 
         .successHandler(loginSuccessHandler()) 
         .failureHandler(loginFailureHandler()) 
         .and() 
        .logout() 
        .permitAll() 
        .logoutSuccessUrl("/login"); 
     } 

     //Certificate-program" 
     public AuthenticationSuccessHandler loginSuccessHandler() { 
      //return (request, response, authentication) -> response.sendRedirect("/"); 
//What i am trying to do...Need your help here 
      return (request, response, authentication) -> { 
       if(request.getSession().getAttribute("programs").equals("Certificate-program")){ 
        response.sendRedirect("company"); 
       }else { 
        response.sendRedirect("/"); 
       } 
      }; 
     } 

     public AuthenticationFailureHandler loginFailureHandler() { 
      return (request, response, exception) -> { 
       request.getSession().setAttribute("flash", new FlashMessage("Incorrect username and/or password. Please try again.", FlashMessage.Status.FAILURE)); 
       response.sendRedirect("/login"); 
      }; 
     } 

答えて

1

春のセキュリティの保護されたリソースに対する要求を、フォーム、ログインに格納され、ログインが完了すると、元の要求が復元され、処理されます。私の意見では、あなたのカスタムAuthenticationSuccessHandlerを使用するアプローチは、認証が成功した後にリダイレクトするのに適しています。

しかし、あなたが忘れた小さなものが1つあります。デフォルトでフォームログインに使用されるSavedRequestAwareAuthenticationSuccessHandlerのソースコードを見ると、保存された要求がRequestCacheから削除されていることがわかります。同じセッションまたは保存された要求がユーザーセッションに引き続き存在する必要があります。

+0

ありがとうございました。私はそれについて多くを読んだが、私の実装はまだ動作していません。質問を見る –

関連する問題