使用 Ldap 进行春季授权和角色管理

Posted

技术标签:

【中文标题】使用 Ldap 进行春季授权和角色管理【英文标题】:spring authorizations and roles management with Ldap 【发布时间】:2017-08-19 04:27:12 【问题描述】:

我正在开发一个基于 spring java 的应用程序,我想使用 apache directory studio ldap 来管理用户,所以我想给每个用户一个角色并管理我使用 spring security 。

这是我的 security-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd">


<security:authentication-manager>
    <security:ldap-authentication-provider
        user-search-filter="(uid=0)" user-search-base="ou=users"
        group-search-filter="(uniqueMember=0)" group-search-base="ou=groups"
        group-role-attribute="cn" role-prefix="ROLE_" />

</security:authentication-manager>
<security:ldap-server url="ldap://localhost:8389/o=mojo"
    manager-dn="uid=admin,ou=system" manager-password="secret" />
<security:http use-expressions="true">
    <security:intercept-url pattern="/" access="hasRole('ROLE_Admin')" />
    <security:form-login />
</security:http>

这是我的 ldap 层次结构

这对我不起作用,即使我使用管理员凭据登录,也会出现 403 错误,拒绝访问。

有什么帮助吗?

【问题讨论】:

不确定是否有帮助,但上次我处理 spring-security LDAP 时,我不得不使用 hasAuthority 而不是 hasRole。给它一个机会... 不对我不起作用 【参考方案1】:

尝试以这种方式将&lt;security:intercept-url pattern="/" access="hasRole('ROLE_ADMIN')" /&gt; 中的角色设置为大写。

默认&lt;security:ldap-authentication-provider /&gt;,它自动配置一个org.springframework.security.ldap.authentication.LdapAuthenticationProvider创建一个org.springframework.security.ldap.userdetails.LdapUserDetailsMapper的实例,默认情况下有这个属性:

public class LdapUserDetailsMapper implements UserDetailsContextMapper 
    // ~ Instance fields
    // ================================================================================================

    private final Log logger = LogFactory.getLog(LdapUserDetailsMapper.class);
    private String passwordAttributeName = "userPassword";
    private String rolePrefix = "ROLE_";
    private String[] roleAttributes = null;
    private boolean convertToUpperCase = true;

以此类推,当convertToUpperCase设置为true时,这个方法

/**
     * Creates a GrantedAuthority from a role attribute. Override to customize authority
     * object creation.
     * <p>
     * The default implementation converts string attributes to roles, making use of the
     * <tt>rolePrefix</tt> and <tt>convertToUpperCase</tt> properties. Non-String
     * attributes are ignored.
     * </p>
     *
     * @param role the attribute returned from
     * @return the authority to be added to the list of authorities for the user, or null
     * if this attribute should be ignored.
     */
    protected GrantedAuthority createAuthority(Object role) 
        if (role instanceof String) 
            if (this.convertToUpperCase) 
                role = ((String) role).toUpperCase();
            
            return new SimpleGrantedAuthority(this.rolePrefix + role);
        
        return null;
    

最终将您的ou:groups Admin 转换为ROLE_ADMIN,这与ROLE_Admin 不匹配

【讨论】:

【参考方案2】:

错误是在我的 LDAP 层次结构中,我应该将组命名为 cn=ROLE_ADMIN 而不是 cn=Admin,因为我的 security-context.xml 文件中有 role-prefix="ROLE_"

【讨论】:

我建议你删除你的问题。 没有机会编辑LDAP的注意;如果你不是用 hasRole("ROLE_Admin") 而是用 hasAuthority("Admin");不需要重命名 LDAP 层次结构。

以上是关于使用 Ldap 进行春季授权和角色管理的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权

如何通过数据库的LDAP和基于角色的授权实现Spring安全?

Spring Security - LDAP 身份验证和数据库授权

使用 CAS 进行身份验证和 LDAP 进行授权的 Spring 项目

Shiro LDAP 授权配置

MySQL 用户管理之 GRANT 授权