【Spring Security】解决资源服务器无法获取userDetail内置的权限的问题

解决无法获取权限的问题

问题

授权服务器是OAuth2的,对于系统本身用户分配了client,id为browser,scope为all,在资源服务器中获取到的authorities为scope而不是用户本身的系统内权限。

解决方案

授权服务器

授权服务器默认存储一个client为系统内用户集合,scope为all,实现UserDetailsService接口复写loadUserByUsername方法,将系统内权限传递给springsecurity,最后塞入jwt消息中

/**
     * 客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息
     * @param clients
     * @throws Exception
     */
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
   
        clients.inMemory()
                .withClient(OAuth2_Client.BROWSER.getClient_id())
                .authorizedGrantTypes(OAuth2_Client.BROWSER.getGrant_type())
                .secret(OAuth2_Client.BROWSER.getClient_secret())
                .scopes(OAuth2_Client.BROWSER.getClient_scope())
                .authorities("admin","user")
                .accessTokenValiditySeconds(12*60*60);
}

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
   
    log.info("load user by username " + username);
    Result<User> userRes = userFeignService.getUserDetail(username);
    if (ResultCode.USER_NOT_EXIST.getCode().equals(userRes.getCode())) {
   
        throw new UsernameNotFoundException(ResultCode.USER_NOT_EXIST.getMsg());
    }
    User user = userRes.getData();
    log.info("load user by username success");
    return new CustomerUserDetails(user);
}

生成的JWT消息示例

{
   
 alg: "RS256",
 typ: "JWT"
}.
{
   
 sub: "admin",
 exp: 1608031046,
 authorities: [
  "ROLE_admin",
  "ROLE_user"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值