前面的文章给大家讲解了怎么实现springOAuth2来保证我们安全的流程,传送门在这里
基于内存https://mp.youkuaiyun.com/postedit/88553568
基于JDBChttps://mp.youkuaiyun.com/postedit/88576211
这篇文章主要讲下怎么实现简单的权限控制,我们在看表结构的时候,在oauth_client_details表里有一个字段是authorities。
这字段的解释是:
指定客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔, 如: "ROLE_
我们先用这个字段来控制我们访问资源服务的权限,首先我们先用库表里的客户端数据来生成token
这里我们可以到我们的client_2的authorities是ROLE_OAUTH1
然后我们拿client_2来生成token
然后我们来看资源服务。
我们在我们的测试接口上面加一个权限控制的注解
@PreAuthorize
@GetMapping("/test")
@PreAuthorize("hasAuthority('ROLE_OAUTH2')")
public String getTest() {
return "11111111111111";
}
hasAuthority是spring的EL表达式,对这方面只是不太了解的同学可以看这里
https://www.yiibai.com/spring-security/spring-security-4-method-security-using-preauthorize-postauthorize-secured-el.html
OK。配置好了别以为这样就可以了,我要在ResourceServerConfiguration里面添加
@EnableGlobalMethodSecurity(prePostEnabled = true)配置来开启我们的权限注解
这样就配置完成了,非常简单,不过还是建议大家可以去研读下源码了解下实现原理,那么下面我们就行测试了。
失败了,原因是因为springsecurity规定只用拥有ROLE_OAUTH2权限的客户端才可以访问,但是我们刚才的client_2的authorities是ROLE_OAUTH1,所以被拒绝了,那么我们用authorities是ROLE_OAUTH2的client_3来试一下吧
生成token
访问成功了。
下面来讲解另外一个简单的权限控制,这次我们从资源服务的角度出发
首先在yml文件里面给我们的资源服务设置一个resourceId
security:
oauth2:
resource:
jwt:
key-uri: http://localhost:8882/oauth/token_key
id: resource-server
然后在ResourceServerConfiguration里面装配资源ID信息
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Value("${security.oauth2.resource.id}")
private String resoucreId;
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/registry/**").permitAll()
.antMatchers("/**").authenticated();
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId(resoucreId);
}
}
重启服务之后我们还是用刚才生成的token来访问接口,发现还是可以访问,那么问题在哪里呢,原来是如果oauth_client_details里面的resource_ids字段为空的话是默认可以通过检验的,那么我们给client_3加上resource_ids字段信息
然后再来测试
发现失败了,然后我们再把resource_ids改成我们刚才在资源服务设置的resource-server,再来测试
这次就成功了
最后是比较简单的,如果想访问相同规则下的接口地址,可以在这里设置前缀
git源码地址
https://github.com/fjc440/spring-oauth2-demo/tree/feature_role