基于springOAuth2官方数据库表结构的简单权限控制

前面的文章给大家讲解了怎么实现springOAuth2来保证我们安全的流程,传送门在这里
基于内存https://mp.csdn.net/postedit/88553568
基于JDBChttps://mp.csdn.net/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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值