在我的应用程序中,我将基于表单的身份验证与LDAP-Realm结合使用。对于授权,我使用数据库。据我了解,这如下
App --> (user, pass) --> LDAP <-- OK, user exists -- --> ask for security roles for 'user' --> JACC / Database <-- Administrator --
我可以进入应用程序调用的过程ask for security roles for 'user'吗?
ask for security roles for 'user'
背景:
LDAP说: Okay, 'user' is authentified
Okay, 'user' is authentified
数据库: give me all roles where username = user
give me all roles where username = user
而 现在,我想自定义数据库查询:give me all roles where username = 'user' AND some more attributes
give me all roles where username = 'user' AND some more attributes
这可能吗?
TL; DR:看看 这个和那个样本解决方案。
您所要求的取决于您使用的特定于供应商的功能所提供的灵活性。您的产品可能会也可能不会允许您扩展那个/这些LoginModule// Realm/ 的行为,IdentityStore无论它是什么/被称为专有类,甚至可能只是在某些管理UI的输入字段中键入SQL查询。最重要的是,它是非标准功能。
LoginModule
Realm
IdentityStore
在标准Java EE方面,有 JASPIC (用户/消息身份验证)和 JACC (授权)SPI。两者都可用于从某些外部存储中检索与您的用户有关的安全性相关信息。JASPIC不能做的就是 在 验证 后 更改用户的角色;也就是说,在经过 身份验证的请求 1的持续时间内,用户的角色是 固定的 。JASPIC也不能赋予这些角色以 含义 ;因为它们仅仅String是AS将以某种专有方式派生group Principal的原因。另一方面,JACC可以做这些事情,因为它建立了“规则库”(认为Policy),它将角色,主体和Permissions精确地关联起来,并且可以在每次用户与系统的每次交互中查询。JACC还可以覆盖或更改对通过部署描述符和批注表示的Java EE安全约束的解释。
String
Principal
Policy
Permission
我将在这篇文章中包括一个基于JASPIC的解决方案,而在很大程度上忽略了JACC,因为:
关于以下内容的一些评论:
login.conf
AuthConfigProvider
ServerAuthConfig
AuthConfigFactory
foo-web.xml
ServerAuthContext
Properties
provided
javaee-api
ServletContextListener
/<project>/src/main/java/org/my/foosoft/authn/BigJaspicFactoryRegistrar.java
/<project>/src/main/java/org/my/foosoft/authn/BigJaspicFactory.java
/<project>/src/main/java/org/my/foosoft/authn/LittleJaspicServerFactory.java
ServerAuthModule
/<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
/<project>/src/main/resources/org/my/foosoft/authn/jaspic-provider.properties
/<project>/src/main/java/org/my/foosoft/presentation/UserUtils.java
/<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
进一步阅读:
1 JASPIC是非常通用的SPI,从理论上讲,当插入有能力的消息处理运行时时,它就可以对JMS,SAML-over- SOAP和任何其他类型的消息进行身份验证。即使它主要用于 Servlet容器配置文件, 也不会过度限制它。
JASPIC的低级别,灵活的特性使您不了解特定于协议的功能,例如HTTP会话。因此,ServerAuthContext运行时将触发s / SAM,以对每个请求执行身份验证。
但是,该规范通过允许SAM 通过运行时通过 Callback属性 请求发起 容器身份验证会话 来对此潜在的缺陷作了规定。当要求对同一客户端的后续请求进行身份验证时,SAM可以通过要求运行时重用先前建立的AS身份验证会话,从而避免用户身份(调用方和/或组)重用,从而避免重复整个过程。这是通过执行示例代码的中所示的“不做/离开身份验证状态为协议”来完成的。MessageInfo __Principal``HttpServletSam
MessageInfo
Principal``HttpServletSam
最后应该指出的是,JASPIC和Servlet规范都没有明确定义什么是 容器认证会话 。对于SAM身份验证的用户,出于所有实际目的,我将认为AS身份验证会话与HTTP会话等效,只要a)身份验证涉及单个应用程序上下文,b)SAM,如上所述,表示在每个请求上重复使用AS身份验证会话。