2016-08-09 49 views
1

我正在開發一個使用Spring MVC和Hibernate的Web應用程序,我有用戶登錄系統訪問內部頁面。這是通過使用偵聽會話變量的攔截器來完成的。使用bean進行登錄和註冊 - Spring MVC + Hibernate

我可以正確註冊查找有效值。 但在登錄的情況下,我只需要用戶名和密碼,我在使用bean驗證登錄時遇到了麻煩,因爲它指責沒有電子郵件等。

這是用戶等級:

@Entity 
public class User{ 


    @Id 
    @GeneratedValue 
    private int id; 
    @NotNull 
    @Column(name="username",unique=true) 
    @Size(min=5) 
    private String username; 
    @NotNull 
    @Email 
    private String email; 
    @NotNull 
    @Size(min=5) 
    private String password; 
    private String salt; 
    private int status; 
    private String name; 
    private String company; 
    private int countryid; 
    @DateTimeFormat(pattern="dd/MM/yyyy") 
    @Temporal(TemporalType.DATE) 
    private Calendar subscriptionDate; 
//Getters and Setters 
} 

控制器:

@Transactional 
@Controller 
public class LoginController { 

    @Autowired 
    UserDao dao; 

    // Other Mappings 

    @RequestMapping(value = "addUser", method = RequestMethod.POST) 
     public String makeRegistration(@ModelAttribute("user") @Valid User user, BindingResult result, 
       RedirectAttributes redirectAttributes) { 
      if (result.hasErrors()) { 
       return "redirect:register"; 
      } 
      if (dao.add(user)) { 
       redirectAttributes.addFlashAttribute("user", user); 
       return "redirect:login"; 
      } else { 
       return "redirect:register"; 
      } 

     } 

     @RequestMapping(value = "enter", method = RequestMethod.POST) 
     public String doLogin(@ModelAttribute("user") @Valid User user, BindingResult result, HttpSession session) { 
      if (result.hasErrors()) { 
       return "redirect:login"; 
      } else { 
       if (dao.authenticate(user)) { 
        session.setAttribute("userLoggedIn", user.getUsername()); 
        return "forward:index"; 
       } else { 
        return "redirect:login"; 
       } 
      } 

     } 

    \\ Other mappings. 

如何使用 「用戶」 級兩種登錄和註冊? 我必須使用inhertance嗎?

回答

1

當然不能繼承! 想想你的數據結構的作用。你需要什麼來支持你的登錄表單。那麼,只需一個LoginForm。它是持久數據嗎?絕對不。 LoginFormUser之間的關係是什麼?那麼,第一個幫助確定最後一個。現在我認爲你應該做的是開發一個LoginForm對象的驗證要求。該對象不會持久化,但是將用作檢索持久性User的方法的參數,該方法具有自己的驗證。

精確的事情有點,我將引入一個新的類:

public class LoginForm implements Serializable { 

    @NotNull 
    @Column(name="username", unique=true) 
    @Size(min=5) 
    private String username; 

    @NotNull 
    @Size(min=5) 
    private String password; 

    //Getters and Setters 

} 

...並修改您的身份驗證方法的簽名:

@RequestMapping(value = "enter", method = RequestMethod.POST) 
    public String doLogin(@ModelAttribute("user") @Valid LoginForm loginForm, BindingResult result, HttpSession session) { 
     // ... 
    } 

順便說一句,我不確定堅持密碼是一個好主意。您可以保存一個散列或決定認證是外部目錄的域。

+0

你能給一個具體的例子,讓我可以理解這個想法嗎?你的意思是像「Loginform實現驗證器」; 「公共無效驗證(用戶用戶,錯誤錯誤){/ /驗證邏輯}」 –

+0

考慮它完成:-) –

+0

是的,現在我可以理解。就像一個側面的問題,我可以加載形式:驗證錯誤的錯誤?此外,我正在哈希所有passwods,因此鹽場。 –

1

我想你應該創建註冊和登錄控制器,以保持代碼乾淨和簡單。讓代碼看起來很愚蠢,這將很容易維護,並將進一步實施。