{
  "allowRemoteResourceManagement": true,
  "policyEnforcementMode": "ENFORCING",
  "resources": [
    {
      "name": "User Profile Resource",
      "uri": "/profile",
      "type": "http://photoz.com/profile",
      "scopes": [
        {
          "name": "urn:photoz.com:scopes:profile:view"
        }
      ]
    },
    {
      "name": "Album Resource",
      "uri": "/album/*",
      "type": "http://photoz.com/album",
      "scopes": [
        {
          "name": "urn:photoz.com:scopes:album:view"
        },
        {
          "name": "urn:photoz.com:scopes:album:delete"
        },
        {
          "name": "urn:photoz.com:scopes:album:create"
        }
      ]
    },
    {
      "name": "Admin Resources",
      "uri": "/admin/*",
      "type": "http://photoz.com/admin",
      "scopes": [
        {
          "name": "urn:photoz.com:scopes:album:admin:manage"
        }
      ]
    }
  ],
  "policies": [
    {
      "name": "Only Owner Policy",
      "description": "Defines that only the resource owner is allowed to do something",
      "type": "rules",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "mavenArtifactVersion": "${project.version}",
        "mavenArtifactId": "photoz-authz-policy",
        "sessionName": "MainOwnerSession",
        "mavenArtifactGroupId": "org.keycloak",
        "moduleName": "PhotozAuthzOwnerPolicy",
        "scannerPeriod": "1",
        "scannerPeriodUnit": "Hours"
      }
    },
    {
      "name": "Any Admin Policy",
      "description": "Defines that adminsitrators can do something",
      "type": "role",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "roles": "[{\"id\":\"admin\",\"required\":true}]"
      }
    },
    {
      "name": "Any User Policy",
      "description": "Defines that only users from well known clients are allowed to access",
      "type": "role",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "roles": "[{\"id\":\"user\"},{\"id\":\"manage-albums\",\"required\":true}]"
      }
    },
    {
      "name": "Only From a Specific Client Address",
      "description": "Defines that only clients from a specific address can do something",
      "type": "js",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "code": "var contextAttributes = $evaluation.getContext().getAttributes();\n\nif (contextAttributes.containsValue('kc.client.network.ip_address', '127.0.0.1')) {\n    $evaluation.grant();\n}"
      }
    },
    {
      "name": "Administration Policy",
      "description": "Defines that only administrators from a specific network address can do something.",
      "type": "aggregate",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "applyPolicies": "[\"Only From a Specific Client Address\",\"Any Admin Policy\"]"
      }
    },
    {
      "name": "Only Owner and Administrators Policy",
      "description": "Defines that only the resource owner and administrators can do something",
      "type": "aggregate",
      "logic": "POSITIVE",
      "decisionStrategy": "AFFIRMATIVE",
      "config": {
        "applyPolicies": "[\"Administration Policy\",\"Only Owner Policy\"]"
      }
    },
    {
      "name": "Only From @keycloak.org or Admin",
      "description": "Defines that only users from @keycloak.org",
      "type": "js",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "code": "var context = $evaluation.getContext();\nvar identity = context.getIdentity();\nvar attributes = identity.getAttributes();\nvar email = attributes.getValue('email').asString(0);\n\nif (identity.hasRole('admin') || email.endsWith('@keycloak.org')) {\n    $evaluation.grant();\n}"
      }
    },
    {
      "name": "Album Resource Permission",
      "description": "General policies that apply to all album resources.",
      "type": "resource",
      "logic": "POSITIVE",
      "decisionStrategy": "AFFIRMATIVE",
      "config": {
        "defaultResourceType": "http://photoz.com/album",
        "default": "true",
        "applyPolicies": "[\"Any User Policy\",\"Administration Policy\"]"
      }
    },
    {
      "name": "Admin Resource Permission",
      "description": "General policy for any administrative resource.",
      "type": "resource",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "defaultResourceType": "http://photoz.com/admin",
        "default": "true",
        "applyPolicies": "[\"Administration Policy\"]"
      }
    },
    {
      "name": "View User Permission",
      "description": "Defines who is allowed to view an user profile",
      "type": "scope",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "applyPolicies": "[\"Only From @keycloak.org or Admin\"]",
        "scopes": "[\"urn:photoz.com:scopes:profile:view\"]"
      }
    },
    {
      "name": "Delete Album Permission",
      "description": "A policy that only allows the owner to delete his albums.",
      "type": "scope",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "applyPolicies": "[\"Only Owner and Administrators Policy\"]",
        "scopes": "[\"urn:photoz.com:scopes:album:delete\"]"
      }
    }
  ],
  "scopes": [
    {
      "name": "urn:photoz.com:scopes:profile:view"
    },
    {
      "name": "urn:photoz.com:scopes:album:view"
    },
    {
      "name": "urn:photoz.com:scopes:album:create"
    },
    {
      "name": "urn:photoz.com:scopes:album:delete"
    },
    {
      "name": "urn:photoz.com:scopes:album:admin:manage"
    }
  ]
}