Skip to content

Instantly share code, notes, and snippets.

@strongant
Last active February 15, 2023 05:46
Show Gist options
  • Save strongant/3aa7c96a8a1a2ed7232b7ad28e6867ea to your computer and use it in GitHub Desktop.
Save strongant/3aa7c96a8a1a2ed7232b7ad28e6867ea to your computer and use it in GitHub Desktop.
keycloak 管理客户端资源
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.AuthorizationResource;
import org.keycloak.admin.client.resource.ClientResource;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.admin.client.resource.ResourceScopeResource;
import org.keycloak.representations.idm.ClientRepresentation;
import org.keycloak.representations.idm.authorization.ResourceRepresentation;
import java.util.List;
public class KeycloakClientAuthorization {
private static final String AUTH_SERVER_URL = "http://localhost:8080/auth";
private static final String REALM_NAME = "myrealm";
private static final String CLIENT_ID = "admin-cli";
private static final String CLIENT_SECRET = "myadminsecret";
private static final String CLIENT_NAME = "myclient";
private static final String NEW_RESOURCE_NAME = "nike";
private static final String NEW_RESOURCE_URI = "/nike/**";
private static final String NEW_RESOURCE_ATTRIBUTE = "aaa";
public static void main(String[] args) {
// 创建Keycloak客户端实例
Keycloak keycloak = KeycloakBuilder.builder()
.serverUrl(AUTH_SERVER_URL)
.realm(REALM_NAME)
.clientId(CLIENT_ID)
.clientSecret(CLIENT_SECRET)
.build();
// 获取RealmResource和ClientResource实例
RealmResource realmResource = keycloak.realm(REALM_NAME);
ClientResource clientResource = realmResource.clients().getByClientId(CLIENT_NAME);
// 获取Keycloak客户端的默认授权资源
AuthorizationResource authorizationResource = clientResource.authorization();
List<ResourceRepresentation> defaultResources = authorizationResource.resources().findByName("default");
ResourceRepresentation defaultResource = defaultResources.get(0);
// 创建新的授权资源
ResourceRepresentation newResource = new ResourceRepresentation();
newResource.setName(NEW_RESOURCE_NAME);
newResource.setUri(NEW_RESOURCE_URI);
authorizationResource.resources().create(newResource);
// 获取新创建的授权资源的ID
List<ResourceRepresentation> resources = authorizationResource.resources().findByName(NEW_RESOURCE_NAME);
String resourceId = resources.get(0).getId();
// 创建一个新的授权范围并绑定请求属性
ResourceScopeResource scopeResource = authorizationResource.scopes().resource(resourceId);
scopeResource.create(NEW_RESOURCE_ATTRIBUTE);
String attributeId = authorizationResource.resources().findByUri(NEW_RESOURCE_URI).get(0).getAttributes().get(NEW_RESOURCE_ATTRIBUTE);
// 打印结果
System.out.println("New resource created: " + NEW_RESOURCE_NAME);
System.out.println("New scope created: " + NEW_RESOURCE_ATTRIBUTE);
System.out.println("Attribute ID: " + attributeId);
// 更新授权资源名称
newResource.setName("new-nike");
authorizationResource.resources().resource(resourceId).update(newResource);
String updatedResourceName = authorizationResource.resources().resource(resourceId).toRepresentation().getName();
System.out.println("Resource updated: " + updatedResourceName);
// 删除授权资源
authorizationResource.resources().resource(resourceId).remove();
List<ResourceRepresentation> resourcesAfterDeletion = authorizationResource.resources().findByName(NEW_RESOURCE_NAME);
System.out.println("Resources after deletion: " + resourcesAfterDeletion);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment