Я работаю над созданием сервера авторизации, но столкнулся с проблемой, когда сервер авторизации пытается аутентифицировать мой клиент, используя пароль 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();
}
}