What should I do to use # oauth2 security expressions at the method level, for example, in the example below?
@RequestMapping(value = "email", method = RequestMethod.GET) @ResponseBody @PreAuthorize("#oauth2.hasScope('read')") public String email() { return " test@email.com "; }
If I make a request for this resource, I get
[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)
The same works well if I specify access in my ResourceServerConfiguration instead of @Controllers methods
@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')"); } }
Standard security expressions such as @PreAuthorize ("allowAll") or @PreAuthorize ("denyAll") work as expected. So probably I need to somehow tell my AspectJMethodSecurityInterceptor to use the OAuth2WebSecurityExpressionHandler. Any ideas?
source share