keycloak~巧用client-scope实现token字段和userinfo接口的授权

keycloak中的client-scope允许你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定义scope/mapper,来实现粒度的控制,并且这个mapper可以控制添加到token,或者添加到userinfo端点,这两块配置也是独立的,下面我们通过一个登录IP地址的mapper,来实现将登录ip添加到token和userinfo端点。

添加Mapper对象

```
public class ExtensionLoginIpMapper
        extends AbstractOIDCProtocolMapper
        implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {
    public static final String CONFIG_NAME = "ExtensionLoginIp";//配置里的名称
    public static final String PROVIDER_ID = "oidc-extension-login-ip-mapper";
    private static final List configProperties = new ArrayList();
    private static final String LOGIN_IP = "loginIp";

    static {
        configProperties.add(createConfigProperty(CONFIG_NAME, "Token申请名", "在jwt中的属性名称,默认loginIp"));
        OIDCAttributeMapperHelper.addIncludeInTokensConfig(configProperties, ExtensionLoginIpMapper.class);
    }

    protected static ProviderConfigProperty createConfigProperty(String claimName, String label, String help) {
        ProviderConfigProperty property = new ProviderConfigProperty();
        property.setName(claimName);
        property.setLabel(label);
        property.setHelpText(help);
        property.setType(ProviderConfigProperty.STRING_TYPE);
        return property;
    }

    @Override
    protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession,
                            KeycloakSession keycloakSession, ClientSessionContext clientSessionCtx) {
        try {
            String key = LOGIN_IP;
            if (mappingModel.getConfig().containsKey(CONFIG_NAME)) {
                key = mappingModel.getConfig().get(CONFIG_NAME);
            }

            if (userSession.getNotes().containsKey(LOGIN_IP)) {
                String val = userSession.getNote(LOGIN_IP);
                token.setOtherClaims(key, val);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List getConfigProperties() {
        return configProperties;
    }

    @Override
    public String getId() {
        return PROVIDER_ID;
    }

    @Override
    public String getDisplayType() {
        return CONFIG_NAME;
    }

    @Override
    public String getDisplayCategory() {
        return TOKEN_MAPPER_CATEGORY;
    }

    @Override
    public String getHelpText() {
        return "Maps Extension Login Ip Address.";
    }
}
```

将Mapper添加到Client Scope

  • 添加 client scope

keycloak~巧用client-scope实现token字段和userinfo接口的授权

  • 在client scope中添加mapper

keycloak~巧用client-scope实现token字段和userinfo接口的授权

设置access_token可见和userinfo可见

  • Add to ID token
  • Add to access token
  • Add to access token

keycloak~巧用client-scope实现token字段和userinfo接口的授权

为客户端指定scope

  • 这对于根据客户端来控制token和userinfo端点是非常必要的功能
  • 这是oauth2授权的重要组成部分

keycloak~巧用client-scope实现token字段和userinfo接口的授权

通过oauth2中的密码认证时的注意点

  • 客户端不能是同意必选的,这种客户端需要通过浏览器认证,由用户自己确认它公开的信息

keycloak~巧用client-scope实现token字段和userinfo接口的授权

keycloak~巧用client-scope实现token字段和userinfo接口的授权

通过token获取用户信息

  • userinfo端点:/auth/realms/{realms}/protocol/openid-connect/userinfo
  • 获取到时的用户信息中的字段,是通过scope来控制的

keycloak~巧用client-scope实现token字段和userinfo接口的授权

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6654.html

(0)
LomuLomu
上一篇 2025 年 1 月 16 日 上午2:55
下一篇 2025 年 1 月 16 日 上午3:56

相关推荐

  • 微软开源!Office 文档轻松转 Markdown!

    大家好,我是 Java陈序员。 今天,给大家介绍一款微软开源的文档转 Markdown 工具。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 MarkItDown —— 微软开源的 Python 工具,能够将多种常见的文件格式(如 PDF、PowerPoint、Word、Excel、图像、音频…

    2025 年 1 月 10 日
    52600
  • Python包管理不再头疼:uv工具快速上手

    Python 包管理生态中存在多种工具,如 pip、pip-tools、poetry、conda 等,各自具备一定功能。 而今天介绍的uv 是 Astral 公司推出的一款基于 Rust 编写的 Python 包管理工具,旨在成为 “Python 的 Cargo ”。 它提供了快速、可靠且易用的包管理体验,在性能、兼容性和功能上都有出色表现,为 Python…

    2024 年 12 月 31 日
    80900
  • 【C++】深入解析explicit关键字的奥秘(从原理到实践全面掌握explicit的用法)

    目录导航一、开篇引言二、揭开explicit的神秘面纱三、构造函数的隐式转换机制🍏单参数构造函数的隐式转换🔍explicit关键字的引入契机🍊多参数构造函数的特殊情况🔍explicit的实际应用价值🔍explicit的正确使用姿势四、核心要点回顾五、学习寄语 一、开篇引言 在日常C++编程实践中,explicit关键字可能并不常见于我们的代码中。然而,在标准…

    2025 年 5 月 15 日
    28400
  • 免费PDF合并工具使用指南

    引言 各位朋友好,我是技术分享者小徐。在日常的Java开发工作中,PDF文档处理是常见需求。高效处理PDF文件能显著提升我们的工作效率。当需要将多个PDF文档整合为一个时,很多工具要么收费要么操作复杂。今天为大家介绍一款简单易用的免费PDF处理工具。 零成本实现PDF合并 第一步:通过微信搜索功能,输入”PDF助手”进行查找,认准下方展示的小程序图标进入。也…

    2025 年 5 月 15 日
    35800
  • 安装MySQL-9.1.0-winx64.msi的报错解决办法:Database initialization failed

    错误日志:数据库初始化失败 开始配置步骤:编写配置文件 保存 my.ini 配置文件… 已保存 my.ini 配置文件。 结束配置步骤:编写配置文件 开始配置步骤:更新 Windows 防火墙规则 为 MySQL91 添加 Windows 防火墙规则,端口为 3306。 尝试使用命令添加 Windows 防火墙规则:netsh.exe advfirewa…

    2024 年 12 月 24 日
    1.0K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信