Как отобразить группы AD на роль пользователя Spring Security LDAP

У меня есть веб-приложение, созданное с использованием Java Spring MVC.

Я просто настраиваю Spring Security для подключения к серверу 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, но я не могу найти явного использования этого.

1 ответ

Решение

Для этого я использовал следующее в менеджере аутентификации:

user-context-mapper-ref="customUserContextMapper"

Затем я использовал следующий класс, чтобы проверить, принадлежит ли этот пользователь к определенной группе 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;
}

Обратите внимание, что этот класс немного сложнее, чем обычно, из-за того, что я подключался к серверу LDAP, структура которого отличается от обычной тем, что группы, к которым у пользователя есть доступ, хранятся в атрибуте пользователя, а не наоборот. в которой группа будет иметь в качестве атрибута всех пользователей, которые к ней относятся.

Другие вопросы по тегам