在我的应用程序中,我将基于表单的身份验证与LDAP-Realm结合使用。对于授权,我使用数据库。据我了解,这如下
App --> (user, pass) --> LDAP
<-- OK, user exists --
--> ask for security roles for 'user' --> JACC / Database
<-- Administrator --
我可以进入应用程序调用的过程ask for security roles for 'user'
吗?
背景:
LDAP说: Okay, 'user' is authentified
数据库: give me all roles where username = user
而 现在,我想自定义数据库查询:give me all roles where username = 'user' AND some more attributes
这可能吗?
TL; DR:看看 这个和那个样本解决方案。
您所要求的取决于您使用的特定于供应商的功能所提供的灵活性。您的产品可能会也可能不会允许您扩展那个/这些LoginModule
// Realm
/
的行为,IdentityStore
无论它是什么/被称为专有类,甚至可能只是在某些管理UI的输入字段中键入SQL查询。最重要的是,它是非标准功能。
在标准Java EE方面,有 JASPIC (用户/消息身份验证)和 JACC
(授权)SPI。两者都可用于从某些外部存储中检索与您的用户有关的安全性相关信息。JASPIC不能做的就是 在 验证 后
更改用户的角色;也就是说,在经过 身份验证的请求 1的持续时间内,用户的角色是 固定的 。JASPIC也不能赋予这些角色以 含义
;因为它们仅仅String
是AS将以某种专有方式派生group
Principal
的原因。另一方面,JACC可以做这些事情,因为它建立了“规则库”(认为Policy
),它将角色,主体和Permission
s精确地关联起来,并且可以在每次用户与系统的每次交互中查询。JACC还可以覆盖或更改对通过部署描述符和批注表示的Java
EE安全约束的解释。
我将在这篇文章中包括一个基于JASPIC的解决方案,而在很大程度上忽略了JACC,因为:
关于以下内容的一些评论:
LoginModule
通过使用JASPIC LoginModule桥概要文件 ,可以工作于JAAS (LM)。后者SAM需要在AS和本身在源级别进行进一步的配置/调整,除非您使用的是GlassFish。提供了随附的示例JAAS login.conf
条目。AuthConfigProvider
和ServerAuthConfig
实现,但是随后将必须以AuthConfigFactory
专有方式(通过特定于供应商foo-web.xml
和/或进一步使用部署/管理工具)在产品中注册实际SAM 。此外,您将没有SAM实现该ServerAuthContext
接口,并且必须Properties
从SAM中加载随附文件。然后,您的AS将为您实例化缺少的类,可能会重用“全局” AuthConfigProvider
和/或ServerAuthConfig
为所有应用程序和消息层进行了预配置。请注意,取决于它是否重用其实例化的请求ServerAuthConfig
和ServerAuthContext
跨请求的请求(几乎没有发生,尤其是后者),SAM的生命周期可能会受到影响。provided
)javaee-api
7.0(加上JDBC驱动程序,除非AS类路径上已经存在)。ServletContextListener
注册AuthConfigProvider
。另存为/<project>/src/main/java/org/my/foosoft/authn/BigJaspicFactoryRegistrar.java
。AuthConfigProvider
。另存为/<project>/src/main/java/org/my/foosoft/authn/BigJaspicFactory.java
。ServerAuthConfig
。另存为/<project>/src/main/java/org/my/foosoft/authn/LittleJaspicServerFactory.java
。ServerAuthContext
-ServerAuthModule
实现帮助程序类。这是实际答案的1/3。另存为/<project>/src/main/java/org/my/foosoft/authn/HttpServletSam.java
。/<project>/src/main/java/org/my/foosoft/authn/StandaloneLdapSam.java
。/<project>/src/main/java/org/my/foosoft/authn/JaasDelegatingLdapSam.java
。/<project>/src/main/java/org/my/foosoft/authn/JaspicMischief.java
。Properties
。如果您想逐字测试实际的身份验证代码,请使其适应您的需求。另存为/<project>/src/main/resources/org/my/foosoft/authn/jaspic-provider.properties
。login.conf
代码段;有关实际文件系统位置,请参阅供应商的文档。/<project>/src/main/java/org/my/foosoft/presentation/UserUtils.java
(可选-出于演示目的:JSF支持bean)/<project>/src/main/webapp/index.xhtml
(可选-出于演示目的:未受保护的索引页)/<project>/src/main/webapp/login.xhtml
(可选-出于演示目的:登录页面)/<project>/src/main/webapp/restricted/info.xhtml
(可选-出于演示目的:角色用户的受保护索引页access_restricted_pages
)/<project>/src/main/webapp/WEB-INF/web.xml
(可选-出于演示目的和出于完整性的考虑:Web模块DD)进一步阅读:
1 JASPIC是非常通用的SPI,从理论上讲,当插入有能力的消息处理运行时时,它就可以对JMS,SAML-over-
SOAP和任何其他类型的消息进行身份验证。即使它主要用于 Servlet容器配置文件, 也不会过度限制它。
JASPIC的低级别,灵活的特性使您不了解特定于协议的功能,例如HTTP会话。因此,ServerAuthContext
运行时将触发s /
SAM,以对每个请求执行身份验证。
但是,该规范通过允许SAM 通过运行时通过 Callback属性 请求发起 容器身份验证会话
来对此潜在的缺陷作了规定。当要求对同一客户端的后续请求进行身份验证时,SAM可以通过要求运行时重用先前建立的AS身份验证会话,从而避免用户身份(调用方和/或组)重用,从而避免重复整个过程。这是通过执行示例代码的中所示的“不做/离开身份验证状态为协议”来完成的。MessageInfo
__Principal``HttpServletSam
最后应该指出的是,JASPIC和Servlet规范都没有明确定义什么是 容器认证会话
。对于SAM身份验证的用户,出于所有实际目的,我将认为AS身份验证会话与HTTP会话等效,只要a)身份验证涉及单个应用程序上下文,b)SAM,如上所述,表示在每个请求上重复使用AS身份验证会话。
我是LDAP的新手,我尝试过在OpenLDAP上实现RBAC。我创建了一些用户(inetOrganizationPerson)并将它们放在组中(groupOfNames)。接下来,我创建了一些角色(organizationalRole)并将它们与用户组关联(RoleIncuspant),而不是直接将它们与用户关联。 1)/usr/local/bin/ldapsearch-x-b'ou=groups
我将LDAP配置为用户联合(使用角色LDAP映射器),并成功地将具有角色的用户导入到KeyClope。当我访问用户时- 它是一个bug还是一个特性?或者我配置错了什么? 用户角色 角色中的空用户 LDPA角色映射器配置
你能告诉我如何向控制台或视图显示用户角色以进行测试吗?我可以通过从ldap中的用户列中获取用户角色来重新定义(默认情况下从ldap'cn'获取角色)用户角色吗? 谢谢你。
在这节中,让我们来了解每个角色所需的不同工作/职位角色和技能,以便DevOps专业人员如何适应宏伟的计划。在这里,还将讨论与每个DevOps角色相关的各种职业机会。 DevOps职位角色 技能和技术 发布经理 规划和软件生命周期管理 DevOps领导 Jenkins, Git, Nagios, Zabbix, bit bucket, SVN, Chef, puppet, Ansible DevOp
在我们的新的保险项目中,我试图及其 我想检查用户名/密码对广告,
我正在寻找一种方法来自动更新另一个用户的权限。我似乎找不到一个聪明的方法来做这件事。我能想到的唯一解决方案是每次用户访问页面时从数据库加载用户组,但这可能会对性能造成很大影响。是不是有什么明显的方法让我错过了?