我想知道当前的方法是关于使用JSF 2.0(如果存在任何组件)和Java EE 6核心机制(登录/检查权限/注销)的Web应用程序的用户身份验证,其中包含用户信息保存在JPA中实体.Oracle Java EE教程在这方面有点稀疏(仅处理servlet).
这没有使用整个其他框架,如Spring-Security(acegi)或Seam,但如果可能的话,试图用新的Java EE 6平台(Web配置文件).
我想知道如何结合这两个身份验证步骤:
LDAP用户存储库不知道特定于应用程序的角色,我不想管理应用程序DB中的密码.所以我需要两者.
JAAS配置文件允许有其他LoginModule:
<name used by application to refer to this entry> {
<LoginModule> <flag> <LoginModule options>;
<optional additional LoginModules, flags and options>;
};
Run Code Online (Sandbox Code Playgroud)
但我找不到解释我如何工作的例子.
这是好方法吗?
谢谢
=========================================
这是我的答案:
实际上我们可以有额外的LoginModule.JAAS配置文件是:
Sample {
com.sun.security.auth.module.LdapLoginModule Requisite
userProvider="ldap://acme.org:389/OU=Users,OU=_ACME,DC=acmegis,DC=acme,DC=org"
authIdentity="{USERNAME}"
userFilter="(userPrincipalName={USERNAME})"
storePass=true
sample.module.SampleLoginModule required debug=true;
};
Run Code Online (Sandbox Code Playgroud)
这里我们有两个LoginModule:
Sun的LdapLoginModule检查用户/密码,并查询查询我的db并填充主体的sample.module.SampleLoginModule.storePass = true的重要参数要求LdapLoginModule将用户名和密码存储在模块的共享状态中.(参见http://docs.oracle.com/javase/6/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/LdapLoginModule.html).
因此,下一个LoginModules可以获取传递给sharedState Map参数中的initialize方法的用户名.他们应该在login()中无关,而在DB中用于填充Principales的查询是在commit()中完成的(就像Shimi Bandiel所说).
我还没有使用它,但有一个由JBoss开发的DatabaseServerLoginModule(参见http://community.jboss.org/wiki/DatabaseServerLoginModule),它支持身份验证和角色映射.与password-stacking = useFirstPass一起使用,我们应该得到我的需要的答案,而无需编写任何行代码(但是一个漂亮的JAAS配置文件).
BR