Spring Authorization Server пытается аутентифицировать клиентов OAuth2 по LDAP - PullRequest
0 голосов
/ 05 ноября 2018

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

Однако я хочу, чтобы мой клиент проходил аутентификацию с использованием ClientDetailsService, а затем пользователь, указанный в запросе, проходил аутентификацию по LDAP. Я не уверен, почему это происходит. Любая помощь будет принята с благодарностью.

Я не совсем уверен, в чем причина проблемы, за исключением того, что @Order (Order.HIGHEST_PRECEDENCE) заставляет этот фильтр пытаться аутентифицировать весь первый запрос, поэтому запрос к конечной точке токена не проверяется на соответствие правильный класс конфигурации.

Когда я нажимаю на конечную точку OAuth / токена с действительными учетными данными oauth2-client, я получаю неавторизованный ответ. Однако, когда я изменяю учетные данные клиента на свои учетные данные ldap, я получаю неверный ответ учетных данных клиента.

@Configuration
@EnableWebSecurity
@Order(Ordered.HIGHEST_PRECEDENCE)
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {

    @Value("${example.ldap.url}")
    private String ldapUrl;

    @Value("${example.ldap.base}")
    private String ldapBase;

    @Value("${example.ldap.username}")
    private String ldapUsername;

    @Value("${example.ldap.password}")
    private String ldapPassword;

    @Value("${example.ldap.userDnPattern}")
    private String[] userDnPattern;

    /**
     * This exposes the web-security AuthenticationManager for use in the
     * OauthConfig. This allows us to do LDAP Authentication against the user being
     * supplied by the client.
     */
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsServiceBean() throws Exception {
        return super.userDetailsServiceBean();
    }

    @Bean
    public OAuth2ClientResourceAssembler oAuth2ClientResourceAssembler() {
        return new OAuth2ClientResourceAssembler();
    }

    @Bean
    BaseLdapPathContextSource contextSource() {
        LdapContextSource ldapContextSource = new LdapContextSource();
        ldapContextSource.setUrl(ldapUrl);
        ldapContextSource.setBase(ldapBase);
        ldapContextSource.setUserDn(ldapUsername);
        ldapContextSource.setPassword(ldapPassword);

        return ldapContextSource;
    }

    /**
     * Allow spring to inject dependencies
     * 
     * @return
     */
    @Bean
    public DaoAuthoritiesPopulator daoAuthoritiesPopulator() {
        return new DaoAuthoritiesPopulator();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication().userDetailsContextMapper(new LdapEntryMapper())
                .ldapAuthoritiesPopulator(daoAuthoritiesPopulator()).userSearchFilter("(samAccountName={0})")
                .contextSource(contextSource());
    }

    /**
     * Allow only users with ADMIN rights to access the client and user endpoint
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/client/**").hasRole("ADMIN").and().httpBasic();
        http.authorizeRequests().antMatchers("/user/**").hasRole("ADMIN").and().httpBasic();
        http.authorizeRequests().and().csrf().disable();
    }
}

@Configuration
public class OauthConfiguration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private OAuth2ClientDetailsService oAuth2ClientDetailsService;

    /**
     * Ldap Authentication for password grant types
     */
    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;

    /**
     * 
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(oAuth2ClientDetailsService);
    }

    /**
     * Inserting an autenticationManager allows for password grant types.
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager).userDetailsService(userDetailsService);
    }
}

@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }
}

1 Ответ

0 голосов
/ 06 ноября 2018

Я понял это. Мне пришлось изменить класс websecurityconfigurer, чтобы использовать сопоставление регулярных выражений, чтобы сопоставлять только те запросы, к которым я хотел применить аутентификацию ldap. Поэтому все остальные запросы были перенесены на другие классы конфигурации

@Override
    public void configure(HttpSecurity http) throws Exception {

        http.requestMatchers().regexMatchers("/client.+", "/user.+");

        http.authorizeRequests().antMatchers("/client/**").hasRole("ADMIN").and().httpBasic();
        http.authorizeRequests().antMatchers("/user/**").hasRole("ADMIN").and().httpBasic();
        http.authorizeRequests().and().csrf().disable();
    }

Руководство разработчика объясняет это: Руководство разработчика в разделе «Настройка URL-адресов конечных точек»

...