将 X509 值传递给 LDAP 服务器

Posted

技术标签:

【中文标题】将 X509 值传递给 LDAP 服务器【英文标题】:Passing X509 value to LDAP server 【发布时间】:2013-01-12 11:09:07 【问题描述】:

我正在努力在我的项目中实施 Spring Security。我需要使用 Spring Security 从证书 CN 中提取的用户名作为 LDAP 服务器上的uid。我不确定解决这个问题的正确方法。我不确定如何将 CN 值从 x509 传递到 LDAP 身份验证器。有没有人做过这个或者有什么想法?

注意:我不需要将整个证书传递给 LDAP 服务器,因为它们没有存储在那里,只有来自 CN 的用户名。

编辑:这是我的 spring security xml 文件中的一些配置:

<http>
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <anonymous />
    <x509 subject-principal-regex="CN=(.*?)," /> <!-- user-service-ref needed? -->
</http>

<ldap-server id="ldapServer" url="ldap://localhost:389/dc=example,dc=com" manager-dn="cn=manager,dc=example,dc=com" manager-password="myPassword" />

<authentication-manager>
    <ldap-authentication-provider
       user-dn-pattern="uid=0,ou=people"
       user-search-filter="(uid=0)"
       user-search-base="ou=people,dc=example,dc=com"
       group-search-filter="(member=0)"
       group-search-base="ou=groups"
       group-role-attribute="cn" />        
</authentication-manager>

【问题讨论】:

CN 不是 UID。您的问题描述存在严重问题。 也许我应该澄清一下:我有一个正则表达式,我正在提取 CN 的一部分。那部分无关紧要。相关部分是我要问的,如何将我提取的值传递到 LDAP 服务器。我已经添加到我目前拥有的标签中。谢谢 【参考方案1】:

您应该使用ldap-user-service。这是来自 Spring Security 测试套件的an example configuration。然后 Spring Security 应该自动替换它从证书 CN 中提取的用户名来代替 LDAP 搜索过滤器中的 0 标记。

ldap-authentication-provider 元素用于使用用户名和密码对用户进行身份验证,这在 X.509 中不是您想要的,在 X.509 中,容器对证书的验证被视为执行身份验证。

Spring Security 的 X.509 身份验证过滤器需要一个 UserDetailsService 来为用户加载信息,因此您需要在配置中使用一个。正如in the manual 所解释的,如果只有一个属性,则不需要使用user-service-ref 属性,因此只需添加ldap-user-service 声明就足够了。

【讨论】:

这帮助我部署了一切。我现在无法获得用户身份验证。没有显示日志记录,我将如何启用它?此外,role-prefix="none" 不起作用,仍然在自定义角色上抛出属性错误。有什么想法吗? 检查任何示例应用程序以了解如何配置日志记录。我不知道您所说的“在自定义角色上引发属性错误”是什么意思。 例如,如果我在ldap-user-service 下输入role-prefix="none" 并使用自定义角色,例如&lt;intercept-url pattern="/**" access="user" /&gt;,我会收到错误消息Unsupported configuration attributes: [user]。根据文档,将角色设置为无,我可以使用自己的自定义角色,但这似乎不起作用。 如果您删除角色前缀,标准 RoleVoter 将不会使用这些属性(请参阅常见问题解答)。您可以切换到使用表达式而不是 &lt;http use-expressions='true'&gt; 并使用 access="hasRole('user')"

以上是关于将 X509 值传递给 LDAP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

将字典值作为空值传递给 alamofire 服务 ios swift

使用 POST 方法将值传递给 Web 服务 [关闭]

无法使用 asp.net Web 服务将 ajax 标头值传递给我的 Web 服务方法

如何在android中使用api将多个选中的复选框值传递给服务器?

如何将值传递给 Gitlab CI 作业

将 JavaScript 值传递给 PHP 变量(有限制)