4

Моя проблема заключается в том, что я хотел бы иметь двух поставщиков аутентификацииSpring Загрузочный безопасности - несколько провайдеров аутентификации

ДО: у меня UserDetailServiceImpl и я удостоверила пользователей от БД (не уверен, что провайдер это) пользователь получил роль в соответствии с данными в БД

СЕЙЧАС: Я использовал поставщик ActiveDirectoryLdapAuthentication следующего

@Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     super.configure(auth); 
     auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailService); 
    } 

    @Bean 
    public AuthenticationManager authenticationManager() { 
     return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider())); 
    } 
    @Bean 
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
     MyActiveDirectoryLdapAuthenticationProvider provider = new MyActiveDirectoryLdapAuthenticationProvider(domain, url, rootDN); 
     provider.setConvertSubErrorCodesToExceptions(true); 
     provider.setUseAuthenticationRequestCredentials(true); 

     return provider; 
    } 

Я заставил его работать, поэтому я могу пройти аутентификацию.

ПРОБЛЕМА:

  1. Я не могу сейчас войти в систему с базой данных пользователей больше, только LDAP в настоящее время.
  2. UserDetailsService не используется, и какую роль у пользователя есть?
  3. Есть ли способ добавить роль по умолчанию для аутентифицированного пользователя LDAP?

Итак, как включить обоих поставщиков? Как добавить роли пользователю, прошедшим проверку подлинности через LDAP auth.provider?

Я также очень благодарен за общую картину, что здесь происходит (под капотом). Какова роль каждого из используемых здесь классов, действительно непонятно, как это работает (AuthenticationManager, AuthenticationManagerBuilder, AuthenticationProvider и т. Д.) Может быть, это просто скрыто автоконфигурацией и так, но даже глядя на Spring Security напрямую не делает меня любой разумнее.

Спасибо за любые подсказки

UPDATE Этот код, кажется, работает нормально

@Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailService); 
    } 

    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
     MyActiveDirectoryLdapAuthenticationProvider provider = new MyActiveDirectoryLdapAuthenticationProvider(domain, url, rootDN); 
     provider.setConvertSubErrorCodesToExceptions(true); 
     provider.setUseAuthenticationRequestCredentials(true); 
     provider.setAuthoritiesMapper(new SimpleAuthorityMapper()); 
     return provider; 
    } 

ответ

1

Слишком много вопросов!

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

Стандарт LdapAuthenticationProvider имеет authoritiesMapper, который можно использовать для отображения власти из записей каталога для пользователей (как правило, это делается из коробки с помощью групп каталогов, например, см sample). Я полагаю, что если ваш каталог не содержит групп, вы можете заставить всех пользователей иметь те же полномочия или что-то с помощью настраиваемого сопоставления.

Ваш @Beans типа AuthenticationManager и AuthenticationProvider выглядят подозрительно резервированных (и, возможно, вредными, так как они являются глобальными, и вы настраиваете AuthenticationManagerBuilder для одной цепи фильтра). Я сомневаюсь, что вам нужен этот метод AuthenticationManager, а другой нет необходимости публиковать или @Bean (возможно).

+0

Означает ли это, что я не могу автоматически защищаться от двух провайдеров сразу?Наличие суперпользователя в базе данных, возможность входа в систему, если LDAP недоступен и т. Д. Власть может быть полезна, и мы, вероятно, также имеем некоторые группы в AD, я проверю. Попробуем ваши советы завтра. Спасибо, сейчас. – Zveratko

+0

Без '@Bean public AuthenticationManager authenticationManager()' он полностью перестает работать: -/ – Zveratko

+0

Создано несколько созданных AuthenticationManagerBuilders, я думал, что должно быть только одно. Я не понимаю. – Zveratko

Смежные вопросы