2015-04-22 13 views
5

Cosa devo fare per poter utilizzare le espressioni di sicurezza # oauth2 a livello di metodo come nell'esempio seguente?# oauth2 espressioni di sicurezza a livello di metodo

@RequestMapping(value = "email", method = RequestMethod.GET) 
    @ResponseBody 
    @PreAuthorize("#oauth2.hasScope('read')") 
    public String email() { 

    return "[email protected]"; 
    } 

Se faccio una richiesta in tal risorsa ricevo

[INFO] java.lang.IllegalArgumentException: Failed to evaluate expression '#oauth2.hasScope('read')' 
[INFO] at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:14) 
[INFO] at org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice.before(ExpressionBasedPreInvocationAdvice.java:44) 
[INFO] at org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter.vote(PreInvocationAuthorizationAdviceVoter.java:57) 
[INFO] at org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter.vote(PreInvocationAuthorizationAdviceVoter.java:25) 
[INFO] at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:62) 
[INFO] at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:232) 
[INFO] at org.springframework.security.access.intercept.aspectj.AspectJMethodSecurityInterceptor.invoke(AspectJMethodSecurityInterceptor.java:43) 
[INFO] at org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect.ajc$around$org_springframework_security_access_intercept_aspectj_aspect_AnnotationSecurityAspect$1$c4d57a2b(AnnotationSecurityAspect.aj:63) 
[INFO] at pl.insert.controllers.ResourceController.email(ResourceController.java:22) 

La stessa cosa funziona bene se a specificare l'accesso nel mio ResourceServerConfiguration invece di metodi @Controllers'

@Configuration 
@EnableResourceServer 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
    http.requestMatchers().antMatchers("/oauth/resources/**"); 
    http.authorizeRequests().anyRequest().access("#oauth2.hasScope('read')"); 
    } 
} 

Le espressioni di sicurezza standard come @PreAuthorize ("permitAll") o @PreAuthorize ("denyAll") funzionano come previsto. Quindi, probabilmente devo dire in qualche modo al mio AspectJMethodSecurityInterceptor di usare OAuth2WebSecurityExpressionHandler. Qualche idea?

+0

Ciao @Marek! Hai trovato una soluzione al tuo problema? Stesso problema qui ... –

+0

Purtroppo no, per quanto mi ricordo ho passato un po 'di tempo con questo, ma la soluzione era troppo complicata e, infine, non vale la pena di implementarla. Io uso @Configuration per farlo manualmente :(Nel mio caso questo non è così doloroso, ma posso immaginare che ci siano casi in cui potrebbe essere. –

+0

ok grazie per la risposta –

risposta

6

Per abilitare le espressioni di sicurezza # oAuth2 è necessario impostare il gestore di espressioni predefinito come OAuth2MethodSecurityExpressionHandler anziché DefaultMethodSecurityExpressionHandler. Poiché OAuth2MethodSecurityExpressionHandler lo estende comunque, l'intera funzionalità precedente rimane la stessa. Nella mia configurazione utilizzo sia GlobalMethodSecurityConfiguration sia WebSecurityConfigurerAdapter.

@Configuration 
@EnableGlobalMethodSecurity 
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { 

    @Override 
    protected MethodSecurityExpressionHandler createExpressionHandler() { 
    return new OAuth2MethodSecurityExpressionHandler(); 
    } 
} 

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    ... 
} 


@Configuration 
@Import({ SecurityConfiguration.class, MethodSecurityConfiguration.class }) 
public class AppConfiguration { 
    ... 
} 
+0

Semplice come quello, funziona qui Molte grazie! –

+0

Ho lo stesso problema. Ho provato questo, ma non ha aiutato. Qualcuno potrebbe condividere qualche codice sorgente? – Benedictus

+1

Che cosa significa "non ha aiutato"? Avere la classe @Configuration stata caricata e il metodo createExpressionHandler() è stato mai chiamato? Se "sì", verifica in un debugger se AspectJMethodSecurityInterceptor utilizza realmente OAuth2MethodSecurityExpressionHandler. Se "no" verifica perché. –