我正在尝试更改我的接缝应用程序中的身份验证方法。我目前使用登录表单进行身份验证。将来,我想将身份验证委托给另一层,该层将使用包含经过身份验证的用户的用户名的特定 HTTP 标头重写每个请求。
我面临一个奇怪的问题:使用登录页面进行身份验证时,我能够通过 entityManager 提取用户。但是当我使用标题中的信息查询 entityManager 时,我找不到用户。entityManager 的行为就像用户不存在一样。
我已经尝试了两种方法:
- 创建一个触发身份验证过程的虚假登录页面
- 创建一个获取请求并启动身份验证过程的 servlet
两次,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();
}
}
提前谢谢:-)