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

时间:2013-10-28 13:23:09

标签: authentication seam seam2 amazon-iam jboss-seam

我正在尝试更改我的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;
            }
    }
}

持久化上下文的配置是:

<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: - )

1 个答案:

答案 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");