Step: Create a Custom Admin Role
POST {{apiPath}}/v1/environments/{{envID}}/roles
The POST {{apiPath}}/v1/environments/{{envID}}/roles request creates a new custom role with the permissions specified in the request body. This request requires at least one permission ID in the permissions property list. You’ll need to have the permissions shown to create a custom role. These permissions are associated with the predefined Custom Admin Role.
The permissions you assign will apply to the scope or scopes you specify for the applicableTo property.
The custom role you create can be assigned to other users, groups, Worker apps, or PingFederate Gateway instances in the specified environment.
Example Request
-
cURL
-
C#
-
Go
-
HTTP
-
Java
-
jQuery
-
NodeJS
-
Python
-
PHP
-
Ruby
-
Swift
curl --location --globoff '{{apiPath}}/v1/environments/{{envID}}/roles' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"name" : "App-Custom-Role",
"description" : "Custom Role for new app",
"applicableTo" : ["ENVIRONMENT"],
"canBeAssignedBy": [
{
"id" : "{{envAdmRole}}"
}
],
"permissions" : [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
}'
var options = new RestClientOptions("{{apiPath}}/v1/environments/{{envID}}/roles")
{
MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"""name"" : ""App-Custom-Role""," + "\n" +
@"""description"" : ""Custom Role for new app""," + "\n" +
@"""applicableTo"" : [""ENVIRONMENT""]," + "\n" +
@"""canBeAssignedBy"": [" + "\n" +
@" {" + "\n" +
@" ""id"" : ""{{envAdmRole}}""" + "\n" +
@" }" + "\n" +
@"]," + "\n" +
@"""permissions"" : [" + "\n" +
@" {" + "\n" +
@" ""id"": ""applications:read:application""" + "\n" +
@" }," + "\n" +
@" {" + "\n" +
@" ""id"": ""applications:update:application""" + "\n" +
@" }" + "\n" +
@"]" + "\n" +
@"}" + "\n" +
@"";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "{{apiPath}}/v1/environments/{{envID}}/roles"
method := "POST"
payload := strings.NewReader(`{
"name" : "App-Custom-Role",
"description" : "Custom Role for new app",
"applicableTo" : ["ENVIRONMENT"],
"canBeAssignedBy": [
{
"id" : "{{envAdmRole}}"
}
],
"permissions" : [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer {{accessToken}}")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
POST /v1/environments/{{envID}}/roles HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"name" : "App-Custom-Role",
"description" : "Custom Role for new app",
"applicableTo" : ["ENVIRONMENT"],
"canBeAssignedBy": [
{
"id" : "{{envAdmRole}}"
}
],
"permissions" : [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n\"name\" : \"App-Custom-Role\",\n\"description\" : \"Custom Role for new app\",\n\"applicableTo\" : [\"ENVIRONMENT\"],\n\"canBeAssignedBy\": [\n {\n \"id\" : \"{{envAdmRole}}\"\n }\n],\n\"permissions\" : [\n {\n \"id\": \"applications:read:application\"\n },\n {\n \"id\": \"applications:update:application\"\n }\n]\n}\n");
Request request = new Request.Builder()
.url("{{apiPath}}/v1/environments/{{envID}}/roles")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer {{accessToken}}")
.build();
Response response = client.newCall(request).execute();
var settings = {
"url": "{{apiPath}}/v1/environments/{{envID}}/roles",
"method": "POST",
"timeout": 0,
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{accessToken}}"
},
"data": JSON.stringify({
"name": "App-Custom-Role",
"description": "Custom Role for new app",
"applicableTo": [
"ENVIRONMENT"
],
"canBeAssignedBy": [
{
"id": "{{envAdmRole}}"
}
],
"permissions": [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
}),
};
$.ajax(settings).done(function (response) {
console.log(response);
});
var request = require('request');
var options = {
'method': 'POST',
'url': '{{apiPath}}/v1/environments/{{envID}}/roles',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
},
body: JSON.stringify({
"name": "App-Custom-Role",
"description": "Custom Role for new app",
"applicableTo": [
"ENVIRONMENT"
],
"canBeAssignedBy": [
{
"id": "{{envAdmRole}}"
}
],
"permissions": [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{{apiPath}}/v1/environments/{{envID}}/roles"
payload = json.dumps({
"name": "App-Custom-Role",
"description": "Custom Role for new app",
"applicableTo": [
"ENVIRONMENT"
],
"canBeAssignedBy": [
{
"id": "{{envAdmRole}}"
}
],
"permissions": [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/v1/environments/{{envID}}/roles');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n"name" : "App-Custom-Role",\n"description" : "Custom Role for new app",\n"applicableTo" : ["ENVIRONMENT"],\n"canBeAssignedBy": [\n {\n "id" : "{{envAdmRole}}"\n }\n],\n"permissions" : [\n {\n "id": "applications:read:application"\n },\n {\n "id": "applications:update:application"\n }\n]\n}');
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}
require "uri"
require "json"
require "net/http"
url = URI("{{apiPath}}/v1/environments/{{envID}}/roles")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
"name": "App-Custom-Role",
"description": "Custom Role for new app",
"applicableTo": [
"ENVIRONMENT"
],
"canBeAssignedBy": [
{
"id": "{{envAdmRole}}"
}
],
"permissions": [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
]
})
response = http.request(request)
puts response.read_body
let parameters = "{\n\"name\" : \"App-Custom-Role\",\n\"description\" : \"Custom Role for new app\",\n\"applicableTo\" : [\"ENVIRONMENT\"],\n\"canBeAssignedBy\": [\n {\n \"id\" : \"{{envAdmRole}}\"\n }\n],\n\"permissions\" : [\n {\n \"id\": \"applications:read:application\"\n },\n {\n \"id\": \"applications:update:application\"\n }\n]\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{apiPath}}/v1/environments/{{envID}}/roles")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
return
}
print(String(data: data, encoding: .utf8)!)
}
task.resume()
Example Response
{
"_links": {
"self": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/roles/ebb05620-780b-472c-9f70-d8546f14a032"
},
"environment": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
}
},
"id": "ebb05620-780b-472c-9f70-d8546f14a032",
"name": "App-Custom-Role",
"description": "Custom Role for new app",
"applicableTo": [
"ENVIRONMENT"
],
"permissions": [
{
"id": "applications:read:application"
},
{
"id": "applications:update:application"
}
],
"environment": {
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"type": "CUSTOM",
"canBeAssignedBy": [
{
"id": "29ddce68-cd7f-4b2a-b6fc-f7a19553b496"
}
]
}