如何将 AD 组映射到用户角色 Spring 安全 LDAP

How to Map AD Groups to User Role Spring Security LDAP

我有一个使用 Java Spring MVC 构建的 Web 应用程序。

我正在设置 spring 安全连接到 LDAP 服务器以进行身份​​验证。

我已成功设置它,因此我可以登录到我的应用程序,但我找不到任何东西可以帮助我将 AD 组映射到 Java 中的用户角色只得到一个 403 禁止访问的页面,即我已经通过身份验证但还没有权限。

我目前有:

<http auto-config="true">
    <intercept-url pattern="/**" access="ROLE_USER" />      
</http>

<ldap-server id="ldapServer" url="LDAPURL" manager-dn="USER" manager-password="PASSWORD"  />

<authentication-manager > 
    <ldap-authentication-provider           
        group-search-base="OU=GROUPS"
        group-search-filter="sAMAccountName={0}"

        user-search-base="OU=USERS"
        user-search-filter="sAMAccountName={0}" 

        />
</authentication-manager>

假设该用户是 AD 组 g-group-UK-user 的一部分,然后我希望能够将该 AD 组映射到 ROLE_USER,这样用户就可以看到整个网络应用程序。

我似乎只能找到非常简单的示例,其中组是 ADMIN 或 USER,在这种情况下,前缀 ROLE 只是添加到组中,或者其他方法似乎正在使用 UserDetailContextMapper 但我找不到明确使用这个。

为此,我在身份验证管理器中使用了以下内容:

user-context-mapper-ref="customUserContextMapper"

然后我使用以下class检查该用户是否属于某个AD组,然后将ROLE_USER角色分配给他们的权限:

@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) 
{

    Attributes attributes = ctx.getAttributes();
    Object[] groups = new Object[100];
    groups = ctx.getObjectAttributes("memberOf");

    LOGGER.debug("Attributes: {}", attributes);

    Set<GrantedAuthority> authority = new HashSet<GrantedAuthority>();

    for(Object group: groups)
    {

        if (group.toString().toLowerCase().contains("AD_GROUP_NAME".toLowerCase()) == true)
        {
            authority.add(new SimpleGrantedAuthority("ROLE_USER"));
            break;          
        }
    }

    User userDetails = new User(username, "", false, false, false, false, authority);
    return userDetails;
}

请注意 class 比平常稍微复杂一些,因为我连接的 LDAP 服务器的结构与平常不同,因为用户有权访问的组存储在一个属性中在用户下,而不是相反,在这种情况下,一个组会将属于它的所有用户作为一个属性。