seam アプリケーションで認証方法を変更しようとしています。現在、認証にログインフォームを使用しています。将来的には、認証されたユーザーのユーザー名を含む特定の HTTP ヘッダーを使用してすべての要求を書き換える別のレイヤーに認証を委任したいと考えています。
奇妙な問題に直面しています。ログイン ページを使用して認証を行うと、entityManager を介してユーザーを抽出できます。しかし、ヘッダーの情報を使用して entityManager を照会すると、ユーザーが見つかりません。entityManager は、ユーザーが存在しないように動作します。
私はすでに2つのアプローチを試しました:
- 認証プロセスをトリガーする偽のログイン ページの作成
- リクエストを取得して認証プロセスを開始するサーブレットを作成する
どちらの場合も、entityManager からユーザーが返されません。
seam が永続化コンテキストを管理する方法についてはよく読みましたが、この問題を明確にする説明は 1 つも見つかりませんでした。あなたはなにか考えはありますか?提案?または推測しますか?
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 :-)