我正在尝试更改我的seam应用程序中的身份验证方法。我目前使用登录表单进行身份验证。将来,我想将身份验证委托给另一个层,该层将使用包含经过身份验证的用户的用户名的特定HTTP头重写每个请求。
我面临一个奇怪的问题:当使用登录页面进行身份验证时,我能够通过entityManager提取用户。但是当我使用标题中的信息查询entityManager时,我无法找到用户。 entityManager的行为就像用户不存在一样。
我已经尝试了两种方法:
两次,entityManager都没有给我任何用户。
我读了很多关于seam如何管理持久化上下文的内容,但是我没有找到一个能够解决这个问题的单一解释。你有什么想法?建议?甚至猜猜?
使用entityManager的代码如下:
@Name("userService")
@AutoCreate
public class UserService {
@Logger
private Log logger;
@In
private EntityManager entityManager;
public User getUser(String email) {
try {
return entityManager
.createQuery("SELECT u FROM User u where u.email=:email",
User.class).setParameter("email", email.trim())
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
}
持久化上下文的配置是:
<persistence:managed-persistence-context startup="false" scope="stateless"
auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" />
我创建了一个空的虚假登录页面,它执行页面操作(身份验证),我在其中获取请求用户标题,如下所示:
@Name("applicationAuthenticator")
public class ApplicationAuthenticator {
@Logger
private Log log;
@In
private Identity identity;
@In
private Credentials credentials;
@In(required=true)
private UserService userService;
@Begin
public void login() throws LoginException {
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String userName=request.getHeader("user");
identity.unAuthenticate();
credentials.setUsername(userName);
credentials.setPassword("fake");
identity.acceptExternallyAuthenticatedPrincipal(new SimplePrincipal(credentials.getUsername()));
User user=userService.getUserByEmail(credentials.getUsername());
identity.authenticate();
identity.quietLogin();
}
}
提前Thx: - )
答案 0 :(得分:0)
Thx @DaveB为您的回复,使用entityManager的代码如下:
public User getUser(String email) {
try {
return entityManager
.createQuery("SELECT u FROM User u where u.email=:email",
User.class).setParameter("email", email.trim())
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
持久化上下文的配置是:
<persistence:managed-persistence-context startup="false" scope="stateless"
auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" />
我创建了一个空的虚假登录页面,它执行页面操作(身份验证),我在其中获取请求用户标题,如下所示:
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
String userName = request.getHeader("user");