方法级别的#oauth2安全表达式

我应该怎么做才能在方法级别上使用#oauth2安全表达式,例如下面的示例?

@RequestMapping(value = "email", method = RequestMethod.GET)

@ResponseBody

@PreAuthorize("#oauth2.hasScope('read')")

public String email() {

return "test@email.com";

}

如果我请求该资源,我会收到

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

如果我在ResourceServerConfiguration中指定访问权限,而不是@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')");

}

}

@PreAuthorize(“ permitAll”)或@PreAuthorize(“

denyAll”)之类的标准安全表达式可以按预期工作。因此,可能我必须告诉我的AspectJMethodSecurityInterceptor如何使用OAuth2WebSecurityExpressionHandler。有任何想法吗?

回答:

要启用#oAuth2安全表达式,只需要将默认表达式处理程序设置为OAuth2MethodSecurityExpressionHandler而不是DefaultMethodSecurityExpressionHandler。由于OAuth2MethodSecurityExpressionHandler仍然对其进行了扩展,因此整个先前的功能保持不变。在我的配置中,我同时使用了GlobalMethodSecurityConfiguration和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 {

...

}

以上是 方法级别的#oauth2安全表达式 的全部内容, 来源链接: utcz.com/qa/433560.html

回到顶部