Spring security 如何使用spring security[自定义登录页]完成KeyClope用户更新密码所需的操作
目前,我们已经成功地在keydepeat中实现了自定义登录页面,但是我们面临的另一个问题是第一次登录时的用户密码更新。 当我使用用户名和密码访问keydape时Spring security 如何使用spring security[自定义登录页]完成KeyClope用户更新密码所需的操作,spring-security,keycloak,Spring Security,Keycloak,目前,我们已经成功地在keydepeat中实现了自定义登录页面,但是我们面临的另一个问题是第一次登录时的用户密码更新。 当我使用用户名和密码访问keydape时 val token = keycloak.keycloakForFetchUserToken( authentication.principal.toString(), authentication.credentials.toString()
val token = keycloak.keycloakForFetchUserToken(
authentication.principal.toString(),
authentication.credentials.toString()
).tokenManager().accessToken
fun keycloakForFetchUserToken(username:String, password: String): Keycloak {
return KeycloakBuilder.builder()
.serverUrl(KeycloakAttributes.SERVER_URL.value())
.username(username)
.password(password)
.realm(KeycloakAttributes.REALM.value())
.clientId(KeycloakAttributes.CLIENT_ID.value())
.clientSecret(KeycloakAttributes.CLIENT_SECRET.value())
.resteasyClient(ResteasyClientBuilder().connectionPoolSize(20).register(CustomJacksonProvider()).build())
.build()
}
当尝试获取访问令牌时,它正在抛出401个未经授权的令牌,因此很明显,我无法访问此用户的令牌,因为它已被KeyClope锁定。但是,只要我知道我可以连接到KeyClope并获取该用户的数据,并且看到它具有更新密码之类的必需操作,对吗?那么假设我已经获得了它,但问题是我如何继续?是否将用户发送到更新页面
有没有人能解决这个问题。我认为在这种情况下,让keyklock处理用户的require action而不是spring security的最佳选择是使用以下代码:
Keycloak keycloak = KeycloakBuilder.builder()
.serverUrl("localhost")
.realm("myRealm")
.grantType(OAuth2Constants.PASSWORD)
.clientId("myclient")
.clientSecret("xxxx-xxxxx-xxxx-xxx")
.username("foo")//the admin user
.password("password")
.build();
UsersResource usersResource = keycloak.realm("myRealm").users();
Optional<UserRepresentation> userList = usersResource.list(0, MAX_RESULTS).stream().filter(usr -> usr.getUsername().equals(userName)).findAny();
if (userList.isPresent()) {
UserRepresentation usr = userList.get();
if(usr.getRequiredActions().contains("UPDATE_PASSWORD")){
CredentialRepresentation credential = new CredentialRepresentation();
credential.setType(CredentialRepresentation.PASSWORD);
credential.setValue("pwd1234");
credential.setTemporary(false);
UserRepresentation user = userRepresentation.get();
user.setRequiredActions(new ArrayList());
UserResource userResource = usersResource.get(usr.getId());
userResource.resetPassword(credential);
}
}
keydape-keydape=keydapgebuilder.builder()
.serverUrl(“本地主机”)
.realm(“myRealm”)
.grantType(OAuth2Constants.PASSWORD)
.clientId(“我的客户”)
.clientSecret(“xxxx-xxxxx-xxxx-xxx”)
.username(“foo”)//管理员用户
.密码(“密码”)
.build();
UsersResource UsersResource=keydrope.realm(“myRealm”).users();
可选的userList=usersResource.list(0,MAX_RESULTS).stream().filter(usr->usr.getUsername().equals(userName)).findAny();
if(userList.isPresent()){
UserRepresentation usr=userList.get();
如果(usr.getRequiredActions()包含(“更新密码”)){
CredentialRepresentation credential=新的CredentialRepresentation();
credential.setType(CredentialRepresentation.PASSWORD);
凭证设置值(“pwd1234”);
临时凭证(假);
UserRepresentation user=UserRepresentation.get();
setRequiredActions(新ArrayList());
UserResource=usersResource.get(usr.getId());
userResource.resetPassword(凭证);
}
}
希望能帮上忙检查一下,谢谢,伙计!我知道如何更改用户密码。我的情况不同于仅仅更改用户密码。@Aliy Hi,你到底找到什么有效的解决方案了吗?