keycloak~巧用client-scope實(shí)現(xiàn)token字段和userinfo接口的授權(quán)
keycloak中的client-scope允許你為每個客戶端分配scope,而scope就是授權(quán)范圍,它直接影響了token中的內(nèi)容,及userinfo端點(diǎn)可以獲取到的用戶信息,這塊我們可以通過自定義scope/mapper,來實(shí)現(xiàn)粒度的控制,并且這個mapper可以控制添加到token,或者添加到userinfo端點(diǎn),這兩塊配置也是獨(dú)立的,下面我們通過一個登錄IP地址的mapper,來實(shí)現(xiàn)將登錄ip添加到token和userinfo端點(diǎn)。
添加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中的屬性名稱,默認(rèn)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

設(shè)置access_token可見和userinfo可見
- Add to ID token
- Add to access token
- Add to access token

為客戶端指定scope
- 這對于根據(jù)客戶端來控制token和userinfo端點(diǎn)是非常必要的功能
- 這是oauth2授權(quán)的重要組成部分

通過oauth2中的密碼認(rèn)證時的注意點(diǎn)
- 客戶端不能是
同意必選的,這種客戶端需要通過瀏覽器認(rèn)證,由用戶自己確認(rèn)它公開的信息


通過token獲取用戶信息
- userinfo端點(diǎn):/auth/realms/{realms}/protocol/openid-connect/userinfo
- 獲取到時的用戶信息中的字段,是通過scope來控制的

浙公網(wǎng)安備 33010602011771號