2017-08-06 5 views
0

Ist es möglich, einen benutzerdefinierten ldap Authentifizierungsanbieter zusammen mit benutzerdefinierten ldap Behörden Populator?Spring Security benutzerdefinierte ldapAuthenticationProvider + benutzerdefinierte ldapAuthoritiesPopulator

Ich möchte meine Anwendung nicht jedes Mal neu starten, wenn der LDAP-Server für einen kurzen Moment unerreichbar ist (also brauche ich den benutzerdefinierten Provider, um einen neuen Kontext zu erstellen und die Authentifizierungsmethode bei jeder Anmeldung zu überschreiben).

Auf der anderen Seite, ich brauche benutzerdefinierte Rollen für jede Mitgliedschaft in ldap Benutzer erstellen (müssen die getGrantedAuthorities außer Kraft zu setzen) benötigen Sie

Antwort

0

Für Implementieren von benutzerdefinierten LDAP-Authentifizierungs-Provider-Klasse erstellen, die

von AbstractLdapAuthenticator erstreckt
public class BindPasswordAuthentificator extends AbstractLdapAuthenticator { 

    public BindPasswordAuthentificator(BaseLdapPathContextSource contextSource) { 
     super(contextSource); 
    } 

    @Override 
    public DirContextOperations authenticate(Authentication authentication) { 
     DirContextOperations user; 

     String username = authentication.getName(); 
     String password = (String)authentication.getCredentials(); 

     user = authenticateByLdap(username, password); // authenticate user here 

     if (user == null) { 
      throw new BadCredentialsException(
        messages.getMessage("BindAuthenticator.badCredentials", "Bad credentials")); 
     } 

     return user; 
    } 
} 

Und ldap Behörden für die Umsetzung Populator Sie Klasse erstellen müssen, die

public class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator { 

    @Override 
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) { 
     Collection<GrantedAuthority> gauth = new HashSet<>(); 
     //you need to place logic for populating user authorities here 
     return gauth; 
    } 
} 
von LdapAuthoritiesPopulator erstreckt

Danach müssen Sie diese zwei Klassen in Ihrer Konfiguration konfigurieren:

@Configuration 
@PropertySource("classpath:application.properties") 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Value("${life.ldap.server}") 
    private String ldapServer; 

    @Autowired 
    public void globalUserDetails(final AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(ldapAuthenticationProvider()); 
    } 

    @Bean 
    public LdapAuthenticationProvider ldapAuthenticationProvider() { 
     return new LdapAuthenticationProvider(authentificator(), authPopulator()); 
    } 

    @Bean 
    public BindPasswordAuthentificator authentificator() { 
     return new BindPasswordAuthentificator(contextSource()); 
    } 

    @Bean 
    public DefaultSpringSecurityContextSource contextSource() { 
     return new DefaultSpringSecurityContextSource(ldapServer); 
    } 

    @Bean 
    public CustomLdapAuthoritiesPopulator authPopulator() { 
     CustomLdapAuthoritiesPopulator result = new CustomLdapAuthoritiesPopulator(); 
     return result; 
    } 

    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/login").permitAll() 
       .antMatchers("/oauth/token/revokeById/**").permitAll() 
       .antMatchers("/tokens/**").permitAll() 
       .anyRequest().authenticated() 
       .and().formLogin().permitAll() 
       .and().csrf().disable(); 
    } 
} 
Verwandte Themen