IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

GlassFish + Shiro


Sujet :

Java EE

  1. #1
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut GlassFish + Shiro
    Bonjour,

    Je suis en train de tester la sécurité et gestion des permissions avec shiro.
    Je me suis basé sur l’excellent article de BalusC : apache shiro is it ready for java ee 6

    La partie qui m’intéresse et que je n'arrive pas mettre en place est "Declarative restriction in bean methods".

    J'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Inherited
    @InterceptorBinding
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Secured {
        //
    }
    L'intercepteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    @Interceptor
    @Secured
    public class ShiroSecuredInterceptor implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @AroundInvoke
        public Object interceptShiroSecurity(InvocationContext context) throws Exception {
            Subject subject = SecurityUtils.getSubject();
            Class<?> c = context.getTarget().getClass();
            Method m = context.getMethod();
     
            if (!subject.isAuthenticated() && hasAnnotation(c, m, RequiresAuthentication.class)) {
                throw new UnauthenticatedException("Authentication required");
            }
     
            if (subject.getPrincipal() != null && hasAnnotation(c, m, RequiresGuest.class)) {
                throw new UnauthenticatedException("Guest required");
            }
     
            if (subject.getPrincipal() == null && hasAnnotation(c, m, RequiresUser.class)) {
                throw new UnauthenticatedException("User required");
            }
     
            RequiresRoles roles = getAnnotation(c, m, RequiresRoles.class);
     
            if (roles != null) {
                subject.checkRoles(Arrays.asList(roles.value()));
            }
     
            RequiresPermissions permissions = getAnnotation(c, m, RequiresPermissions.class);
     
            if (permissions != null) {
                 subject.checkPermissions(permissions.value());
            }
     
            return context.proceed();
        }
     
        private static boolean hasAnnotation(Class<?> c, Method m, Class<? extends Annotation> a) {
            return m.isAnnotationPresent(a)
                || c.isAnnotationPresent(a)
                || c.getSuperclass().isAnnotationPresent(a);
        }
     
        private static <A extends Annotation> A getAnnotation(Class<?> c, Method m, Class<A> a) {
            return m.isAnnotationPresent(a) ? m.getAnnotation(a)
                : c.isAnnotationPresent(a) ? c.getAnnotation(a)
                : c.getSuperclass().getAnnotation(a);
        }
     
    }
    Mon bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    @ManagedBean(name = "myctrl")
    @RequestScoped
    @Secured
    public class MyController {
    	private static ArrayList<Value> myLst = new ArrayList<>();
    	static {
    		for (int i = 0; i < 2; i++) {
    			myLst.add(new Value(i));
    		}
    	}
     
     
    	@RequiresPermissions("test:list")
    	public List<Value> getMyLst() {
    		Random rand = new Random();
    		int num = rand.nextInt(1000);
    		myLst.add(new Value(num));
    		return myLst;
    	}
     
    	@RequiresPermissions("test:setlist")
    	public void setMyLst(ArrayList<Value> lst) {
    		myLst = lst;
    	}
     
    	@RequiresRoles("admin")
    	public String launchPush() {
    		PushContext pushContext = PushContextFactory.getDefault()
    				.getPushContext();
    		pushContext.push("/majStr", "update");
    		return null;
    	}
     
    	@RequiresPermissions("adm:action")
    	public String actionAdm() {
    		return "mon action d'administtration";
    	}
    }
    Mon bean.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd"
    >
        <interceptors>
            <class>com.test.interceptor.ShiroSecuredInterceptor</class>
        </interceptors>
    </beans>
    J'ai essayé et le filtrage ne marche pas !
    J'ai du raté quelque chose, mais je ne vois pas quoi ?

    Quelqu'un aurait il une idée de ce qui ne va pas ?

    Merci d'avance !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    visiblement l'interceptor n'est pas chargé, mais je ne sais pas pourquoi !

    personne n'a essayé d'utiliser shiro via les annotations ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 48
    Dernier message: 05/04/2014, 22h53
  2. Pb ejb3 sous glassfish et pas sous Jboss
    Par Frostizz dans le forum Glassfish et Payara
    Réponses: 5
    Dernier message: 21/02/2007, 16h01
  3. différence glassfish et sun AS
    Par david06600 dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 21/02/2007, 09h06
  4. jar du client web pour glassfish ?
    Par Tail dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 20/02/2007, 22h28
  5. Réponses: 2
    Dernier message: 01/05/2006, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo