2014-03-29 149 views
1

我需要在用戶成功註冊後自動登錄。我需要重定向主頁。但在我的代碼中,它沒有被重定向到特定頁面。註冊後它仍然加載登錄頁。春季成功註冊後自動登錄mvc

我註冊控制器:

@Controller 
public class LoginController 
{ 
    @Inject 
    RequestCache requestCache; 

    @Inject @Named("am") 
    protected AuthenticationManager authenticationManager; 

    @RequestMapping(value = "/userCreate", method = RequestMethod.POST) 
    public String getuseradd(Model model, HttpServletRequest request) 
    { 
     logger.debug("In getuseradd"); 
     logger.debug("User add "+request.getParameter("firstName")); 
     String firstName = request.getParameter("firstName"); 
     String lastName = request.getParameter("lastName"); 
     String email = request.getParameter("email"); 
     String password = request.getParameter("password"); 

     try{ 
      if(userService.searchRecords("Email", email).size()> 0) 
      { 
       return "redirect:/login"; 
      } 
      else{ 
       Users user = new Users(); 

       user.setFirstName(firstName); 
       user.setLastName(lastName); 
       user.setUserStatus("Active"); 
       user.setEmail(email); 
       user.setIsFacilitator(false); 
       user.setPassword(password); 
       user.setLanguageID(4L); 
       userService.create(user, creatorID); 
       Long userId = user.getUserID(); 
       UserRoleXREF userRoleXREF = new UserRoleXREF(); 
       userRoleXREF.setUserID(userId); 
       userRoleXREF.setUserRoleID(4L); 
       userRoleXREF.setComment(firstName); 
       userRoleXREFService.create(userRoleXREF, creatorID); 
       logger.debug("User role XREF created"); 
       authenticateUserAndSetSession(user, request); 
      } 
     } 

     catch(AmmachiServerException ex) 
     { 

      logger.debug("AmmachiServerException: " + ex.getMessage()); 
     } 
     return "redirect:/home"; 
    } 
} 
private void authenticateUserAndSetSession(Users user, 
      HttpServletRequest request) 
    { 
     logger.debug("Authentication session"+user.getEmail()+""+user.getPassword()); 
     UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
       user.getEmail(), user.getPassword()); 

     // generate session if one doesn't exist 
     request.getSession(); 

     token.setDetails(new WebAuthenticationDetails(request)); 
     Authentication authenticatedUser = authenticationManager.authenticate(token); 

     SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    } 

和我securitycontext.xml

<http auto-config="true" use-expressions="true"> 

     <intercept-url pattern="/login" access="permitAll"/> 
     <intercept-url pattern="/userCreate" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
     <intercept-url pattern="/loginfailed" access="permitAll" /> 
     <intercept-url pattern="/**" access="isAuthenticated()" /> 
     <form-login login-page="/login" always-use-default-target="false" default-target-url="/home" authentication-failure-url="/loginfailed" /> 

     <logout logout-success-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID" /> 


     <session-management> 
      <concurrency-control max-sessions="10000" error-if-maximum-exceeded="false" /> 
     </session-management> 


    </http> 

    <authentication-manager alias = "am"> 
     <authentication-provider user-service-ref="loginValidator"> 
      <password-encoder hash="md5"> 
       <salt-source user-property="username"/> 
      </password-encoder> 
     </authentication-provider> 
    </authentication-manager> 

能否請你幫助別人解決這個

回答

2

你UsernamePasswordAuthenticationToken未通過身份驗證,因此你將被重定向到登錄頁面。 UsernamePasswordAuthenticationToken構造你叫:

public UsernamePasswordAuthenticationToken(Object principal, Object credentials) { 
     super(null); 
     this.principal = principal; 
     this.credentials = credentials; 
     setAuthenticated(false); 
    } 

你必須創建一個UsernamePasswordAuthenticationToken與當局列出像這樣:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
       user.getEmail(), user.getPassword(), AuthorityUtils.NO_AUTHORITIES); 

你沒有在安全配置使用任何角色,所以空當局名單足夠。

現在這個UsernamePasswordAuthenticationToken被認證:

public UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) { 
     super(authorities); 
     this.principal = principal; 
     this.credentials = credentials; 
     super.setAuthenticated(true); // must use super, as we override 
    } 

您應該被重定向到您的主頁。

AuthorityUtils是Spring安全性的一部分,可以在這裏找到org.springframework.security.core.authority.AuthorityUtils