2010-04-08 6 views
2

Est-il possible d'utiliser une autorisation basée sur les composants basée sur les métadonnées?Est-il possible d'utiliser une autorisation basée sur les composants basée sur les métadonnées avec Wicket?

Wicket en action donne, à titre d'exemple:

@AdminOnly 
private class ModeLink extends Link {.....} 

mettre en œuvre ensuite isActionAuthorized() de la stratégie d'autorisation.

Mais je pense que ce n'est pas une bonne solution de créer de nouvelles classes pour chaque rôle.

Existe-t-il un moyen axé sur les métadonnées? Puis-je ajouter des métadonnées à un composant, puis vérifier en fonction de cela dans la méthode isActionAuthorized() de la stratégie d'autorisation?

Répondre

0

Je crois avoir fourni une solution basée sur les métadonnées ici: Wicket Authorization Using MetaDataKey en réponse à votre question. En ce qui concerne les annotations, vous pouvez utiliser une seule annotation, par exemple @RequiresRole, paramétrée avec le rôle id: @RequiresRole ("admin") par exemple.

0

Vous pouvez utiliser les constantes de chaîne pour tous vos rôles et faire:

@Require(MySession.ADMIN_ROLE) 
public class AdminPanel extends Panel { 
    // snip 
} 

public boolean isActionAuthorized(Component c, Action a) { 
    // I usually disallow instantiation of pages and rendering of components 
    if (c instanceof Page || a == Component.RENDER) { 
    Require r = c.getClass().getAnnotation(Require.class); 
    if (r != null && !Strings.isEmpty(r.value()) { 
     Roles roles = ((AuthenticatedWebSession)Session.get()).getRoles(); 
     return roles != null && roles.hasRole(a.value()); 
    } 
    } 
    return true; 
} 

au lieu de chaînes, vous pouvez également utiliser un ENUM pour désavouer des chaînes aléatoires. Utilisez simplement a.value().name() dans ce cas pour vérifier le rôle.

Questions connexes