中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

keycloak~scope客戶端模板的使(shi)用

scope為何物?

scope在oauth2中表示授權的范圍,另外也可以理解為,根據認證時scope的參數,在構建jwt時,返回更多的信息;比如在keycloak中,你的可選scope(optional scope)中添加了address這個模板,當你通過/auth/realms/{realmId}/protocol/openid-connect/token進行認(ren)證時,你的參數scope中出現address,那么在生成的jwt token中,就會出現address這個內容,如圖:

這種按需求(qiu)構建jwt的(de)方法就是client scope最大的(de)作用,下(xia)面我們具體來說一下(xia)步驟。

客戶端模板功能匯總

  1. 在客戶端模板中,可以看到所有的模板列表
  2. 可直接為所有新加的客戶端添加默認模板(Default Client Scopes)
  3. 可以在模板配置中,選擇可選模板,這個功能與認證參數scope配合使用,根據scope參數來擴展jwt token的內容
  4. 通過繼承AbstractOIDCProtocolMapper來擴展客戶端模板

配置客戶端模板

模板列表,如圖:

默認客戶(hu)(hu)端模(mo)板和(he)可選(xuan)客戶(hu)(hu)端模(mo)板

  • 默認客戶端模板(Default Client Scopes )
  • 可選客戶端模板(Optional Client Scopes )
  • 以上兩種模板互斥,即,當一個模板select-user被選擇為“默認客戶端模板”后,它將會在“可選客戶端模板”列表中消失,反之,亦然。

可選(xuan)客戶端模板,可以添加address,openid來對原有jwt進行(xing)擴展(zhan),如圖:

認(ren)證(zheng)請(qing)求(qiu)時,添加scope參數,如openid,address等

  • openid:在jwt中添加id_token相關信息,即存放用戶的基本信息的token。
  • address:在jwt中添加address屬性,通過解析user_attribute中的street,locality,region等信息,來擴展jwt token。

自定義客戶端模板

例如,希望寫一(yi)個擴展,在token中(zhong)輸出(chu)用戶(hu)昵稱(cheng),但這個昵稱(cheng)是有業務(wu)邏(luo)輯的,通過(guo)復雜的邏(luo)輯計算出(chu)一(yi)個用戶(hu)昵稱(cheng),這時,需要你(ni)自(zi)定(ding)義一(yi)個模(mo)板

  1. 定義一個ExtensionNicknameMapper
public class ExtensionNicknameMapper
    extends AbstractOIDCProtocolMapper
    implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {

  public static final String CONFIG_NAME = "extensionNickname";//配置里的名稱
  public static final String PROVIDER_ID = "oidc-extension-nick-name-mapper";
  private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
  private static final String NICKNAME = "nickname";

  static {
    configProperties.add(createConfigProperty(CONFIG_NAME, "Token申請名", "在jwt中的屬性名稱,默認nickname"));
    OIDCAttributeMapperHelper.addIncludeInTokensConfig(configProperties, ExtensionNicknameMapper.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) {
  
      String nickname="";
       // 復雜的業務方法,計算出nickname變量的值
      token.setOtherClaims(tokenAttribute, nickname);
  }

  public List<ProviderConfigProperty> getConfigProperties() {
    return configProperties;
  }

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

  @Override
  public String getDisplayType() {
    return "Extension Nickname";
  }

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

  @Override
  public String getHelpText() {
    return "Maps Extension Nickname claim.";
  }

}

  1. 將ExtensionNicknameMapper添加到Jboss的SPI中
  • /resources/META-INF/services/org.keycloak.protocol.ProtocolMapper文件
your.package.ExtensionNicknameMapper
  1. 在keycloak管理后臺,添加一個新的模板,然后在模板里的mapper選項卡中,添加一個新的mapper中選你的ExtensionNicknameMapper

好了(le)(le),到(dao)這里,keycloak的client scope(客戶端模板)就(jiu)介紹完了(le)(le),希望對各位有所幫助。

posted @ 2024-09-03 09:14  張占嶺  閱讀(349)  評論(0)    收藏  舉報