【Spring Security】 Oauth2 authorities 授权

Metadata

title: 【Spring Security】 Oauth2 authorities 授权
date: 2023-02-05 15:58
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/SpringSecurity
categories:
  - SpringSecurity
keywords:
  - SpringSecurity
description: 【Spring Security】 Oauth2 authorities 授权

【Spring Security】 Oauth2 authorities 授权

在 oauth_client_details 表中,有一个 authorities 字段,从字面上来看是授权的意思,在之前我们分析了可以通过 resourceId 和 scope进行授权,那么这个 authorities 授权又是什么东东呢,接下来简单分析下。

流程分析

1. 授权服务器添加 authorities

首先给当前客户端添加一个权限值。

2. 获取令牌并访问资源服务器

可以看到,authorities 也会存在在用户信息中。

那么应该想到,这和 scope 差不多,也是可以通过表达式进行授权的。

接着我们在方法上加上这个下面这个表达式,表示客户端需要admin:user角色值才能访问。

@PreAuthorize("#oauth2.clientHasRole('admin:user')") //

然后 Dubug 到OAuth2ExpressionUtils的 clientHasAnyRole 方法。

    public static boolean clientHasAnyRole(Authentication authentication, String... roles) {
        if (authentication instanceof OAuth2Authentication) {
            // 1. 获取到客户端信息
            OAuth2Request clientAuthentication = ((OAuth2Authentication) authentication).getOAuth2Request();
            // 2. 获取authorities信息 =》add:user
            Collection<? extends GrantedAuthority> clientAuthorities = clientAuthentication.getAuthorities();
            if (clientAuthorities != null) {
            // 3. 判断是有有当前权限值,没有则返回false,报错。
                Set<String> roleSet = AuthorityUtils.authorityListToSet(clientAuthorities);
                for (String role : roles) {
                    if (roleSet.contains(role)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

从代码中可以看到,Oauth2 的 authorities 对应了 Security 中的角色编码值。可用通过配置 Oauth2 客户端的角色,然后使用表达式 clientHasAnyRole 对授权进行控制。

总结

通过以上分析,原来 authorities 和 scope 一样,都是方法级别的权限控制。区别在于 scope 可以通过用户自己选择授权客户端拥有哪些权限,而 authorities 是定死的。