/** * Get account information. * * @return */ @Path("/") @GET public Response accountPage() { List<MediaType> types = headers.getAcceptableMediaTypes(); if (types.contains(MediaType.WILDCARD_TYPE) || (types.contains(MediaType.TEXT_HTML_TYPE))) { return forwardToPage(null, AccountPages.ACCOUNT); } else if (types.contains(MediaType.APPLICATION_JSON_TYPE)) { requireOneOf(AccountRoles.MANAGE_ACCOUNT, AccountRoles.VIEW_PROFILE); UserRepresentation rep = ModelToRepresentation.toRepresentation(auth.getUser()); if (rep.getAttributes() != null) { Iterator<String> itr = rep.getAttributes().keySet().iterator(); while (itr.hasNext()) { if (itr.next().startsWith("keycloak.")) { itr.remove(); } } } return Cors.add(request, Response.ok(rep)).auth().allowedOrigins(auth.getToken()).build(); } else { return Response.notAcceptable( Variant.VariantListBuilder.newInstance() .mediaTypes(MediaType.TEXT_HTML_TYPE, MediaType.APPLICATION_JSON_TYPE) .build()) .build(); } }
@Test public void attributes() { UserRepresentation user1 = new UserRepresentation(); user1.setUsername("user1"); user1.singleAttribute("attr1", "value1user1"); user1.singleAttribute("attr2", "value2user1"); Response response = realm.users().create(user1); String user1Id = ApiUtil.getCreatedId(response); response.close(); UserRepresentation user2 = new UserRepresentation(); user2.setUsername("user2"); user2.singleAttribute("attr1", "value1user2"); List<String> vals = new ArrayList<>(); vals.add("value2user2"); vals.add("value2user2_2"); user2.getAttributesAsListValues().put("attr2", vals); response = realm.users().create(user2); String user2Id = ApiUtil.getCreatedId(response); response.close(); user1 = realm.users().get(user1Id).toRepresentation(); assertEquals(2, user1.getAttributesAsListValues().size()); assertAttributeValue("value1user1", user1.getAttributesAsListValues().get("attr1")); assertAttributeValue("value2user1", user1.getAttributesAsListValues().get("attr2")); user2 = realm.users().get(user2Id).toRepresentation(); assertEquals(2, user2.getAttributesAsListValues().size()); assertAttributeValue("value1user2", user2.getAttributesAsListValues().get("attr1")); vals = user2.getAttributesAsListValues().get("attr2"); assertEquals(2, vals.size()); assertTrue(vals.contains("value2user2") && vals.contains("value2user2_2")); user1.singleAttribute("attr1", "value3user1"); user1.singleAttribute("attr3", "value4user1"); realm.users().get(user1Id).update(user1); user1 = realm.users().get(user1Id).toRepresentation(); assertEquals(3, user1.getAttributesAsListValues().size()); assertAttributeValue("value3user1", user1.getAttributesAsListValues().get("attr1")); assertAttributeValue("value2user1", user1.getAttributesAsListValues().get("attr2")); assertAttributeValue("value4user1", user1.getAttributesAsListValues().get("attr3")); user1.getAttributes().remove("attr1"); realm.users().get(user1Id).update(user1); user1 = realm.users().get(user1Id).toRepresentation(); assertEquals(2, user1.getAttributesAsListValues().size()); assertAttributeValue("value2user1", user1.getAttributesAsListValues().get("attr2")); assertAttributeValue("value4user1", user1.getAttributesAsListValues().get("attr3")); user1.getAttributes().clear(); realm.users().get(user1Id).update(user1); user1 = realm.users().get(user1Id).toRepresentation(); assertNull(user1.getAttributes()); }
/** * Update the user * * @param id User id * @param rep * @return */ @Path("{id}") @PUT @Consumes(MediaType.APPLICATION_JSON) public Response updateUser(final @PathParam("id") String id, final UserRepresentation rep) { auth.requireManage(); try { UserModel user = session.users().getUserById(id, realm); if (user == null) { throw new NotFoundException("User not found"); } Set<String> attrsToRemove; if (rep.getAttributes() != null) { attrsToRemove = new HashSet<>(user.getAttributes().keySet()); attrsToRemove.removeAll(rep.getAttributes().keySet()); } else { attrsToRemove = Collections.emptySet(); } if (rep.isEnabled() != null && rep.isEnabled()) { UsernameLoginFailureModel failureModel = session.sessions().getUserLoginFailure(realm, rep.getUsername().toLowerCase()); if (failureModel != null) { failureModel.clearFailures(); } } updateUserFromRep(user, rep, attrsToRemove, realm, session); adminEvent .operation(OperationType.UPDATE) .resourcePath(uriInfo) .representation(rep) .success(); if (session.getTransaction().isActive()) { session.getTransaction().commit(); } return Response.noContent().build(); } catch (ModelDuplicateException e) { return ErrorResponse.exists("User exists with same username or email"); } catch (ModelReadOnlyException re) { return ErrorResponse.exists("User is read only!"); } }