我們有基於web的表單登錄認證,j_securtiy_check
工作。我們希望通過程序化登錄身份驗證來更改它。讓servlet驗證傳遞給它的用戶名和密碼的正確方法是什麼?這個servlet顯然是不受保護的。如何以編程方式從servlet內調用認證,如j_security_check會做
我們一直在嘗試這樣的server.xml境界:
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="UserDatabase"
userTable="app_user" userNameCol="login_name" userCredCol="password_value"
userRoleTable="user_perm" roleNameCol="permission_name"
allRolesMode="authOnly" digest="MD5"
/>
這樣做的原因是,我們有將登錄信息發送到未受保護的loginServlet一個Java Webstart的客戶端。這個servlet目前使用JOSSO單點登錄服務進行身份驗證,但我希望刪除這個服務,併爲初學者使用簡單的tomcat7身份驗證。然後最終遷移到OpenAM。如果我可以編程生成JSSESSIONIDSSO值並將其填充到cookie中。
這是我發現的一些代碼。這是調用身份驗證的正確方法嗎?
ApplicationContextFacade acf = (ApplicationContextFacade) this.getServletContext();
Field privateField = ApplicationContextFacade.class.getDeclaredField("context");
privateField.setAccessible(true);
ApplicationContext appContext = (ApplicationContext) privateField.get(acf);
Field privateField2 = ApplicationContext.class.getDeclaredField("context");
privateField2.setAccessible(true);
StandardContext stdContext = (StandardContext) privateField2.get(appContext);
Realm realm = stdContext.getRealm();
Principal principal = realm.authenticate(loginBean.getUsername(), loginBean.getPassword());
if (principal == null)
{
return 0;
}
GenericPrincipal genericPrincipal = (GenericPrincipal) principal;
System.out.println ("genericPrincipal=" + genericPrincipal.toString());
事實證明,我的eclipse仍然爲服務器2.X設置。我無法訪問HttpServletRequest 3.0,其中「login(user,pass)」可用。現在我已經嘗試了這個,它失敗的時候出現的錯誤不是很有幫助:由於:javax.servlet.ServletException:在org.apache的org.apache.catalina.authenticator.AuthenticatorBase.doLogin(AuthenticatorBase.java:820)上登錄失敗。 catalina.authenticator.AuthenticatorBase.login(AuthenticatorBase.java:800)在org.apache.catalina.connector.Request.login(Request.java:2621)。我不認爲OpenAm支持這一點。 –
您可以使用其他方式(不使用Servlet 3.0+的request.login):將您的身份驗證請求提交至/ j_security_check操作,其中username參數爲「j_username」,密碼參數名稱爲「j_password」。 Container將爲您處理身份驗證(這與request.login類似)。請注意,這是Container登錄的解決方案。 – Loc
http://docs.oracle.com/javaee/6/tutorial/doc/glxce.html - j_security_check的鏈接 – Loc