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

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

keycloak中的client-scope答应你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定义scope/mapper,来实现粒度的控制,并且这个mapper可以控制添加到token,或者添加到userinfo端点,这两块配置也是独立的,下面我们通过一个登录IP地址的mapper,来实现将登录ip添加到token和userinfo端点。
添加Mapper对象
  1. public class ExtensionLoginIpMapper
  2.         extends AbstractOIDCProtocolMapper
  3.         implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {
  4.     public static final String CONFIG_NAME = "ExtensionLoginIp";//配置里的名称
  5.     public static final String PROVIDER_ID = "oidc-extension-login-ip-mapper";
  6.     private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
  7.     private static final String LOGIN_IP = "loginIp";
  8.     static {
  9.         configProperties.add(createConfigProperty(CONFIG_NAME, "Token申请名", "在jwt中的属性名称,默认loginIp"));
  10.         OIDCAttributeMapperHelper.addIncludeInTokensConfig(configProperties, ExtensionLoginIpMapper.class);
  11.     }
  12.     protected static ProviderConfigProperty createConfigProperty(String claimName, String label, String help) {
  13.         ProviderConfigProperty property = new ProviderConfigProperty();
  14.         property.setName(claimName);
  15.         property.setLabel(label);
  16.         property.setHelpText(help);
  17.         property.setType(ProviderConfigProperty.STRING_TYPE);
  18.         return property;
  19.     }
  20.     @Override
  21.     protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession,
  22.                             KeycloakSession keycloakSession, ClientSessionContext clientSessionCtx) {
  23.         try {
  24.             String key = LOGIN_IP;
  25.             if (mappingModel.getConfig().containsKey(CONFIG_NAME)) {
  26.                 key = mappingModel.getConfig().get(CONFIG_NAME);
  27.             }
  28.             if (userSession.getNotes().containsKey(LOGIN_IP)) {
  29.                 String val = userSession.getNote(LOGIN_IP);
  30.                 token.setOtherClaims(key, val);
  31.             }
  32.         } catch (Exception e) {
  33.             e.printStackTrace();
  34.         }
  35.     }
  36.     public List<ProviderConfigProperty> getConfigProperties() {
  37.         return configProperties;
  38.     }
  39.     @Override
  40.     public String getId() {
  41.         return PROVIDER_ID;
  42.     }
  43.     @Override
  44.     public String getDisplayType() {
  45.         return CONFIG_NAME;
  46.     }
  47.     @Override
  48.     public String getDisplayCategory() {
  49.         return TOKEN_MAPPER_CATEGORY;
  50.     }
  51.     @Override
  52.     public String getHelpText() {
  53.         return "Maps Extension Login Ip Address.";
  54.     }
  55. }
复制代码
将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来控制的


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表