2017-02-08 5 views
0

У меня есть приложение, которое использует как Basic Auth, так и OAuth2.Как разрешить «/ api/**» через мою основную конфигурацию auth и в мою конфигурацию oauth в Spring Security

Некоторые URL-адреса авторизованы с использованием Basic Auth, а «/ api/**» разрешено с использованием OAuth2.

В настоящее время, у меня есть два файла конфигурации Java (WebSecurityConfigurerAdapter и ResourceServerConfigurerAdapter)

Каждый из конфигурационных файлов определяют способ public void configure(HttpSecurity http).

Проблема, с которой я столкнулся, заключается в том, что мне нужен элегантный способ рассказать моему приложению, следует ли использовать базовый auth или oauth2 с учетом запроса url.

В настоящее время я использую requestMatchers, чтобы это произошло:

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
{ 
    @Override 
    protected void configure(HttpSecurity http) throws Exception 
    { 
    http 
     .csrf().disable() 
    .requestMatchers() 
     .antMatchers("/*", "/login/**", "/reviews/**") 
    .and() 
    .authorizeRequests() 
     .antMatchers("/*").permitAll() 
     .antMatchers("/js/**").permitAll() 
     .antMatchers("/img/**").permitAll() 
    .formLogin() 
     .loginPage("/login") 
     .successHandler(loginSuccessPostHandler) 
     .permitAll() 
     .and() 
    .logout() 
     .logoutSuccessUrl("/").permitAll() 
     .and() 
    .apply(getSpringSocialConfigurer()); 
    } 
} 

@Configuration 
public class OAuth2ServerConfig 
{ 
    @Configuration 
    @EnableResourceServer 
    protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter 
    { 
    @Override 
    public void configure(HttpSecurity http) throws Exception 
    { 
     http.httpBasic().disable(); 
     http.csrf().disable(); 

     http.requestMatchers() 
     .antMatchers("/api/**") 
     .and() 
     .authorizeRequests() 
     .antMatchers("/api/v1/**").access("#oauth2.hasScope('read')"); 
    } 
    } 
} 

Проблема заключается в том, что каждый раз, когда я добавить новый URL-адрес, который не «/ апи/**», мне нужно, чтобы добавить его в мой раздел запроса Matcher ... это может привести к глупым ошибкам в будущем.

Есть ли способ поиска запросаМатчика на основе негативного регулярного выражения? Я пробовал это с помощью регулярного выражения: ^(?!/api), но поскольку он фактически не возвращает MATCH и возвращает «find == true», похоже, что он не выполняет эту работу.

Любые мысли или предложения?

ответ

2

Вы можете использовать NegatedRequestMatcher:.

A RequestMatcher, что сведет на нет RequestMatcher прошел в Например, если RequestMatcher прошел в возвратах истинных, NegatedRequestMatcher вернет ложь. Если RequestMatcher передал в false, то NegatedRequestMatcher вернет значение true.

0

Вы должны использовать аннотацию Order(...) на классах @Configuration. Сделайте свой OAuth2ServerConfig config первым и обслуживая только http.requestMatchers().antMatchers("/api/**") и сделайте свой WebSecurityConfig второй (@Order(2)) без http.requestMatchers(), чтобы обслуживать все остальные URL-адреса!

См. Подробности на https://stackoverflow.com/a/44871933/173149

Смежные вопросы