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

相关推荐

  • 2024Java零基础自学路线(Java基础、Java高并发、MySQL、Spring、Redis、设计模式、Spring Cloud)

    目录 一、Java基础 1、Java 基础 3、Java8新特性 4、Java集合 5、Java高并发 6、Java代码实例 二、MySQL数据库 三、Spring Boot框架(35天) 四、微服务Spring Cloud 四、Redis中间件 五、MongoDB数据库 六、Netty网络编程 七、23种设计模式 八、Dubbo 九、JavaScript零…

    2024 年 12 月 27 日
    34600
  • 架构师启示录:知识模型、落地方法与思维模式PDF、EPUB免费下载

    适读人群 :资深程序员、初级架构师 从架构知识模型、架构落地方法、架构思维模式三大维度介绍架构师的能力模型,带你穿越“认知迷雾” 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: 灵犀出版社: 机械工业出版社出版年: 2024-3页数: 212装帧: 平装丛书: 架构师书库ISBN: 97871117…

    2025 年 1 月 12 日
    44700
  • Java数据结构精讲:深入探索链表操作与面试题解析(第三部分)

    专题系列:Java数据结构解析 作者主页:编程探索者内容导航一、链表常见面试题精解1.1. 链表元素分割问题1.2. 判断回文链表1.3. 寻找链表交点1.4. 检测环形链表 一、链表常见面试题精解 1.1. 链表元素分割问题 题目要求保持原始数据顺序不变。我们可以通过遍历链表,将节点根据给定值x分成前后两部分。具体实现时,需要维护四个指针分别表示两个子链表…

    2025 年 5 月 15 日
    12600
  • chrome浏览器network如何查看上一个页面的请求

    前言 大家好,我是小徐啊。chrome浏览器是我们在JAVA开发中常用的浏览器,其中的console和network等,都是我们常用的功能。network中,是可以看到每次的请求的,包括请求的参数和返回的数据。但有时候,页面上请求之后,会有跳转的请求,导致看不到上一个页面的请求。其实,我们可以设置的,那么,该如何设置呢? 如何设置 首先,打开network的…

    2025 年 1 月 1 日
    49200
  • MySQL 安装部署

    概述 本文主要介绍如何在 Linux 中以 RPM 包的方式安装 MySQL 并进行相关的初始化配置,文中方案均已实践验证。 操作系统 CentOS 7.6 数据库版本 MySQL 8.4.3 LTS [!NOTE] 说明 本文主要介绍 RPM 包的安装方式,其他安装方法可查阅官网:MySQL :: MySQL 8.4 Reference Manual ::…

    未分类 2025 年 1 月 13 日
    36800

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信