2015-04-22 5 views
5

Was kann ich tun, um # oauth2 Sicherheitsausdrücke auf Methodenebene wie im folgenden Beispiel verwenden zu können?# oauth2 Sicherheitsausdrücke auf Methodenebene

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

    return "[email protected]"; 
    } 

Wenn ich eine Anfrage an die Ressource erhalte ich

[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) 

Das gleiche funktioniert gut, wenn ich den Zugang in meinem ResourceServerConfiguration statt @Controllers' Methoden angeben

@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')"); 
    } 
} 

Standardsicherheitsausdrücke wie @PreAuthorize ("allowAll") oder @PreAuthorize ("denyAll") funktionieren wie erwartet. Also, wahrscheinlich muss ich meinem AspectJMethodSecurityInterceptor irgendwie sagen, dass er OAuth2WebSecurityExpressionHandler benutzen soll. Irgendwelche Ideen?

+0

Hallo @ Marek! Haben Sie eine Lösung für Ihr Problem gefunden? Das gleiche Problem hier ... –

+0

Leider nein, soweit ich mich erinnere, habe ich etwas Zeit damit verbracht, aber die Lösung war zu kompliziert und schließlich nicht wert zu implementieren. Ich benutze @Configuration, um das manuell zu tun :(In meinem Fall ist das nicht so schmerzhaft, aber ich kann mir vorstellen, dass es Fälle gibt, wo es sein könnte. –

+0

ok danke für deine Antwort –

Antwort

6

Um # oAuth2-Sicherheitsausdrücke zu aktivieren, muss nur der standardmäßige Ausdruckshandler als OAuth2MethodSecurityExpressionHandler anstelle von DefaultMethodSecurityExpressionHandler festgelegt werden. Da OAuth2MethodSecurityExpressionHandler es trotzdem erweitert, bleibt die gesamte vorherige Funktionalität gleich. In meiner Konfiguration verwende ich sowohl GlobalMethodSecurityConfiguration als auch 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

Einfach so, es funktioniert hier Vielen Dank! –

+0

Ich habe das gleiche Problem. Versucht dies, aber es hat nicht geholfen. Könnte jemand bitte einige Quellcode teilen? – Benedictus

+1

Was bedeutet es "es hat nicht geholfen"? Haben Sie die @ Konfiguration-Klasse geladen worden und die createExpressionHandler() -Methode jemals aufgerufen wurde? Wenn "yes" ein Debugger einchecken, wenn Ihr AspectJMethodSecurityInterceptor wirklich OAuth2MethodSecurityExpressionHandler verwendet. Wenn nein, erkundigen Sie sich warum. –

Verwandte Themen