15 Nisan 2018 Pazar

SpringSecurity LdapAuthenticationProvider Sınıfı

Giriş
Şu satırı dahil ederiz
import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
Spring tarafından hazır sağlanan bir Provider sınıfıdır. AuthenticationProvider arayüzünden kalıtır.
Eğer LDAP kodlarını kendimiz yazmak istersek yani Custom Authentication Provider sağlamak istersek, AuthenticationProvider'dan kalıtan bir sınıf kodlayım bunun içinde
sınıflarını kullanırız

Ama ne gerek var :)

Eğer reactive yöntem kullanmak istersek bir örnek burada

Maven
Şu satırı dahil ederiz
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-ldap</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-ldap</artifactId> </dependency> <dependency> <groupId>org.springframework.ldap</groupId> <artifactId>spring-ldap-core</artifactId> </dependency>
Eğer test için embedded LDAP kullanmak istersek unboundid kullanılabilir.

Genel Kullanım
Örnek
Şöyle yaparız. Burada kullanıcı form ile giriş yapıyor ancak doğrulama işlemini Ldap yapıyor.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Value("${spring.ldap.urls}")
  private String ldapUrl;
  @Value("${spring.ldap.base}")
  private String ldapBase;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
   http
     .csrf().disable()
     .authorizeRequests()
     .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
     .anyRequest().authenticated()
     .and()
       .formLogin()
     .and()
       .httpBasic();
  }

  @Override
  public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
      .ldapAuthentication()
        .userDnPatterns("uid={0},ou=people")
        .groupSearchBase("ou=groups")
        .contextSource()
        .url(ldapUrl + ldapBase)
      .and()
         .passwordCompare()
         .passwordEncoder(new BCryptPasswordEncoder())
         .passwordAttribute("userPassword");
    }
}
Örnek - XML
Şöyle yaparız
<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider user-service-ref="userDetailsService"/>
    <security:authentication-provider ref="ldapProvider"/>
</security:authentication-manager>

<bean id="userDetailsService" class="*******.CustomUserDetailsService">
    <property name="userDetailsService" ref="userDetailsService"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="annotatedSessionFactory" ref="sessionFactory"></property>
</bean>

<bean id="ldapProvider"
 class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <constructor-arg ref="authenticator"/>
    <constructor-arg ref="ldapAuthPopulator"/>
</bean>
userDnPatterns metodu
Belirtilen pattern'a uyan kullanıcıyı bulmaya çalışır. 

ContextSource nesnesine ait url metodu LDAP'ın başlangıç arama yolunu belirtir. Şuna benzer 
"ldap://ldap.forumsys.com:389/dc=example,dc=com" 

Örnek
Şöyle yaparız. {0} kullanıcı ismi anlamına gelir.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth
    .ldapAuthentication()
      .userDnPatterns("uid={0},ou=people")
      .groupSearchBase("ou=groups")
      .userSearchFilter("uid={0}")
      .groupSearchBase("ou=groups")
      .groupSearchFilter("uniqueMember={0}")
      .contextSource()
      .url(ldapUrl);
}
userSearchFilter metodu
Şöyle yaparız
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth
    .ldapAuthentication()
    .userSearchFilter("(uid={0})")
    .contextSource()
    .url("ldap://localhost:8389/dc=breadcrumbdata,dc=com");
}

Diğer

managerDn
LDAP'a bağlanan kullanıcı ismidir. Şuna benzer
"cn=read-only-admin,dc=example,dc=com"

managerPassword
LDAP'a bağlanan kullanıcı şifresidir. Şuna benzer
"password "


Hiç yorum yok:

Yorum Gönder