aku*_*lpp 6 oauth-2.0 openid-connect keycloak
我有一个包含 3 个单页应用程序和一个共享后端的领域。我想限制对其中一个 SPA 的访问,以便没有特定角色的用户无法登录。
但是一旦您在领域中创建了一个用户,他就可以登录到每个 SPA 客户端。我可以限制后端的端点,但我不想在特定 SPA 中以编程方式拒绝用户,而是在登录页面上自动拒绝。
我尝试使用在这种情况下似乎没有影响的客户端角色。到目前为止,我找到的唯一解决方案是创建单独的领域,我认为这在概念上是正确的方法,但不幸的是带来了一些实际问题,例如一个领域的管理员必须能够管理另一个领域的(CRUD)用户,这似乎是公平的不直观。
users without a specific role can't log in- 这不是一个好的要求。系统如何知道用户是否具有特定角色而无需登录(身份验证)?Keycloak提供Open ID ConnectSSO协议,专门用于身份验证。OIDC 身份验证成功后会生成令牌,其中可能还包含用户角色。所以只有这样才能申请授权。因此,让我们将需求更改为:users without a specific role can't access SPA,这更适合 OIDC 概念。
成熟的OIDC SPA库提供authorization guard(名称可以不同,它是某种登录后功能),可以实现授权。授权通常需要在令牌中具有特定角色,否则用户将被重定向到自定义路由,例如/unauthorized。在该页面中,您可以说出拒绝访问的原因。常见用例也是根据用户角色定制应用程序。例如,具有管理员角色的用户将比标准用户看到更多的菜单项 - 这也是一种授权。带有授权保护的 SPA 库的随机示例(我并不是说这是最好的实现) - https://github.com/damienbod/angular-auth-oidc-client/issues/441
请记住,SPA 并不“安全”——用户可能会篡改浏览器中的代码/数据,因此理论上用户可能会跳过浏览器中的任何授权。他可能会访问 SPA,因此在后端 (API) 端拥有适当的授权也很重要。攻击者可能可以访问 SPA,但如果 API 拒绝他的请求,则该访问权限将毫无用处。
顺便说一句:您可以在互联网上找到如何使用自定义脚本(例如自定义脚本映射器,它将测试角色存在)向 Keycloak 客户端添加授权的黑客建议。这是糟糕的架构方法——它正在解决身份验证过程中的授权问题。目前尚不清楚用户无法登录的原因 - 如果是因为凭据错误或因为在身份验证过程中需要某些角色。
您确实不应该创建多个领域,因为这超出了 SSO 系统的范围。在您的(可能是)基于 OAuth 2.0 的设置中可以采用两种方法:
第一个在架构上是合理的,但在某些用例中可能不太受欢迎,正如您所指出的那样。第二种方法是 OAuth 2.0 范围的设计目的。然而,由于 SPA 的性质,它被认为不太安全,因为更容易被欺骗。
| 归档时间: |
|
| 查看次数: |
986 次 |
| 最近记录: |