我有一个实体类User
其中包含用户名、名字、姓氏和密码等信息,我有 GlassFish 3.1 服务器设置来执行身份验证。到目前为止,一切都很好。在容器对用户进行身份验证后,我需要某种方法将主体绑定到实际的用户实体。毕竟,GlassFish 告诉我用户“laurens”已通过身份验证,但它没有给我相应的信息User
entity.
为此我编写了一个 JSF 托管 beanUserController
。我想知道的是,这是否是查找实际实体的正确方法,以及是否存在我没有看到的明显陷阱。
UserController
具有以下字段:
@EJB
private UserFacade userFacade;
private User user;
The userFacade
是一个需要持久化和查找的无状态会话 beanUser
实例。这user
JSF 页面使用 field 来获取和设置用户的属性。
我使用以下方法来执行绑定并附带两个辅助方法:
@PostConstruct
private void init() {
try {
user = userFacade.find(getUserPrincipal().getName());
} catch (NullPointerException ex) {
// Intentionally left empty -- User is not logged in.
}
}
private HttpServletRequest getHttpServletRequest() {
return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
}
private Principal getUserPrincipal() {
return getHttpServletRequest().getUserPrincipal();
}
JSF 页面使用以下方法来确定要显示哪些组件(如果用户已经通过身份验证,则无需显示登录表单)、在单击“登录”按钮时对用户进行身份验证,或者注册为单击“注册”按钮后将成为新用户。
public boolean isAuthenticated() {
return getUserPrincipal() != null;
}
public void authenticate() {
try {
getHttpServletRequest().login(user.getEmailAddress(), user.getPassword());
} catch (Exception ex) {
// TODO: Handle failed login attempt
}
}
public void register() {
userFacade.create(user);
}
这是正确的做法吗?
Thanks!
Edit:
感谢您的投入!我想了一会儿,虽然我认为将密码移动到不同的表对我来说目前处理起来有点太多,但我确实认为我可以通过分离密码来解决一些问题UserController
in a @RequestScoped
AuthenticationController
和一个脱光的@SessionScoped
UserController
.
The AuthenticationController
将有emailAddress
and password
字段,由网页的电子邮件地址和密码字段绑定。它还将包含public void authenticate()
对用户进行身份验证并随后丢弃凭据。这@SessionScoped
UserController
然后可以绑定到适当的User
实体而无需知道密码。事实上,我相信我能够从中删除密码字段User
共。