spring security ldap - problem

0

Witam,

Mam lekki problem autoryzacji użytkownika z domeną. Komputer na którym odpalam projekt jest poza domeną.

Struktura w domenie:

nazwa domeny: DOMENA.local
Lokalizacja użytkownika: Duser/B/B1/* (użytkownicy)

klasa WebSecurity

@Configuration
public class WebSecurityControl extends WebSecurityConfigurerAdapter {

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

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .userDnPatterns("uid={0},ou=BI,ou=B,ou=Duser")
                .groupSearchBase("ou=BI,ou=B,ou=Duser")
                .contextSource()
                .url("ldap://IP:389/dc=DOMENA,dc=local")
                .and()
                .passwordCompare()
                .passwordEncoder(passwordEncoder())
                .passwordAttribute("userPassword");
    }

    private PasswordEncoder passwordEncoder() {
        final BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence rawPassword) {
                return bcrypt.encode(rawPassword.toString());
            }
            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
                return bcrypt.matches(rawPassword, encodedPassword);
            }
        };
    }

    @Bean
    public BCryptPasswordEncoder bcryptEncoder() {
        return new BCryptPasswordEncoder();
    }

Niestety ciągle wyświetla się błąd:

Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0907C2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580]; remaining name 'uid=(user??),ou=BI,ou=B,ou=Duser'

Szczerze próbowałem na wiele sposobów rozwiązać dany. Za wszelką pomoc dziękuje z góry.

0

Dawno się męczyłem z ldapem i nie pamiętam już trochę, ale może coś pomoże.

  1. Czy ten ldap to Active Directory?
  2. Ściągnij jakieś narzędzie typu LDAP Admin, spróbuj się nim połączyć
  3. Sprawdź czy masz możliwość połączenia się anonimowego do LDAPa
  4. Jak wszystko wyżej zadziała to spróbuj zrobić przykład z LdapTemplate. Jak to pójdzie to może trzeba będzie zmienić trochę kod security
  5. Logowanie ma być przez formularz tylko do userów z ldapa? Czy SSO i z bazy danych też?
0

Witam,

  1. Czy ten ldap to Active Directory?

Tak to Active Directory

2.Ściągnij jakieś narzędzie typu LDAP Admin, spróbuj się nim połączyć

Połączyłem się przez LDAP Admin -> przez ustawienia:

Host: DOMENA.local
BASE: DC=DOMENA,DC=local

Username: poszło z CN i pełną sciężką do użytkownika czyli: CN:fullName,OU=BI,OU=B,OU=DUser,DC=DOMENA,DC=local

3.Sprawdź czy masz możliwość połączenia się anonimowego do LDAPa

Mam

4.Jak wszystko wyżej zadziała to spróbuj zrobić przykład z LdapTemplate. Jak to pójdzie to może trzeba będzie zmienić trochę kod security
Tutaj też problem z uruchomieniem...

5.Logowanie ma być przez formularz tylko do userów z ldapa? Czy SSO i z bazy danych też?

Na chwile obecną próbuje przez userów z ldapa.

0

Co przekazujesz jako {0}?

Z jednej strony piszesz, ze poszło po takim DN: ``` CN:fullName,OU=BI,OU=B,OU=DUser,DC=DOMENA,DC=local ```

Tymczasem w kodzie masz:

 .userDnPatterns("uid={0},ou=BI,ou=B,ou=Duser")

Spróbuj dać wzorzec:

 .userDnPatterns("CN={0},OU=BI,OU=B,OU=DUser,DC=DOMENA,DC=local")

Z tego co kojarze, to w schemacie AD nie ma "uid". Prędzej w OpenLDAP.
https://docs.microsoft.com/en-us/windows/desktop/adschema/c-user

Jednak, źle skojarzyłem i uid jest https://docs.microsoft.com/en-us/windows/desktop/adschema/a-uid

0

Witam,

Na chwile obecną udała się autoryzacja hasłem po LdapTemplate. Co do "uid" to chyba zależy od konfiguracji domeny. U mnie okazuje się że jest to sAMAccountName.
application.properties

ldap.base=dc=DOMAIN,dc=local
ldap.user=(użytkownik domenowy)@DOMAIN.local
ldap.password=hasło
ldap.url=ldap://DOMAIN.local:389
ldap.userBase=ou=BI,ou=B,ou=Duser

LDapConfig

@Configuration
public class LdapConfig {

    @Autowired
    private Environment env;

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

        contextSource.setUrl(env.getRequiredProperty("ldap.url"));
        contextSource.setBase(env.getRequiredProperty("ldap.base"));
        contextSource.setUserDn(env.getRequiredProperty("ldap.user"));
        contextSource.setPassword(env.getRequiredProperty("ldap.password"));


        return contextSource;
    }

    @Bean
    public LdapTemplate ldapTemplate() {
        return new LdapTemplate(contextSource());
    }

    @Bean
    public LdapClient ldapClient() {
        return new LdapClient();
    }
}

LdapClient

public class LdapClient {

    @Autowired
    private Environment env;

  /*  @Autowired
    private ContextSource contextSource;*/

    @Autowired
    private LdapTemplate ldapTemplate;

    public boolean authenticate (String user, String password){
        Filter filter = new EqualsFilter("sAMAccountName", user);

        return ldapTemplate.authenticate(env.getProperty("ldap.userBase"), filter.encode(), password);
    }

Pytanie czy można ominąć wpisywanie użytkownika i hasła, gdyż wolałbym się autoryzować bezpośrednio po logującym się użytkowniku.

contextSource.setUserDn("[email protected]");
contextSource.setPassword("haslo");

Teraz sprawdzenie czy użytkownik znajduje się w grupie. Jak coś się uda to napiszę, chyba że znowu będą problemy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1