Spring Security OAuth2 и FormLogin в одном приложении

В моем приложении Spring Boot у меня есть RESTful API и веб-панель управления MVC для администрирования.

Возможно ли иметь оба - аутентификацию / авторизацию Spring Security OAuth2 (на основе токенов, без сохранения состояния) для RESTful API и FormLogin (с отслеживанием состояния) для веб-панели Spring MVC в одном приложении?

Как правильно настроить его с помощью Spring Boot?


person alexanoid    schedule 22.08.2015    source источник
comment
В одном приложении может быть несколько конфигураций Spring Security.   -  person manish    schedule 22.08.2015
comment
Удалось ли вам это решить? Спасибо.   -  person Bogdan Timofeev    schedule 12.07.2016


Ответы (1)


Вам необходимо настроить веб-безопасность для входа на основе формы и безопасности сервера ресурсов формы REST Endpoints.

Вот рабочая конфигурация, в которой используется единый вход с отдельно развернутым сервером авторизации.

@Configuration
@EnableOAuth2Sso
@EnableWebSecurity
protected static class ResourceConfiguration extends WebSecurityConfigurerAdapter {

    @Value("${sso.url}")
    private String ssoUrl;

    @Autowired
    private  RedisConnectionFactory redisConnectionFactory;

    @Bean
    protected TokenStore tokenStore() {
        return new RedisTokenStore(redisConnectionFactory);
    }

    @Bean
    @Primary
    protected ResourceServerTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setSupportRefreshToken(true);

        return defaultTokenServices;
    }


    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        OAuth2AuthenticationManager authenticationManager = new OAuth2AuthenticationManager();
        authenticationManager.setTokenServices(tokenServices());
        return authenticationManager;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {      
        http.requestMatchers()
        .and().authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers(HttpMethod.GET, "/static/**").permitAll()
            .antMatchers(HttpMethod.GET, "/profile/**").permitAll()
            .antMatchers(HttpMethod.GET, "/services/**").permitAll()
            .anyRequest().authenticated()
        .and().logout()
                .invalidateHttpSession(true)
                .logoutSuccessUrl(ssoUrl+"/logout")
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .deleteCookies("JSESSIONID").invalidateHttpSession(true)
                .permitAll();
    }

}

@Configuration
@EnableResourceServer
@Order(1)
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter {



    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("resource-id");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(new OAuthRequestedMatcher())
            .authorizeRequests().anyRequest().fullyAuthenticated();

    }
}

private static class OAuthRequestedMatcher implements RequestMatcher {
    public boolean matches(HttpServletRequest request) {
        String auth = request.getHeader("Authorization");
        boolean haveOauth2Token = (auth != null) && auth.startsWith("Bearer");
        boolean haveAccessToken = request.getParameter("access_token")!=null;
        return haveOauth2Token || haveAccessToken;
    }
}
person ejazazeem    schedule 25.07.2018
comment
ваше клиентское приложение было сделано на тимелеафе? Просто странно иметь URL-адрес выхода на сервере ресурсов - person robert trudel; 03.06.2019
comment
@rebert trudel, нет, думаю, это не так. Конфигурация безопасности Resource Server имеет только такую ​​настройку: @Override public void configure (HttpSecurity http) throws Exception {http.requestMatcher (new OAuthRequestedMatcher ()) .authorizeRequests (). AnyRequest (). FullAuthenticated (); } `` - person ejazazeem; 08.06.2019