Dans mon application Java Spring, j'ai implémenté l'autorisation utilisateur OAuth2 via un fournisseur OAuth2 externe.
Sur mon hôte local, afin d'authentifier l'utilisateur via ce fournisseur OAuth2 externe, je dois passer par l'url suivante: https://127.0.0.1:8443/login/ok et juste après la danse OAuth2, je peux faire authentifier cet utilisateur. Jusqu'à présent, tout va bien.
Mais quand j'ai des paramètres de requête dans mon URL de connexion, par exemple uid et level:
https://127.0.0.1:8443/login/ok?uid=45134132&level=3
après la danse OAuth2, je suis redirigé vers https://127.0.0.1:8443/ et je perds ces paramètres.
Dans mon panneau de réseau Chrome, je peux voir l'ensemble d'appels suivant:
Je perds donc ces paramètres après l'étape 3.
Est-il possible de configurer Spring Security + OAuth2 pour transmettre ces paramètres à l'étape 4 également?
Ceci est ma configuration (c'est une solution basée sur cette réponse Spring Security - Conserver les paramètres d'URL lors de la redirection vers la connexion ) mais cela ne fonctionne pas ( AuthenticationProcessingFilterEntryPoint .commence method
n'est pas appelé):
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.headers().frameOptions().disable()
.and().logout()
.and().antMatcher("/**").authorizeRequests()
.antMatchers("/", "/login**", "/index.html", "/home.html").permitAll()
.anyRequest().authenticated()
.and().exceptionHandling().authenticationEntryPoint(new AuthenticationProcessingFilterEntryPoint("/"))
.and().logout().logoutSuccessUrl("/").permitAll()
.and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
// @formatter:on
}
public class AuthenticationProcessingFilterEntryPoint extends LoginUrlAuthenticationEntryPoint {
public AuthenticationProcessingFilterEntryPoint(String loginFormUrl) {
super(loginFormUrl);
}
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
redirectStrategy.sendRedirect(request, response, getLoginFormUrl() + "?" + request.getQueryString());
}
}
Qu'est-ce qui ne va pas?
J'ai implémenté cela de la manière suivante:
private Filter ssoFilter(ClientResources client, String path) {
OAuth2ClientAuthenticationProcessingFilter clientFilter = new OAuth2ClientAuthenticationProcessingFilter(path);
.......
clientFilter.setAuthenticationSuccessHandler(new UrlParameterAuthenticationHandler());
return clientFilter;
}
public class UrlParameterAuthenticationHandler extends SimpleUrlAuthenticationSuccessHandler {
@Override
protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
String targetUrl = determineTargetUrl(request, response);
if (response.isCommitted()) {
logger.debug("Response has already been committed. Unable to redirect to " + targetUrl);
return;
}
String queryString = HttpUtils.removeParams(request.getQueryString(), "state", "code");
targetUrl = !StringUtils.isEmpty(queryString) ? targetUrl + "?" + queryString : targetUrl;
getRedirectStrategy().sendRedirect(request, response, targetUrl);
}
}
Veuillez me corriger s'il y a une meilleure approche
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