Keycloak KeyClope-只读用户属性

Keycloak KeyClope-只读用户属性,keycloak,Keycloak,我想将一些信息作为自定义用户属性保存在KeyClope中 其中一些应该由用户自己管理。其他属性只能由KeyClope管理员管理。管理员管理的属性在用户的“编辑帐户”网页中应为只读可见 我浏览并定制了“编辑帐户”网页 我的问题是: 是否确保用户不能更改用户只读的属性?例如,通过提交表单,他/她将发送正确的数据,这些数据将在服务器端自动映射到用户属性。对于您所说的,您似乎有三个选择 其中一个是保留KeyClope“编辑帐户”页面,并使用检查存储了哪些属性或哪些属性是由谁更新的,如下所示: 公共类Up

我想将一些信息作为自定义用户属性保存在KeyClope中

其中一些应该由用户自己管理。其他属性只能由KeyClope管理员管理。管理员管理的属性在用户的“编辑帐户”网页中应为只读可见

我浏览并定制了“编辑帐户”网页

我的问题是:
是否确保用户不能更改用户只读的属性?例如,通过提交表单,他/她将发送正确的数据,这些数据将在服务器端自动映射到用户属性。

对于您所说的,您似乎有三个选择

其中一个是保留KeyClope“编辑帐户”页面,并使用检查存储了哪些属性或哪些属性是由谁更新的,如下所示:

公共类UpdateProfile实现RequiredActionProvider、RequiredActionFactory、DisplayTypeRequiredActionFactory{
@凌驾
public InitiatedActionSupport InitiatedActionSupport(){
return InitiatedActionSupport.SUPPORTED;
}
@凌驾
公共void evaluateTriggers(RequiredActionContext上下文){
}
@凌驾
public void requiredActionChallenge(RequiredActionContext上下文){
响应质询=context.form()
.createResponse(UserModel.RequiredAction.UPDATE_PROFILE);
背景.挑战(挑战);
}
//检查用户未修改的自定义属性1
@凌驾
public void processAction(RequiredActionContext上下文){
EventBuilder event=context.getEvent();
event.event(EventType.UPDATE_PROFILE);
多值Map formData=context.getHttpRequest().getDecodedFormParameters();
UserModel user=context.getUser();
keydeposition session=context.getSession();
RealmModel realm=context.getRealm();
字符串newYourCustomAttribute1=formData.getFirst(“yourCustomAttribute1”);
字符串oldYourCustomAttribute1=user.getFirstAttribute(“yourCustomAttribute1”)
如果(!newYourCustomAttribute1.equals(oldYourCustomAttribute1)){
响应质询=context.form()
.setError(“用户无法更改属性”)
.setFormData(formData)
.createResponse(UserModel.RequiredAction.UPDATE_PROFILE);
背景.挑战(挑战);
返回;
}
context.success();
}
@凌驾
公众假期结束(){
}
@凌驾
public RequiredActionProvider创建(keyCoveSession会话){
归还这个;
}
@凌驾
public RequiredActionProvider createDisplay(Key隐形会话会话,字符串显示类型){
如果(displayType==null)返回此值;
if(!OAuth2Constants.DISPLAY_CONSOLE.equalsIgnoreCase(displayType))返回null;
返回控制台updateProfile.SINGLETON;
}
@凌驾
public void init(Config.Scope Config){
}
@凌驾
公共无效postInit(keydepositionfactory){
}
@凌驾
公共字符串getDisplayText(){
返回“更新配置文件”;
}
@凌驾
公共字符串getId(){
返回UserModel.RequiredAction.UPDATE_PROFILE.name();
}
}
我不知道的是,当您从客户端应用程序更新概要文件时,是否也会调用此侦听器。如果它被调用,你需要检查哪个是登录的客户端,如果是公共客户端,不要让它更新属性,如果是你的服务客户端,让它更新

第二个是只允许服务客户机更新用户配置文件,并在应用程序中创建自定义视图,向客户机发送表单POST,而不是直接向KeyClope发送。通过这种方式,您可以在将其发送到KeyClope之前在服务中对其进行验证

第三个是一个
表单
界面,它允许您在服务器端验证传入表单:

您必须实现的核心接口是FormAction接口。FormAction负责呈现和处理页面的一部分。呈现在buildPage()方法中完成,验证在validate()方法中完成,验证后操作在success()中完成

@覆盖
公共void验证(ValidationContext上下文){
多值Map formData=context.getHttpRequest().getDecodedFormParameters();
UserModel user=context.getUser();
keydeposition session=context.getSession();
RealmModel realm=context.getRealm();
字符串newYourCustomAttribute1=formData.getFirst(“yourCustomAttribute1”);
字符串oldYourCustomAttribute1=user.getFirstAttribute(“yourCustomAttribute1”)
如果(!newYourCustomAttribute1.equals(oldYourCustomAttribute1)){
响应质询=context.form()
.setError(“用户无法更改属性”)
.setFormData(formData)
.createResponse(UserModel.RequiredAction.UPDATE_PROFILE);
背景.挑战(挑战);
返回;
}
context.success();
}

执行版本12.0.4的更新。 如果用户更新其配置文件,则会删除所有属性,这在<12.0.4中存在一些问题

此外,12.0.4还可以创建用户和管理员只读属性

检查文件:


干杯

是否希望某些自定义属性为只读?或者你的意思是已经为用户设置了keydove属性?我希望我的一些自定义属性是只读的。那么用户应该如何设置这些属性呢?或者您是从应用程序的其他部分设置的?我是从应用程序的其他部分设置的。我尝试从Postman发布表单,其中包含UI模板中未定义的用户属性,结果成功。它表示已登录的用户