Je me demandais s'il existe un moyen d'autoriser de manière incrémentielle avec Spring Security (comme mentionné ici )
Par défaut, Spring Security fournit un accès de base au profil lors de l'utilisation de la vérification OAuth du signe Google. Ce flux est correct. Je voudrais cependant demander des portées supplémentaires (lecture de Gmail, lecture de calendrier, etc.) sur certains points de terminaison d'URL.
J'ai déjà essayé d'utiliser la propriété @PreAuthorize sur le point de terminaison avec l'activation @EnableGlobalMethodSecurity(prePostEnabled = true)
comme dans le code.
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
return new OAuth2MethodSecurityExpressionHandler();
}
}
Classe de configuration de sécurité:
@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();
}
}
J'ai trouvé une solution de contournement. J'ai implémenté un AccessDeniedHandler personnalisé. Recherchez l'exception et l'URL dont elle provient. Si l'URL est celle où une portée plus élevée est requise, je redirige la demande vers l'authentification Google avec des portées supplémentaires ajoutées.
C'est une solution de contournement, la vraie solution est toujours ouverte.
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");
}
}
}
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots