我試圖在我的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提前:-)
你能發表一些代碼嗎?特別是使用實體管理器的位 – DaveB
看來,一個seam攔截器(hibernate安全攔截器,我猜)是禁止通過entityManager.do訪問數據源你有任何想法如何禁用或繞過只是休眠安全攔截器? –
您是否檢查過字符串實際上是從頭中取出的?如果是這樣的查詢實際執行?也可能是顯而易見的,但是你的UserService類是受限制的嗎? – DaveB