2016-07-12 2 views
0

Я настроен пружинный загрузки безопасности в соответствии с: https://spring.io/guides/gs/securing-web/Spring Security LDAP аутентификация пользователя должна быть членом группы AD

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

Я искал часы и не могу найти четкий способ сделать это в WebSecurityConfigurerAdapter, правильно ли я использую auth.groupSearchFilter?

Вот мой код:

@Configuration 
@EnableWebSecurity 

public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

//@Autowired 
//private LdapContextSource contextSource; 



@Autowired 
Environment env; 

public LdapContextSource contextSource() { 
    LdapContextSource contextSource= new LdapContextSource(); 

    System.out.println("url:" + env.getRequiredProperty("ldap.url")); 
    System.out.println("base:" + env.getRequiredProperty("ldap.baseDn")); 
    System.out.println("UserDn:" + env.getRequiredProperty("ldap.bindDn")); 
    //System.out.println("password:" + env.getRequiredProperty("ldap.batchPassword")); 
    contextSource.setUrl(env.getRequiredProperty("ldap.url")); 
    contextSource.setBase(env.getRequiredProperty("ldap.baseDn")); 
    contextSource.setUserDn(env.getRequiredProperty("ldap.bindDn")); 
    contextSource.setPassword(env.getRequiredProperty("ldap.batchPassword")); 
    contextSource.afterPropertiesSet(); 
    return contextSource; 
} 

@Override 
protected void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
    auth 
     .ldapAuthentication() 
     .userSearchFilter("(cn={0})") 

     .groupSearchBase("OU=Account Groups,OU=ITS Security") 
     .groupSearchFilter("(cn=AD-this-is-a-specific-group)") 
     .contextSource(contextSource()); 
} 




@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
      .anyRequest().fullyAuthenticated() 
      .and() 
     .formLogin(); 
} 

} 

ответ

1

Не уверен, что это лучший способ сделать это (с точки зрения жизненного цикла Spring Security в), но в основном я представил мои собственные DefaultLdapAuthoritiesPopulator, где я только переопределения getGroupMembershipRoles.

Первая вещь, хотя, я неправильно auth.groupSearchFilter выше, должно быть:

.groupSearchFilter("(member={0})") 

Во-вторых, я создал анонимный класс с переопределенный метод (который вызывает супер и проверки для членства в список ролей):

auth 
     .ldapAuthentication() 
     .ldapAuthoritiesPopulator(new DefaultLdapAuthoritiesPopulator(contextSource, "OU=Account Groups,OU=ITS Security") { 

      @Override 
      public Set<GrantedAuthority> getGroupMembershipRoles(String userDn, String username) { 
       Set<GrantedAuthority> groupMembershipRoles = super.getGroupMembershipRoles(userDn, username); 

       boolean isMemberOfSpecificAdGroup = false; 
       for (GrantedAuthority grantedAuthority : groupMembershipRoles) { 

        if ("ROLE_AD-this-is-a-specific-group".equals(grantedAuthority.toString())) {              
         isMemberOfSpecificAdGroup = true; 
         break; 
        } 
       } 

       if (!isMemberOfSpecificAdGroup) { 

        throw new BadCredentialsException("User must be a member of " + "AD-this-is-a-specific-group"); 
       } 
       return groupMembershipRoles; 
      } 
     }) 
     .userSearchFilter("(cn={0})")   
     .groupSearchBase("OU=Account Groups,OU=ITS Security") 
     .groupSearchFilter("(member={0})") 
     .contextSource(contextSource); 
0

Я извиняюсь за неоспоримые 5 лет поздни для партии, но у меня был точно такой же проблема с моей очень простой аутентификацией LDAP, реализованной в Spring ботинке.

Я только хотел: - Правильное имя пользователя? - Правильный пароль? - Если да, это usr в группе MYGROUP?

Так что мой метод настройки теперь выглядит очень маленьким. Я добавил populator в отдельный компонент, просто понимаю, что мне нужно добавить его в «auth.ldapAuthentication», чтобы он был вызван.

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

auth.ldapAuthentication() 
     .userSearchFilter("uid={0}") 
     .ldapAuthoritiesPopulator(ldapAuthoritiesPopulator()) 
     .groupSearchFilter("(member={0})") 
     .contextSource(contextSource()); 
} 

@Bean 
public LdapAuthoritiesPopulator ldapAuthoritiesPopulator() { 

DefaultLdapAuthoritiesPopulator populi = new DefaultLdapAuthoritiesPopulator(contextSource(), "") { 

    @Override 
    public Set<GrantedAuthority> getGroupMembershipRoles(String userDn, String username) { 
     Set<GrantedAuthority> groupMembershipRoles = super.getGroupMembershipRoles(userDn, username); 

     boolean isMemberOfSpecificAdGroup = false; 
     for (GrantedAuthority grantedAuthority : groupMembershipRoles) { 

      if ("ROLE_MYGROUP".equals(grantedAuthority.toString())) { 
       isMemberOfSpecificAdGroup = true; 
       break; 
      } 
     } 

     if (!isMemberOfSpecificAdGroup) { 

      throw new BadCredentialsException("User must be a member of " + "ROLE_MYGROUP"); 
     } 
     return groupMembershipRoles; 
    } 
}; 

    return populi; 
} 

@Bean 
public DefaultSpringSecurityContextSource contextSource() { 
    return new DefaultSpringSecurityContextSource("ldap://blabla-some-url:389/dc=something,dc=something,dc=ch"); 
    } 

И кстати: URL не работает, как упоминалось в Spring Boot guide он только работал так, как и все в одной строке:

return new DefaultSpringSecurityContextSource("ldap://blabla-some-url:389/dc=something,dc=something,dc=ch"); 

И кстати для каждого следующего этого руководства : Если вы подключаетесь к уже существующему LDAP-серверу, вам не нужны все эти свойства приложения «spring.ldap.embedded».

Так что спасибо вам за помощь!

+0

Большое спасибо за этот комментарий. Мой вызов 'getGroupMembershipRoles' всегда возвращает List of size (0). Какое требование требуется для получения полномочий здесь? – BigDong

+0

Как я вижу в своем проекте, единственным требованием является то, что ваш LDAP-сервер должен иметь ту же информацию, что и вы, в двух параметрах userDn и имени пользователя. Таким образом, userDn должен предоставить полную Dn для пользователя, и это Dn, и имя пользователя должно существовать на вашем LDAP-сервере. На самом деле я понимаю, что вам может понадобиться добавить параметр «groupSearchBase» ->, который просто «» в приведенном выше примере.Вы можете добавить groupSearchBase, если хотите, в строке 'DefaultLdapAuthoritiesPopulator populi = new DefaultLdapAuthoritiesPopulator (contextSource(), groupSearchBase) {' – Invest

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