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

时间:2019-03-06 13:34:09

标签: spring-security keycloak

当前,我们已经在keycloak中成功实现了自定义登录页面,但是我们面临着另一个问题,即首次登录时更新用户密码。 当我使用用户名和密码(如

)访问keycloak时
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,因此很明显我无法访问该用户的令牌,因为它已被密钥斗篷锁定。但是,只要我知道我可以连接到密钥斗篷并获取该用户的数据,并看到它已执行了诸如update_password之类的必要操作,对吗?,所以可以说我明白了,但问题是我该如何前进?例如将用户引导到更新页面?

有人可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下,让密钥锁处理用户的要求操作的最佳选择不是通过以下代码来提高安全性:

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);

        }
    }

希望可以帮助