2 votes

Utilisation de Spring Security afin d'afficher un contenu différent pour la même URL selon que l'utilisateur est authentifié ou non.

J'utilise Spring MVC, Spring Security et Apache Tiles et je rencontre le problème suivant :

Je veux non authentifié pour atterrir sur le URL d'accueil de mon site web (c'est-à-dire www.mywebsite.com/ ) où un formulaire de connexion leur sera présenté afin qu'ils puissent s'authentifier à partir de là.

Ensuite, une fois qu'un utilisateur est authentifié, je voudrais que un contenu de page complètement différent à afficher pour eux sur l'URL d'accueil du site web (toujours www.mywebsite.com/ ) en utilisant éventuellement un autre modèle/jsp.

Ce que je cherche à réaliser est essentiellement de pouvoir afficher un contenu différent pour la même URL selon que l'utilisateur est authentifié ou non. - tout cela en utilisant Spring security et Spring MVC.

J'ai fait des recherches sur Spring Security mais je n'ai pas trouvé de solution au problème décrit ci-dessus. D'autres ont rencontré des problèmes similaires (voir : Sécurité de Spring : une même page peut fournir un contenu différent en fonction du rôle de l'utilisateur. )

Quelqu'un peut-il me donner des indications ou des conseils sur la manière de mettre en œuvre ce système ?

3voto

kpentchev Points 2087

Une solution à laquelle je peux penser est de vérifier dans votre contrôleur MVC le principal de l'utilisateur à partir de la requête et si authentifié / a un rôle de retourner un ModelAndView, sinon retourner un autre :

@Controller
public class MyController{

    public ModelAndView doSomething(HttpServletRequest request, HttpServletResponse response){
        if(request.getUserPrincipal() != null && request.isUserInRole("someRole"){
            return new ModelAndView("view1");
        } 
        else {
            return new ModelAndView("view2");
        }
    }

}

2voto

balteo Points 2283

Un membre du forum Spring m'a donné une solution agréable et élégante. La voici :

@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String authenticatedHomePage() {
    return "authenticatedHomePage";
}

@RequestMapping("/")
public String homePage() {
    return "homePage";
}

C'est assez agréable car il s'appuie sur Spring Security. Voir ici ( article de blog )

1voto

Rob Blake Points 2767

Je peux penser à plusieurs façons d'obtenir ce que vous voulez.

Tout d'abord, vous pouvez utiliser le taglib de Spring Security pour rendre conditionnellement le contenu de votre modèle de vue selon que l'utilisateur est correctement authentifié ou non. Plus d'informations sur le taglib Spring Security sont aquí . Grossièrement, votre modèle de vue ressemblerait à quelque chose comme ça :

if(user is authenticated)
     render content for authenticated user
else
     render log-in form

Cela semble toutefois un peu brutal, car votre contrôleur créerait toujours le modèle, que l'utilisateur soit correctement authentifié ou non. Vous auriez également besoin de cette logique dans vos modèles de vue chaque fois que vous voudriez afficher un formulaire de connexion.

Une approche distincte consisterait à créer un HandlerInterceptor qui transmet toutes les demandes au contrôleur chargé de rendre la page de connexion, jusqu'à ce que l'utilisateur se soit pleinement authentifié. Pour ce faire, vous pouvez utiliser la méthode preHandle() de votre HandlerInterceptor :

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandlerInterceptor implements HandlerInterceptor
{

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
    SecurityContext sc = SecurityContextHolder.getContext();
    boolean userAuthenticated = true;
    /* Some logic in here to determine if the user is correctly authenticated */

    if(!userAuthenticated)
    {
        request.getRequestDispatcher("/login").forward(request, response);
        return false;
    }

    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{

}}

Vous pouvez ensuite configurer Spring MVC de manière à mapper l'implémentation de votre HandlerInterceptor sur les URL pour lesquelles vous avez besoin de cette fonctionnalité. Cela vous évite d'avoir à dupliquer la logique dans tous les contrôleurs et est facilement testable.

0voto

Josef Procházka Points 895

Vous pouvez essayer d'utiliser

<security:authorize access=”isAnonymous()”>
not authenticated page
</security:authorize>
<security:authorize access=”isAuthenticated()”>
authenticated page
</security:authorize>

ou vous pouvez retourner "redirect : page_for_not_auth" dans votre contrôleur comme nom de vue pour rediriger la réponse vers un autre contrôleur/méthode qui gère les demandes non authentifiées.

0voto

gxet4n Points 81

Vous devriez faire quelque chose comme ceci :

@RequestMapping("/")
public String generalHomePage() {
    ...
}

@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String secureHomePage() {
    ...
}

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