web-dev-qa-db-fra.com

Comment définir la redirection après une connexion réussie?

J'utilise Spring Boot avec la dépendance Spring-Boot-Starter-Security.

J'ai une application qui se connectera avec succès compte tenu des informations d'identification appropriées. Cependant, chaque fois que je me connecte, je ne suis redirigé nulle part. Comment puis-je configurer cela?

Voici le formulaire:

 <form th:action="@{/login}" method="post">
        <div><label> User Name : <input type="text" name="username"/> </label></div>
        <div><label> Password: <input type="password" name="password"/> </label></div>
        <div><input type="submit" value="Sign In"/></div>
 </form>

J'ai essayé de changer la balise th: action ci-dessus mais je n'ai pas pu aller n'importe où avec.

La méthode MvcConfig est ci-dessous:

public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/login").setViewName("login");
    registry.addViewController("/").setViewName("login");
}
10
Albert

La définition de la redirection après une connexion réussie doit être appliquée à Spring Security, et non à Spring MVC.

Le th:action définit le point de terminaison Spring Security qui traitera la demande d'authentification. Il ne définit pas l'URL de redirection. Prêt à l'emploi, Spring Boot Security vous fournira le /login point final. Par défaut, Spring Security redirige après la connexion à la ressource sécurisée à laquelle vous avez essayé d'accéder. Si vous souhaitez toujours rediriger vers une URL spécifique, vous pouvez forcer cela via l'objet de configuration HttpSecurity.

En supposant que vous utilisez une version récente de Spring Boot, vous devriez pouvoir utiliser JavaConfig.

Voici un exemple simple:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // the boolean flags force the redirection even though 
        // the user requested a specific secured resource.
        http.formLogin().defaultSuccessUrl("/success.html", true);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }
}

Veuillez noter que vous devez définir un point de terminaison approprié pour diffuser du contenu pour le /success.html URL. Une ressource statique disponible par défaut dans src/main/resources/public/ ferait l'affaire à des fins de test. Personnellement, je préfère définir une URL sécurisée servie par un contrôleur Spring MVC servant du contenu avec Thymeleaf. Vous ne voulez pas qu'un utilisateur anonyme puisse accéder à la page de réussite. Thymeleaf en tant que fonctionnalités utiles pour interagir avec Spring Security lors du rendu du contenu HTML.

Cordialement, Daniel

37
Daniel Lavoie

Ça marche pour moi. Une fois la connexion réussie, Spring security redirige vers "/" puis, je vérifie si l'utilisateur est authentifié et dans ce cas, le redirige vers ma page de tableau de bord.

@RequestMapping("/")
    public String index(Model model) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (!(auth instanceof AnonymousAuthenticationToken))
            return "dashboard";

        // if it is not authenticated, then go to the index...
        // other things ...
        return "index";
    }
0
Ivan Sanchez

Vous pouvez également définir dynamiquement la redirection après la connexion. Cela s'avère être simple et fou.

Supposons que vous ayez un contrôleur qui a des conditions compliquées où vous devez vous assurer que l'utilisateur est correctement connecté.

En définissant une valeur dans le cache "demande" sur la demande/réponse actuelle, puis en effectuant une redirection, la sécurité Spring transmet à la demande mise en cache une fois la connexion réussie.

    RequestCache requestCache = new HttpSessionRequestCache();
    requestCache.saveRequest(request,response);
    return "redirect:/login";

Non, cela ne semble être documenté nulle part. La seule référence que j'ai trouvée était la suivante:

SavedRequests et l'interface RequestCache Une autre responsabilité des responsabilités ExceptionTranslationFilter consiste à enregistrer la demande en cours avant d'appeler AuthenticationEntryPoint. Cela permet à la demande d'être restaurée après que l'utilisateur s'est authentifié (voir l'aperçu précédent de l'authentification Web). Un exemple typique serait où l'utilisateur se connecte avec un formulaire, puis est redirigé vers l'URL d'origine par le SavedRequestAwareAuthenticationSuccessHandler par défaut (voir ci-dessous).

RequestCache encapsule les fonctionnalités requises pour le stockage et la récupération des instances HttpServletRequest. Par défaut, HttpSessionRequestCache est utilisé, qui stocke la demande dans HttpSession. Le RequestCacheFilter a pour tâche de restaurer réellement la demande enregistrée à partir du cache lorsque l'utilisateur est redirigé vers l'URL d'origine.

0
sdw