ToB企服应用市场:ToB评测及商务社交产业平台

标题: Keycloak中授权的实现 [打印本页]

作者: 飞不高    时间: 2024-5-17 07:21
标题: Keycloak中授权的实现
在Keycloak中实现授权,首先必要相识与授权相关的一些概念。授权,简单地说就是某个(些)用户或者某个(些)用户组Policy),是否具有对某个资源Resource)具有某种操作Scope)的权限Permission)。所以,授权是一种权限管理,它建立在认证的基础上:用户首先要完成认证(Authentication),才气谈授权(Authorization)。在讨论认证与授权的文章或论坛里,往往用Authn代表认证(Authentication),而用Authz代表授权(Authorization)。
Keycloak中的授权模型

在上面这段描述中,我已经将几个紧张的概念用黑体字标注了。或许会有如许的疑问:用户/用户组不应该是User/Group吗?在谈授权的时候,至少也应该是角色(Role)吧,比如我们熟悉的基于角色的访问控制(RBAC),里面就是角色,怎么会是策略(Policy)呢?在答复这个问题前,还是先看一下Keycloak中的授权模型:

这个模型中,包含了几个紧张的概念:
理解了这些概念后,在Keycloak中实现授权并不困难。
演练:在Keycloak中实现授权

还是以Weather API为例,设置如许的业务场景:
这个业务场景也可以用下面的图来表述:

首先,在Keycloak中新建一个名为aspnetcoreauthz的Realm,在这个Realm下,新建三个User,分别是super,daxnet和nobody;然后新建两个Group:administrators和users,将super用户放到administrators组和users组里,并将daxnet用户放入users组里。
然后,新建一个名为weatherapiclient的Client,在weatherapiclient的页面里,点击Roles选项卡,创建两个名为administrator和regular user的角色,然后回到Groups里,选中administrators组,在Role mapping中,将administrator角色赋予该组:

用同样的方法,将regular user角色赋予users组。
如今进入Authorization选项卡,点击Scopes选项卡,然后点击Create authorization scope按钮:

在Create authorization scope页面中,Name字段输入weather.read,用同样的方法,新建另一个Scope,名称为weather.update。然后点击Resources选项卡,并点击Create resource按钮,创建API resource:

在Create resource页面,新建名为weather-api的资源,填入如下字段,然后点击Save按钮生存:

回到Authorization标签页,点击Policies标签页,点击Create client policy按钮,在弹出的对话框中,选择Role,表示必要创建一个基于角色的策略。在Create role policy页面,新建一个名为require-admin-policy的策略,在Roles部分,点击Add roles按钮,选择weatherapiclient下的administrator角色,然后点击Save按钮生存:

用同样的方法创建require-registered-user策略,并将regular user作为角色到场。接下来开始创建权限实体(Permission)。在Authorization选项卡里,点击Permission选项卡,然后点击Create permission,然后选择Create scope-based permission。在Create scope-based permission页面,创建一个名为weather-view-permission的Permission,Authorization scopes选择weather.read,Policies选择require-registered-user,这里的语义已经很明确了:执行weather.read操作,必要require-registered-user策略,也就是要读取天气预报信息,就必要已注册用户。点击Save按钮生存即可。

用同样的方法创建另一个名为weather-modify-permission的Permission,Authorization scopes为weather.update,Policies为require-admin-policy。
接下来,就可以测试权限的设置是否正确了。仍然在Authorization选项卡下,点击Evaluate选项卡,在Identity Information部分,Users里选择super:

然后点击Evaluate按钮,之后就可以看到,weather-modify-permission和weeather-view-permission均投票为Permit,表示该用户具有两者权限:

假如点击Show authorization data,则在弹出的Authorization data对话框中,可以看到token里已经包含了授权信息(authorization Claim):
  1. {
  2.   "exp": 1712996185,
  3.   "iat": 1712995885,
  4.   "jti": "4f1178f2-5e8b-41e4-b726-da9120d77baa",
  5.   "aud": "weatherapiclient",
  6.   "sub": "44bbfc3a-16a0-499a-aae9-a2aa36219d33",
  7.   "typ": "Bearer",
  8.   "azp": "weatherapiclient",
  9.   "session_state": "2b228dd4-38c8-4002-bc11-b35ecd109a63",
  10.   "acr": "1",
  11.   "allowed-origins": [
  12.     "/*"
  13.   ],
  14.   "realm_access": {
  15.     "roles": [
  16.       "default-roles-aspnetcoreauthz",
  17.       "offline_access",
  18.       "uma_authorization"
  19.     ]
  20.   },
  21.   "resource_access": {
  22.     "weatherapiclient": {
  23.       "roles": [
  24.         "administrator",
  25.         "regular user"
  26.       ]
  27.     },
  28.     "account": {
  29.       "roles": [
  30.         "manage-account",
  31.         "manage-account-links",
  32.         "view-profile"
  33.       ]
  34.     }
  35.   },
  36.   "authorization": {
  37.     "permissions": [
  38.       {
  39.         "scopes": [
  40.           "weather.update",
  41.           "weather.read"
  42.         ],
  43.         "rsid": "f6fd1d6f-3bfd-44a1-a6fb-a1fb49769ac9",
  44.         "rsname": "weather-api"
  45.       }
  46.     ]
  47.   },
  48.   "scope": "email profile",
  49.   "sid": "2b228dd4-38c8-4002-bc11-b35ecd109a63",
  50.   "email_verified": false,
  51.   "name": "Admin User",
  52.   "groups": [
  53.     "/administrators",
  54.     "/users"
  55.   ],
  56.   "preferred_username": "super",
  57.   "given_name": "Admin",
  58.   "family_name": "User",
  59.   "email": "super@abc.com"
  60. }
复制代码
换一个用户,假如选择daxnet,可以看到,weather-view-permission为Permit,而weather-modify-permission为Deny:

再将用户换为nobody测试一下,发现两个Permission的结果都为Deny:

通过token API端点哀求授权信息

要使用OpenID Connect的token API端点得到某个用户的授权信息,必要首先得到Bearer token:

然后,使用这个Bearer token,再次调用token API,留意此时的grant_type为 urn:ietf:paramsauth:grant-type:uma-ticket,audience为Client ID,即weatherapiclient:

在jwt.io中解码第二步生成的这个access_token,就可以拿到授权信息了:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4