Spring security 如何使用spring security[自定义登录页]完成KeyClope用户更新密码所需的操作

Spring security 如何使用spring security[自定义登录页]完成KeyClope用户更新密码所需的操作,spring-security,keycloak,Spring Security,Keycloak,目前,我们已经成功地在keydepeat中实现了自定义登录页面,但是我们面临的另一个问题是第一次登录时的用户密码更新。 当我使用用户名和密码访问keydape时 val token = keycloak.keycloakForFetchUserToken( authentication.principal.toString(), authentication.credentials.toString()

目前,我们已经成功地在keydepeat中实现了自定义登录页面,但是我们面临的另一个问题是第一次登录时的用户密码更新。 当我使用用户名和密码访问keydape时

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,你到底找到什么有效的解决方案了吗?