Spring Security с ролями LDAP и базы данных

В нашем новом страховом проекте я пытаюсь реализовать spring -security с Ldap active- каталог.

Я хочу просто проверить имя пользователя / пароль в AD, как только пользователь найдет его в AD. Я хочу авторизовать его из таблицы пользователей (авторизованные пользователи приложения) с уровнями доступа в базе данных. Может ли кто-нибудь дать мне образец / указать мне на хороший ресурс.


person Jon Smith    schedule 22.05.2013    source источник
comment
Вот хороший ресурс: javaworld.com/jw-06- 2007 / jw-06-springldap.html   -  person Display Name is missing    schedule 22.05.2013


Ответы (2)


Самый простой способ добиться этого сейчас (Spring Security 3.2.5.RELEASE) - реализовать настраиваемый LdapAuthoritiesPopulator, который использует настраиваемый JdbcDaoImpl для получения полномочий из базы данных.

Код

Предполагая, что вы используете схему базы данных по умолчанию, и что вы используете одно и то же имя пользователя для аутентификации в LDAP и в качестве внешнего ключа в таблице authorities, вам нужно только это:

package demo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;

import org.springframework.ldap.core.DirContextOperations;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;

/*
 * You need to extend JdbcDaoImpl to expose the protected method loadUserAuthorities.
 */
public class CustomJdbcUserDetailsService extends JdbcDaoImpl {

    @Override
    public List<GrantedAuthority> loadUserAuthorities(String username) {
        return super.loadUserAuthorities(username);
    }
}


/*
 * Then, the only thing your populator needs to do is use the custom UserDetailsService above.
 */
public class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomLdapAuthoritiesPopulator.class);

    private CustomJdbcUserDetailsService service;

    public CustomLdapAuthoritiesPopulator(CustomJdbcUserDetailsService service) {
        this.service = service;
    }

    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations user, String username) {
        return service.loadUserAuthorities(username);
    }

}

Осталось только настроить провайдер аутентификации LDAP на использование CustomLdapAuthoritiesPopulator.

Конфигурация Java

В аннотированном @Configuration подклассе GlobalMethodSecurityConfiguration или WebSecurityConfigurerAdapter (в зависимости от вашего случая) добавьте следующее:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    /* other authentication configurations you might have */

    /*
     * This assumes that the dataSource configuring
     * the connection to the database has been Autowired
     * into this bean.
     *
     * Adapt according to your specific case.
     */
    CustomJdbcUserDetailsService customJdbcUserDetailsService = new CustomJdbcUserDetailsService();
    customJdbcUserDetailsService.setDataSource(dataSource);

    CustomLdapAuthoritiesPopulator customLdapAuthoritiesPopulator = new CustomLdapAuthoritiesPopulator(customJdbcUserDetailsService);

    auth.ldapAuthentication().ldapAuthoritiesPopulator(customLdapAuthoritiesPopulator)/* other LDAP configurations you might have */;

    /* yet more authentication configurations you might have */
}

См. https://github.com/pfac/howto-spring-security для рабочий пример.

Конфигурация XML

Заявление об ограничении ответственности: я работал исключительно с конфигурацией Java, поэтому действуйте осторожно, могут быть некоторые ошибки.

В отличие от других конфигураций для аутентификации с помощью LDAP, похоже, нет красивых тегов XML для настройки LdapAuthoritiesPopulator. Значит, это нужно делать вручную. Предполагая, что компонент contextSource, настраивающий соединение с сервером LDAP, был определен, добавьте следующее в конфигурацию Spring XML:

<beans:bean id="customJdbcUserDetailsService" class="demo.CustomJdbcUserDetailsService" />
<beans:bean id="customLdapAuthoritiesPopulator" class="demo.CustomLdapAuthoritiesPopulator">
    <beans:constructor-arg ref="customJdbcUserDetailsService" />
</beans:bean>

<beans:bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
            <beans:constructor-arg ref="contextSource" />
            <!--
                other configurations you might need
            -->
        </beans:bean>
    </beans:constructor-arg>
    <beans:constructor-arg ref="customLdapAuthoritiesPopulator" />
</beans:bean>

<security:authentication-manager>
  <security:authentication-provider ref="ldapAuthProvider" />
</security:authentication-manager>

Источник: http://spapas.github.io/2013/10/14/spring-ldap-custom-authorities/#spring-security-ldap-with-custom-authorities

person pfac    schedule 21.01.2015
comment
Где подробности подключения к AD? - person Somebody; 04.11.2019

Скорее всего, вам придется сделать собственный UserDetailsServer, поскольку вы аутентифицируетесь через LDAP, но получаете роли через запрос БД. UserDetailsService - это интерфейс. Вы должны реализовать интерфейс, а затем добавить свою собственную реализацию в конфигурацию Spring Security, выполнив что-то вроде:

<beans:bean id="userDetailsService" class="com.app.MyUserDetailsServiceImpl" />

<authentication-manager>
  <authentication-provider user-service-ref="userDetailsService">
    <password-encoder hash="plaintext" />
  </authentication-provider>
</authentication-manager>

В loadUserByUsername () вы должны создать UserDetails, задав имя пользователя, пароль и" полномочия ", то есть роли.

В этом сообщении блога есть пример того, как это сделать. используя базу данных, которую вы сможете адаптировать к своим требованиям.

person CodeChimp    schedule 22.05.2013
comment
Где мне нужно реализовать метод аутентификации LDAP AD? - person Jon Smith; 22.05.2013
comment
Вы должны получить идентификатор пользователя и пароль из ldap, роли (называемые полномочиями) из своей базы данных, а все остальное сделает Spring Security. Параметр кодировщика пароля в конфигурации сообщает Spring, как кодируется пароль в базовой системе, например: MD5 или SHA1. В приведенном выше примере мы сказали spring, что пароль в UserDetails будет в виде обычного текста. - person CodeChimp; 23.05.2013