2016-08-09 54 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

我想你应该创建注册和登录控制器,以保持代码干净和简单。让代码看起来很愚蠢,这将很容易维护,并将进一步实施。