web-dev-qa-db-fra.com

Impossible de valider le rôle dans Spring Security pour le modèle d'URL

J'utilise la sécurité Spring 3.1.7.RELEASE avec Spring 3.2.13.RELEASE.

J'ai une entrée dans mon spring-security.xml comme suit:

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern=".*admin.htm" access="hasRole(ROLE_ADMIN)" />
    <intercept-url pattern="/siteadmin/*.htm" access="ROLE_ADMIN" />
    <intercept-url pattern="/siteadmin/cleancache.htm" access="hasRole('ROLE_ADMIN')" />

Lorsque j'essaie d'appuyer sur url /siteadmin/cleancache.htm, j'obtiens l'exception suivante:

Java.lang.IllegalArgumentException: Échec de l'évaluation de l'expression 'ROLE_ADMIN' org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean (ExpressionUtils.Java:13) org.springframework.security.web.access.expression.WebExpressionVoterExpressionVoterExpression .Java: 34) org.springframework.security.web.access.expression.WebExpressionVoter.vote (WebExpressionVoter.Java:18) org.springframework.security.access.vote.AffirmativeBased.decide (AffirmativeBased.Java:62)

Cause première:

org.springframework.expression.spel.SpelEvaluationException: EL1008E: (pos 0): la propriété ou le champ 'ROLE_ADMIN' est introuvable sur l'objet de type 'org.springframework.security.web.access.expression.WebSecurityExpressionRoot' - peut-être pas public? org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty (PropertyOrFieldReference.Java:214) org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal (PropertyOrFieldReference. PropertyOrFieldReference.getValueInternal (PropertyOrFieldReference.Java:78) org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue (SpelNodeImpl.Java:102) org.springframework.expression.spel.standard.SVelExpress org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean (ExpressionUtils.Java:11) org.springframework.security.web.access.expression.WebExpressionVoter.vote (WebExpressionVoter.Java:34)

Tous les pointeurs sur ceux-ci sont très appréciés.

23
tarunkumar

Vous avez quelques fautes de frappe. La première ligne d'interception-url manque des guillemets simples autour de ROLE_ADMIN et la deuxième ligne est manquante de hasRole. Ça devrait être

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern=".*admin.htm" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/siteadmin/*.htm" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/siteadmin/cleancache.htm" access="hasRole('ROLE_ADMIN')" />
43
thedoctor

ce qui se passe, c'est que la documentation officielle de security spring apporte les exemples que vous avez placés:

<Intercept-url pattern = "/ siteadmin / *. Htm" access = "ROLE_ADMIN" />

mais tu devrais mettre

<Intercept-url pattern = ". * Admin.htm" access = "hasRole ('ROLE_ADMIN')" />
6
Rubens