44 votes

Comment passer un paramètre supplémentaire avec la page de connexion de sécurité Spring

J'essaie de définir le nom de la base de données comme paramètre d'entrée de la demande à partir de la page de connexion de sécurité Spring. À l'heure actuelle, je ne reçois que le nom d'utilisateur qui a été récupéré à l'aide de la sécurité Spring SecurityContextHolder.getContext().getAuthentication() .

Comment accéder au champ supplémentaire qui a été défini sur la page de connexion ?

23voto

Kamill Sokol Points 5503

sourcedelica a mentionné l'utilisation de AuthenticationDetailsSource et d'un AuthenticationDetails . Voici un exemple.

Ajoutez l' authentication-details-source-ref avec l'identifiant du bean customWebAuthenticationDetailsSource à form-login :

 <security:http>
    <security:intercept-url pattern="/**" access="..." />
    <security:form-login authentication-details-source-ref="customWebAuthenticationDetailsSource" login-page="..." />
    <security:logout logout-success-url="..." />
</security:http>

Créer une nouvelle classe CustomWebAuthenticationDetailsSource :

 package security;

import org.springframework.security.authentication.AuthenticationDetailsSource;
import org.springframework.security.web.authentication.WebAuthenticationDetails;

import javax.servlet.http.HttpServletRequest;

public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
    @Override
    public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
        return new CustomWebAuthenticationDetails(context);
    }
}

et les CustomWebAuthenticationDetails associés :

 package security;

import org.springframework.security.web.authentication.WebAuthenticationDetails;
import javax.servlet.http.HttpServletRequest;

public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {

    private final String yourParameter;

    public CustomWebAuthenticationDetails(HttpServletRequest request) {
        super(request);
        yourParameter = request.getParameter("yourParameter");
    }

    public String getyourParameter() {
        return yourParameter;
    }

    //TODO override hashCode, equals and toString to include yourParameter
    @Override
    public int hashCode() { /* collapsed */ }
    @Override
    public boolean equals(Object obj) { /* collapsed */ }
    @Override
    public String toString() { /* collapsed */ }
}

9voto

GMsoF Points 944

Il existe un moyen plus simple si vous utilisez AuthenticationProvider . Vous pouvez simplement injecter HttpServletRequest et récupérer votre paramètre supplémentaire :

 @Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired(required = false)
    private HttpServletRequest request;

    @Autowired
    private MyAccountService myAccountService;

    @Override
    public Authentication authenticate(Authentication authentication) {

        System.out.println("request testing= " + request.getParameter("testing"));

        .....
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X