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<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
    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<ProviderConfigProperty> 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

  • 在client scope中添加mapper

设置access_token可见和userinfo可见

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

为客户端指定scope

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

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

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

通过token获取用户信息

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

原创作者: lori 转载于: https://www.cnblogs.com/lori/p/18669091
sa-token 是一个轻量级 Java 权限认证框架,而 OAuth 2.0 是一个开放标准,允许第三方应用获取对HTTP服务上用户帐户的有限访问权限,无需用户提供用户名密码。将 sa-token 与 OAuth 2.0 整合可以使得你的 Java 应用支持更加灵活的认证授权机制。 整合 sa-token 与 OAuth 2.0 通常涉及以下步骤: 添加依赖:首先,你需要在你的项目中添加 sa-token 可能的 OAuth 2.0 客户端库(如 Spring Security OAuth2 Client)的依赖。 配置 OAuth 2.0:配置 OAuth 2.0 的授权服务器信息、客户端ID、客户端密钥等。这通常在你的 Spring Boot 配置文件中完成,例如 application.yml 或 application.properties。 实现 OAuth 2.0 登录流程:你需要实现 OAuth 2.0 的登录流程,包括重定向用户到授权服务器、处理授权服务器的回调等。 将 OAuth 2.0 的令牌转换为 sa-token 的令牌:当用户通过 OAuth 2.0 成功认证后,授权服务器会返回一个访问令牌。你需要将这个令牌转换为 sa-token 的令牌,以便在你的应用中使用 sa-token 的权限控制功能。 整合权限控制:使用 sa-token 的注解或其他机制来控制你的应用的权限。 处理令牌刷新过期:确保你的应用能够处理 OAuth 2.0 访问令牌的刷新过期情况。 测试:对你的整合进行彻底的测试,确保 OAuth 2.0 登录流程正常工作,并且 sa-token 的权限控制也按预期工作。 具体的实现细节会根据你的项目需求、使用的技术栈 OAuth 2.0 服务器的具体实现而有所不同。 需要注意的是,Spring Security 5 提供了对 OAuth 2.0 的原生支持,如果你使用的是 Spring Boot,那么整合 Spring Security OAuth 2.0 可能是更直接的选择。然后,你可以将 Spring Security 的认证授权与 sa-token 进行整合 基于此要求 帮我详细编写代码
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值