0

我正在尝试更改我的接缝应用程序中的身份验证方法。我目前使用登录表单进行身份验证。将来,我想将身份验证委托给另一层,该层将使用包含经过身份验证的用户的用户名的特定 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();
    }
}

提前谢谢:-)

4

1 回答 1

0

感谢@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");
于 2013-11-04T08:55:14.620 回答