Инкрементная авторизация для Google OAuth2 Войдите в Spring Security - PullRequest
0 голосов
/ 19 июня 2019

Мне было интересно, есть ли способ поэтапной авторизации с помощью Spring Security (как уже упоминалось здесь )

По умолчанию Spring Security обеспечивает базовый доступ к профилю при использовании проверки Google OAuth. Этот поток правильный. Однако я хотел бы запросить дополнительные области (чтение Gmail, чтение календаря и т. Д.) На определенных конечных точках URL.

Я уже пытался использовать свойство @PreAuthorize на конечной точке вместе с включением @EnableGlobalMethodSecurity(prePostEnabled = true), как в коде.

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

    @Override

protected MethodSecurityExpressionHandler createExpressionHandler() {
    return new OAuth2MethodSecurityExpressionHandler();
}

}

Класс конфигурации безопасности:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests()
            .antMatchers("/", "/error", "/privacy", "/css/**", "/images/**", "/js/**", "/fonts/**")
            .permitAll().anyRequest().authenticated().and().oauth2Login().and().logout().logoutSuccessUrl("/");
    http.csrf().disable();
    http.headers().frameOptions().disable();

   }
}

1 Ответ

0 голосов
/ 21 июня 2019

Я нашел обходной путь.Я реализовал пользовательский AccessDeniedHandler.Проверьте исключение и URL-адрес, с которого оно поступило.Если для URL-адреса требуется более высокая область, я перенаправляю запрос на аутентификацию Google с добавлением дополнительных областей.

Это обходной путь, реальное решение по-прежнему открыто.

public class CustomAccessDeniedHandler implements AccessDeniedHandler {

@Value("${spring.security.oauth2.client.registration.google.client-id}")
private String clientId;

@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
        AccessDeniedException accessDeniedException) throws IOException, ServletException {
    if (accessDeniedException.getMessage().equalsIgnoreCase("Insufficient scope for this resource")) {
        response.sendRedirect("https://accounts.google.com/o/oauth2/v2/auth?client_id=" + clientId
                        + "&response_type=code&scope=https://www.googleapis.com/auth/gmail.readonly&redirect_uri="
                        + request.getServerName() + "/xyz");
    }
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...