У меня есть приложение Spring - нет приложение Spring Boot - что я пытаюсь объявить раздел API как OAuth2, защищенный с помощью Spring Security. Моя конфигурация авторизации и общего доступа к ресурсам отлично работает, когда я определяю элементы http
в XML, но когда я пытаюсь реализовать блоки доступа к ресурсам с использованием ResourceServerConfigureAdapter#configure(HttpSecurity)
- в комплекте с @EnableResourceServer
и т. Д., Метод configure
никогда не срабатывает (тесты конца теста также не работают). Пример Java config ниже:Spring Security OAuth Java Config
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("oauth2/control");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests().anyRequest().hasRole("OAUTH_USER").and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// before=PRE_AUTH_FILTER
.addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class)
.csrf().disable()
.anonymous().disable()
.exceptionHandling()
.accessDeniedHandler(oAuth2AccessDeniedHandler)
.authenticationEntryPoint(loginUrlAuthenticationEntryPoint);
}
Я попытался объявить несколько разных способов настройки конфигурации, но не кубик. А именно, я пробовал как верхний уровень @Configuration
классы, распространяющиеся ResourceServerConfigurerAdapter
, так и методы бобов, возвращающиеся ResourceServerConfiguration
, как в Dave Syer's example; Я также попытался явно установить порядок на Ordered.HIGHEST_PRECEDENCE
на соответствующие компоненты.
Возможно, важно отметить, что большая часть устаревшей конфигурации безопасности приложения определяется с помощью XML-элементов, подобных приведенным выше. Другой возможный красный флаг о моей конфигурации - чтобы получить конечную точку маркера для аутентификации против базового auth client_id: client_secret мне пришлось подключить свой собственный BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService)))))
, когда, поскольку это ванильный и «правильный» способ аутентификации конечной точки маркера, d ожидать, что Spring config будет просто по умолчанию.
В любом случае, я ни в коем случае не могу получить ResourceServerConfigureAdapter#configure(HttpSecurity)
. Мой Going теория:
Коего-что о предыдущих блоках XML HTTP препятствует моему
configure
метода из когда-либо даже называютЭто просто только Spring Загрузочной особенности - хотя я видел ни один язык к тому эффекту
Там нет прямо какой-то объект в контексте приложения, что я пропускаю (опять же, оперативные аннотаций, что у меня есть на работе - кроме очевидного
@Configuration
и@Bean
- являются@EnableWebSecurity
,@EnableAuthenticationServer
и@EnableResourceServer
).Я совершил некоторую ошибку конфигурации (duh).
Любые примеры были бы оценены
Пример OAuth2 класс конфигурации (один из нескольких различных итераций) ниже:
@Configuration
@EnableWebSecurity
@EnableResourceServer
public class OAuth2Configuration {
... etc ...
@Bean
public ResourceServerConfiguration adminResources() {
// copped from https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/multi
ResourceServerConfiguration resource = new ResourceServerConfiguration() {
public void setConfigurers(List<ResourceServerConfigurer> configurers) {
super.setConfigurers(configurers);
}
};
resource.setConfigurers(Collections.singletonList(new ResourceServerConfigurerAdapter() {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("oauth2/control");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests().anyRequest().hasRole("OAUTH_USER").and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// before=PRE_AUTH_FILTER
.addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class)
.csrf().disable()
.anonymous().disable()
.exceptionHandling()
.accessDeniedHandler(oAuth2AccessDeniedHandler)
.authenticationEntryPoint(loginUrlAuthenticationEntryPoint);
}
}));
resource.setOrder(Ordered.HIGHEST_PRECEDENCE);
return resource;
}
@Configuration
@EnableAuthorizationServer
public static class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
... etc ...
}
}
Analogogous <http>
конфигурации, что является подобрал:
<sec:http pattern="/api/**" create-session="stateless"
entry-point-ref="loginUrlAuthenticationEntryPoint">
<sec:anonymous enabled="false" />
<sec:csrf disabled="true"/> <!-- csrf tokens don't make sense for a 3rd party API -->
<sec:custom-filter ref="oauth2ProcessingFilter" before="PRE_AUTH_FILTER"/>
<sec:access-denied-handler ref="oauthAccessDeniedHandler" />
<sec:intercept-url pattern="/api/**" access="hasRole('OAUTH_USER')" />
</sec:http>
Если угадали. Спасибо @Sofia! – jwilner