当前位置: 首页 > 知识库问答 >
问题:

每个用户的Keycloak harcoded声明

张权
2023-03-14

我使用微服务架构。每个服务都使用承载访问类型。用户通过公共服务获得令牌。每种服务都是业务应用,具有自己的优势。Rabbit mq用作进程间通信。Keycloak通过JWT为每个服务传输用户角色。但我想在用户的令牌中转移用户的privelegies。

像这样:

priveleges:[
 {resource: subjects,
  roles:[ADMIN,OPER,COMPLAINCE],
  categories:[
    read:[1,2,3,4,5],
    write:[3,4,5],
    delete:[3,4,5] 
  ],
  notes:[
    read:[1,2,3,4,5],
    write:[3,4,5],
    delete:[3,4,5]  
  ],
  subject:[
    read:true,
    write:true,
    delete:false
  ],
  addresses:[
    read:true,
    write:true,
    delete:false
  ]
 },


 {resource: cards,
  roles:[ADMIN,OPER,COMPLAINCE],
  card:[
    read:true,
    write:true,
    delete:false
  ],
  fin-operation:[1,2,3,4,5],
  non-fin-operation:[1,2,3,4]
 }
]

我有两个问题:

{ "priveleges":[ { "resource":"subjects", "roles":[ "ADMIN", "OPER", "COMPLAINCE" ], "categories":[ { "read":[ 1, 2, 3, 8, 5 ] }, { "write":[ 3, 9, 5 ] }, { "delete":[ 3, 6, 5 ] } ], "notes":[ { "read":[ 1, 2, 3, 7, 5 ] }, { "write":[ 3, 4, 5 ] }, { "delete":[ 3, 4, 5 ] } ] }, { "resource":"cards", "roles":[ "ADMIN", "OPER", "COMPLAINCE" ], "fin-operation":[ 1, 2, 3, 4, 5 ], "non-fin-operation":[ 1, 2, 3, 4 ] } ] }

共有1个答案

卜存
2023-03-14

我可以在keycloak中为每个用户设置不同的特权吗?我知道在KeyCloak中使用带有硬编码映射器类型的ProtocolMapper是可能的。在这种情况下,它将为所有用户提供一个,但我需要为每个用户提供privelegies声明。

如果我正确理解“特权”的意思,您至少可以通过以下两种方式实现它:1)相应地创建并分配领域角色给用户,并在每个用户上创建自定义的用户属性。或者,您可以使用Keycloak授权特性来处理这个问题,但这需要一些工作。

在令牌中传递特权,以便以后可以在后端和前端处理这些特权,这是正确的吗?

是的,通常使用Keycloak进行身份验证,并使用后端根据为某个用户请求的令牌注入的角色来执行授权部分。

让我给大家提供一个说明性的例子。首先通过转到以下位置创建领域角色:

  • 您的领域;
  • 选择角色;
  • 添加角色;
  • 现在为ADMIN、OPER和Compulce创建一个单独的角色;
  • 保存这些角色;

将选项卡切换到角色映射;

现在转到属性;

