Redirection et custom Auth/enticationHandler

Daniel WELTZ · le 02/08/16 à 17:08

Bonjour,

Mon client souhaite rediriger le client qui se connecte vers une page specifique lors qu'il appartient a un groupe particulier.

pour se faire, j'ai

 - d'une part créer un portailJspCollection custom (avec une porteltJSP pointant sur la page custom )

 - d'autre part créé un AuthenticationHandler custom qui va verifier si l'utiisateur loggé fait parti du groupe devant pointé vers la nouvelle jsp

dont voici le code :

   

@Override
public void login(AuthenticationContext context) throws IOException {
   Group waitingGroup = channel.getGroup(channel.getProperty(SNEAConstantes.ACCOUNT_WAITING_GROUP_ID));
   Channel channel = Channel.getChannel();
   if (context.isLogged()) {
      Member loggedMember = context.getLoggedMember();
      if (loggedMember.belongsToGroup(waitingGroup)) {
         String redirectPage = channel.getProperty("sneaplugin.creation.compte.finalisation.page.url");
         String url = channel.getUrl();
         logger.debug("redirect to \"final account creation\" page " + redirectPage);
         context.sendRedirect(url + redirectPage);
      }
   }
   context.doChain();
}

 

Mon probleme est que la redirection ne se fait pas .

Quelle est la meilleure maniere d'effectuer cette redirection ?

Daniel WELTZ

 

 

Mots-clés Développement
4 pts
Olivier Jaquemet · le 02/08/16 à 17:25

Bonjour,

Un AuthenticationHandler ne sert pas à faire des redirections, il doit être utilisé uniquement pour l'authentification.
En effet que se passera-t-il s'il s'agit d'une authentification dans un contexte de requete REST ? ou pour un accès mobile ?

Si vous souhaitez faire une redirection je vous suggère plutot de vous brancher dans la mécanique de résolution du portail. Par exemple via l'implémentation de la méthode PortalPolicyFilter.getDefaultPortal(PortalInterface jcmsChoice, Member loggedMember)

Bon développement.

1 pt
Daniel WELTZ · le 03/08/16 à 15:37

Bonjour Olivier,

Merci pour ta reponse.

J'ai donc créer un PortalPolicyFilter custom et j'ai surchargé la methoide getDefaultPortal, ais ce la ne semble pas fonctionner.

Y a t il  quelque chose que j'oublie ?

 

Vioici mon code :

@Override
public PortalInterface getDefaultPortal(PortalInterface defaultPortal, Member member) {
   if (Util.notEmpty(member)) {
      Channel channel = Channel.getChannel();
      Group waitingGroup = channel.getGroup(channel.getProperty("sneaplugin.creation.compte.group.attente"));
      String redirectPortalId = Channel.getChannel().getProperty("sneaplugin.creation.compte.finalisation.portal.id");
      PortalInterface redirectPortal = (PortalInterface) Channel.getChannel().getData(redirectPortalId);
      if (member.belongsToGroup(waitingGroup) ) {
         logger.info("The " +member.getLogin()+" account is not finalized " );
         logger.debug("redirect to portal " + redirectPortal);
         return redirectPortal;
      }
   }
   return super.getDefaultPortal(defaultPortal, member);
}

 

Merci de ton aide

Daniel

#1

En fait, je me suis trompé, car getDefaultPortal n'est pas la méthode qu'il faut implémenter dans ce cas là. Regarde plutot du coté checkDisplayContext dans laquelle tu pourras faire un displayContext.setRedirect(...);

Attention à le faire uniquement une fois par session.

Olivier Jaquemet · le 03/08/16 à 15:47
0 pt
Daniel WELTZ · le 03/08/16 à 16:57

Merci Olivier, 

Je vais plutot m'orienter vers l'implementation de la methode checkDisplay(DisplayContext ctx, Publication pub, Member member)  qui me permet d'avoir le membre connecté.

Par contre, quel chaine de caractère attend la methode displayContext.setRedirect(String redirect)  en parametre ?

 

 

 

#1

La méthode DisplayContext.setRedirect peut recevoir en paramètre les même valeurs acceptées par JcmsContext.sendRedirect. A savoir, chemin relatif, ou URL absolue si celle ci est autorisé par les réglages de sécurité
En effet si tu regarde dans display.jsp, tu verras que le redirect du display context est récupéré pour faire un sendRedirect

Olivier Jaquemet · le 04/08/16 à 08:30
0 pt
Daniel WELTZ · le 04/08/16 à 08:41

Bonjour Olivier,

Effectivement, un sendRedirect est effectué, ce qui malheureusement ne marrangait pas.

J'ai donc utilisé le displayCntext.setPortal(...) qui fait exactement ce que je desire.

Merci de ton aide

Daniel

0 pt