Authentication 找不到使用seam托管持久性上下文的实体

Authentication 找不到使用seam托管持久性上下文的实体,authentication,seam,seam2,amazon-iam,jboss-seam,Authentication,Seam,Seam2,Amazon Iam,Jboss Seam,我正在尝试更改seam应用程序中的身份验证方法。我目前使用登录表单进行身份验证。将来,我希望将身份验证委托给另一层,该层将使用包含已验证用户用户名的特定HTTP头重写每个请求 我面临一个奇怪的问题:当使用登录页面进行身份验证时,我能够通过entityManager提取用户。但是,当我使用标题下的信息查询entityManager时,我无法找到用户。entityManager的行为就像用户不存在一样 我已经尝试了两种方法: 创建触发身份验证过程的假登录页 创建一个servlet,用于获取请求并启

我正在尝试更改seam应用程序中的身份验证方法。我目前使用登录表单进行身份验证。将来,我希望将身份验证委托给另一层,该层将使用包含已验证用户用户名的特定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;
            }
    }
}
@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();
    }
}
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;
        }
    }
HttpServletRequest request = (HttpServletRequest) FacesContext
                .getCurrentInstance().getExternalContext().getRequest();
        String userName = request.getHeader("user");
持久性上下文的配置为:

<persistence:managed-persistence-context startup="false" scope="stateless"
        auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" />
<persistence:managed-persistence-context startup="false" scope="stateless"
        auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" />

Thx预付款:-)

Thx@DaveB对于您的回复,使用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;
            }
    }
}
@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();
    }
}
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;
        }
    }
HttpServletRequest request = (HttpServletRequest) FacesContext
                .getCurrentInstance().getExternalContext().getRequest();
        String userName = request.getHeader("user");
持久性上下文的配置为:

<persistence:managed-persistence-context startup="false" scope="stateless"
        auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" />
<persistence:managed-persistence-context startup="false" scope="stateless"
        auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" />

你能发一些代码吗?尤其是使用实体managerIt的位似乎是seam拦截器(我猜是hibernate安全拦截器)正在禁止通过entityManager访问数据源。您是否知道如何禁用或绕过hibernate安全拦截器?您是否检查了字符串是否实际取自标头?如果是,查询是否实际执行?这可能很明显,但是您的UserService类是否受到限制?确实是的,我检查了从标头中提取的字符串,这与通过请求发送并在查询中使用的是相同的。UserService完全没有限制。这有点奇怪,但当我使用login submit按钮调用applicationAuthenticator.login时,查询正确地获取了用户,而不是使用http GET请求。您是否尝试过检查SQL hibernate正在执行的是什么(如果有的话)? 另外,请尝试降低hibernate日志记录级别,看看发生了什么。您要说的是,上面的查询在作为页面操作调用时不会给出任何结果,但在从标准登录表单调用时确实有效。。。?您能否发布整个支持bean/类,特别是如何获得entityManager instance.btw。您应该在问题中添加这个额外的细节,而不是作为快速回答的答案:),我用更多的代码细节更新了问题。我的意思是,查询确实可以使用登录表单(表单中的提交按钮执行页面操作),但是当我向页面操作发送http GET请求(带有用户标题)时(applicationAuthenticator.login)查询不起作用(userService.getUser返回null)。