我们有基于 Web 的表单登录身份验证j_securtiy_check
。我们想通过编程登录身份验证来改变它。让 servlet 验证传递给它的用户名和密码的正确方法是什么?servlet 显然是不受保护的。
我们一直在试验这个 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"
/>
原因是我们有一个 java webstart 客户端,它将登录信息发送到未受保护的 loginServlet。此 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());