Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用基于作用域的@PreAuthorize保护spring安全oauth资源?_Java_Spring_Spring Security Oauth2 - Fatal编程技术网

Java 如何使用基于作用域的@PreAuthorize保护spring安全oauth资源?

Java 如何使用基于作用域的@PreAuthorize保护spring安全oauth资源?,java,spring,spring-security-oauth2,Java,Spring,Spring Security Oauth2,我成功地配置了spring-security-oauth2,以便外部应用程序可以通过我的应用程序进行身份验证。但是,基于外部应用程序和用户允许的内容,客户端只能访问my API的一个子集。可用子集由OAuth作用域确定 在经典的Spring应用程序中,我可以使用@PreAuthorize根据角色强制执行边界: @控制器 公共类MyController{ @预授权(“hasRole('admin')”) @请求映射(“…”) 公共字符串doStuff(){ // ... } } 当使用OAuth

我成功地配置了spring-security-oauth2,以便外部应用程序可以通过我的应用程序进行身份验证。但是,基于外部应用程序和用户允许的内容,客户端只能访问my API的一个子集。可用子集由OAuth作用域确定

在经典的Spring应用程序中,我可以使用@PreAuthorize根据角色强制执行边界:

@控制器
公共类MyController{
@预授权(“hasRole('admin')”)
@请求映射(“…”)
公共字符串doStuff(){
// ...
}
}

当使用OAuth和作用域而不是角色时,我如何做到这一点?

Spring OAuth附带了
OAuth2MethodSecurityExpressionHandler
,该类增加了使用@PreAuthorize表达式进行此类检查的能力。您需要做的就是注册这个类,例如,如果您使用的是Javaconfig:

@配置
@EnableGlobalMethodSecurity(Prespenabled=true)
公共静态类方法SecurityConfig扩展了GlobalMethodSecurityConfiguration{
@凌驾
受保护的MethodSecurityExpressionHandler createExpressionHandler(){
返回新的OAuth2MethodSecurityExpressionHandler();
}
}
现在,您可以简单地使用:

@PreAuthorize(#oauth2.hasScope('requiredScope'))
以保护您的请求方法。要查看除了
hasScope
之外还有哪些方法可用,请检查类
OAuth2SecurityExpressionMethods

缺点是,
OAuth2MethodSecurityExpressionHandler
扩展了
DefaultMethodSecurityExpressionHandler
,因此不能将其与其他也扩展该类的类组合


你也可以这样做。

我使用的是Spring Boot 1.5.10,而
oauth2.hasScope…
在不重写
createExpressionHandler()的情况下工作。
你知道我如何使用@PreAuthorize(#oauth2.hasScope('requiredScope')对函数进行单元测试吗?我已经根据其他安全标准对其进行了分类,但我无法理解这一点。