将其余的声明添加到用户中。例如,键=“PriveLeges”和值={“资源”:“主题”,“类别”:[{“读取”:[1,2,3,8,5]},{“写入”:[3,9,5]},{“删除”:[3,6,5]},“注释”:[{“读取”:[1,2,3,7,5]},{“写入”:[3,4,5]},{“删除”:[3,4,5]}。

要完成此操作,您需要创建一个映射器来将新创建的用户属性映射到令牌中。为此,请转到:

  • 您的领域;
  • 客户端
  • 选择您的客户端;
  • 映射器;
  • 创建;
  • 填满字段,即
    • 名称:“priveleges”
    • 作为映射器类型选择“用户属性”;
    • 用户属性:priveLeges;
    • 令牌声明名称:priveLeges;
    • 声明JSON类型:JSON
    • 相应填满其余部分。
    • 单击“保存”。

    现在代表用户向客户端请求一个令牌。解码后的令牌将如下所示:

     "iat": ......,
      "jti": "......",
      "iss":  "......",
      "aud":  "......",
      "sub":  "......",
      "typ":  "......",
      "azp":  "......",
      "session_state":  "......",
      "acr": "1",
      "allowed-origins": [
        "http://localhost:8080"
      ],
      "realm_access": {
        "roles": [
          "COMPLAINCE",
          "offline_access",
          "uma_authorization",
          "ADMIN",
          "OPER",
          "app-user"
        ]
      },
      "resource_access": {
        "springboot-microservice": {
          "roles": [
            "user"
          ]
        },
        "account": {
          "roles": [
            "manage-account",
            "manage-account-links",
            "view-profile"
          ]
        }
      },
      "scope": "profile email",
      "email_verified": true,
      "priveleges": {
          "resource": "subjects",
          "categories": [
            {
              "read": [
                1,
                2,
                3,
                8,
                5
              ]
            },
            {
              "write": [
                3,
                9,
                5
              ]
            },
            {
              "delete": [
                3,
                6,
                5
              ]
            }
          ],
          "notes": [
            {
              "read": [
                1,
                2,
                3,
                7,
                5
              ]
            },
            {
              "write": [
                3,
                4,
                5
              ]
            },
            {
              "delete": [
                3,
                4,
                5
              ]
            }
          ]
       },
      "name": "e 1",
      "preferred_username": "employee1",
      "given_name": "e",
      "family_name": "1",
    }
    
     "realm_access": {
        "roles": [
          "COMPLAINCE",
          "offline_access",
          "uma_authorization",
          "ADMIN",
          "OPER",
          "app-user"
        ]
    

 类似资料:
  • 我有一个系统,作为第三方的API。我需要观察每个第三方的响应时间。但正如普罗米修斯在其文档中所定义的: 请记住,键值标签对的每一个唯一组合都表示一个新的时间序列,这会显著增加存储的数据量。不要使用标签存储基数高的维度(许多不同的标签值),如用户ID、电子邮件地址或其他无界值集。 http_3rdParty1_requests_total http_3rdParty2_requests_total.

  • 我希望能够使用Micronaut的声明性客户端,根据我是在本地开发环境还是在生产环境中,找到不同的endpoint。 我在中设置客户端的基本uri: 阅读来自Micronaut的文档,他们让开发人员跳过了相当多的障碍,将动态值输入到实际客户端。它们实际上很混乱。所以我创建了这样的配置: 但是正如您所看到的,这实际上并不是从中读取任何值,它只是将const值设置为类的静态值。我希望值根据我所处的环境

  • 在Xcode中,在项目级别,我有以下设置:Xcode设置禁止不推荐使用的函数警告 这将-Wno-deprecated-declarations添加到编译中,我可以从报告导航器中验证这一点。同样,当我尝试使用一个不推荐使用的函数时,也不会出现警告。 我想在单个文件中禁止显示此警告,因此我使用#pragma,如下所示; 此代码给出以下编译错误;错误:未知警告组“-Wno deprecated decl

  • 我最近从Nordic SemiConductor导入了一个项目,现在我从头创建的任何项目在每个文件中都有版权声明: /**版权所有(c)2015年,北欧半导体...............................................*/ 然后我转到文件>其他设置>默认设置,设置是:没有版权声明。 我完全迷失在如何消除我的项目这一声明,并将感谢任何帮助。

  • 问题内容: 我有一个Web应用程序,并且我想为每个用户使用不同的日志,因此我可以了解该用户在系统上所做的事情的“历史记录”。 这是我到目前为止所拥有的: 问题是,作为Web应用程序,它是多线程的,所以AFAIK我不能一直使用并根据我要登录的用户来更改附加程序。我认为我应该为每个用户创建不同的内容,但这是正确的吗? 问题答案: 尝试切换到logback(log4j的后继者)。它带有一个Sifting

  • 问题内容: 如果我有一个具有以下结构和数据的表: 我将使用哪种查询来获得以下结果(随后的说明): 如你看到的: 每个仅返回一行。 最高的那一行是返回的那一行。 是否有一种 无需 使用子查询即可完成此操作的方法?该程序经过的关系代数术语中是否有名称? 问题答案: 该查询称为逐组最大值,它(至少在MySQL中)可以通过子查询实现。例如: 在sqlfiddle上看到它。