keycloak
公開メンバ関数 | 限定公開メンバ関数 | 限定公開変数類 | 非公開変数類 | 全メンバ一覧
org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector クラス
org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector の継承関係図
Inheritance graph
org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector 連携図
Collaboration graph

公開メンバ関数

 PermissionTicketAwareDecisionResultCollector (AuthorizationRequest request, PermissionTicketToken ticket, Identity identity, ResourceServer resourceServer, AuthorizationProvider authorization)
 
void onComplete ()
 
void onComplete (Result result)
 
void onComplete (ResourcePermission permission)
 
Collection< Permissionresults ()
 
void onError (Throwable cause)
 
void onDecision (DefaultEvaluation evaluation)
 
void onDecision (D evaluation)
 

限定公開メンバ関数

void onGrant (Permission grantedPermission)
 
void onComplete (Collection< Result > permissions)
 
void grantPermission (AuthorizationProvider authorizationProvider, List< Permission > permissions, ResourcePermission permission, Collection< Scope > grantedScopes, ResourceServer resourceServer, AuthorizationRequest request, Result result)
 
boolean isGranted (Result.PolicyResult policyResult)
 

限定公開変数類

final Map< ResourcePermission, Resultresults = new LinkedHashMap<>()
 

非公開変数類

final AuthorizationRequest request
 
PermissionTicketToken ticket
 
final Identity identity
 
ResourceServer resourceServer
 
final AuthorizationProvider authorization
 

詳解

著者
Pedro Igor

構築子と解体子

◆ PermissionTicketAwareDecisionResultCollector()

org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.PermissionTicketAwareDecisionResultCollector ( AuthorizationRequest  request,
PermissionTicketToken  ticket,
Identity  identity,
ResourceServer  resourceServer,
AuthorizationProvider  authorization 
)
inline
54  {
56  this.request = request;
57  this.ticket = ticket;
58  this.identity = identity;
61  }
final AuthorizationRequest request
Definition: PermissionTicketAwareDecisionResultCollector.java:48
final Identity identity
Definition: PermissionTicketAwareDecisionResultCollector.java:50
PermissionTicketToken ticket
Definition: PermissionTicketAwareDecisionResultCollector.java:49
final AuthorizationProvider authorization
Definition: PermissionTicketAwareDecisionResultCollector.java:52
ResourceServer resourceServer
Definition: PermissionTicketAwareDecisionResultCollector.java:51

関数詳解

◆ grantPermission()

void org.keycloak.authorization.policy.evaluation.DecisionPermissionCollector.grantPermission ( AuthorizationProvider  authorizationProvider,
List< Permission permissions,
ResourcePermission  permission,
Collection< Scope grantedScopes,
ResourceServer  resourceServer,
AuthorizationRequest  request,
Result  result 
)
inlineprotectedinherited
139  {
140  Set<String> scopeNames = grantedScopes.stream().map(Scope::getName).collect(Collectors.toSet());
141  Resource resource = permission.getResource();
142 
143  if (resource != null) {
144  permissions.add(createPermission(resource, scopeNames, permission.getClaims(), request));
145  } else if (!grantedScopes.isEmpty()) {
146  ResourceStore resourceStore = authorizationProvider.getStoreFactory().getResourceStore();
147 
148  resourceStore.findByScope(grantedScopes.stream().map(Scope::getId).collect(Collectors.toList()), resourceServer.getId(), resource1 -> permissions.add(createPermission(resource, scopeNames, permission.getClaims(), request)));
149 
150  if (permissions.isEmpty()) {
151  permissions.add(createPermission(null, scopeNames, permission.getClaims(), request));
152  }
153  }
154  }
Permission createPermission(Resource resource, Set< String > scopes, Map< String, Set< String >> claims, AuthorizationRequest request)
Definition: DecisionPermissionCollector.java:156
StoreFactory getStoreFactory()
Definition: AuthorizationProvider.java:109
final ResourceServer resourceServer
Definition: DecisionPermissionCollector.java:45
final List< Permission > permissions
Definition: DecisionPermissionCollector.java:47
final AuthorizationProvider authorizationProvider
Definition: DecisionPermissionCollector.java:44
final AuthorizationRequest request
Definition: DecisionPermissionCollector.java:46
List< Resource > findByScope(List< String > id, String resourceServerId)

◆ isGranted()

boolean org.keycloak.authorization.policy.evaluation.AbstractDecisionCollector.isGranted ( Result.PolicyResult  policyResult)
inlineprotectedinherited
98  {
99  Policy policy = policyResult.getPolicy();
100  DecisionStrategy decisionStrategy = policy.getDecisionStrategy();
101 
102  switch (decisionStrategy) {
103  case AFFIRMATIVE:
104  for (Result.PolicyResult decision : policyResult.getAssociatedPolicies()) {
105  if (Effect.PERMIT.equals(decision.getEffect())) {
106  return true;
107  }
108  }
109  return false;
110  case CONSENSUS:
111  int grantCount = 0;
112  int denyCount = policy.getAssociatedPolicies().size();
113 
114  for (Result.PolicyResult decision : policyResult.getAssociatedPolicies()) {
115  if (decision.getEffect().equals(Effect.PERMIT)) {
116  grantCount++;
117  denyCount--;
118  }
119  }
120 
121  return grantCount > denyCount;
122  default:
123  // defaults to UNANIMOUS
124  for (Result.PolicyResult decision : policyResult.getAssociatedPolicies()) {
125  if (Effect.DENY.equals(decision.getEffect())) {
126  return false;
127  }
128  }
129  return true;
130  }
131  }

◆ onComplete() [1/4]

void org.keycloak.authorization.policy.evaluation.DecisionPermissionCollector.onComplete ( Result  result)
inlineinherited
56  {
57  ResourcePermission permission = result.getPermission();
58  Resource resource = permission.getResource();
59  List<Scope> requestedScopes = permission.getScopes();
60 
61  if (Effect.PERMIT.equals(result.getEffect())) {
62  grantPermission(authorizationProvider, permissions, permission, resource != null ? resource.getScopes() : requestedScopes, resourceServer, request, result);
63  } else {
64  Set<Scope> grantedScopes = new HashSet<>();
65  Set<Scope> deniedScopes = new HashSet<>();
66  List<Result.PolicyResult> userManagedPermissions = new ArrayList<>();
67  boolean resourceGranted = false;
68  boolean anyDeny = false;
69 
70  for (Result.PolicyResult policyResult : result.getResults()) {
71  Policy policy = policyResult.getPolicy();
72  Set<Scope> policyScopes = policy.getScopes();
73 
74  if (isGranted(policyResult)) {
75  if (isScopePermission(policy)) {
76  for (Scope scope : requestedScopes) {
77  if (policyScopes.contains(scope)) {
78  grantedScopes.add(scope);
79  }
80  }
81  } else if (isResourcePermission(policy)) {
82  grantedScopes.addAll(requestedScopes);
83  } else if (resource != null && resource.isOwnerManagedAccess() && "uma".equals(policy.getType())) {
84  userManagedPermissions.add(policyResult);
85  }
86  if (!resourceGranted) {
87  resourceGranted = policy.getResources().contains(resource);
88  }
89  } else {
90  if (isResourcePermission(policy)) {
91  if (!resourceGranted) {
92  deniedScopes.addAll(requestedScopes);
93  }
94  } else {
95  deniedScopes.addAll(policyScopes);
96  }
97  if (!anyDeny) {
98  anyDeny = true;
99  }
100  }
101  }
102 
103  // remove any scope denied from the list of granted scopes
104  grantedScopes.removeAll(deniedScopes);
105 
106  if (userManagedPermissions.isEmpty()) {
107  if (!resourceGranted && (grantedScopes.isEmpty() && !requestedScopes.isEmpty())) {
108  return;
109  }
110  } else {
111  for (Result.PolicyResult userManagedPermission : userManagedPermissions) {
112  grantedScopes.addAll(userManagedPermission.getPolicy().getScopes());
113  }
114 
115  if (grantedScopes.isEmpty() && !resource.getScopes().isEmpty()) {
116  return;
117  }
118 
119  anyDeny = false;
120  }
121 
122  if (anyDeny && grantedScopes.isEmpty()) {
123  return;
124  }
125 
126  grantPermission(authorizationProvider, permissions, permission, grantedScopes, resourceServer, request, result);
127  }
128  }
static boolean isScopePermission(Policy policy)
Definition: DecisionPermissionCollector.java:185
boolean isGranted(Result.PolicyResult policyResult)
Definition: AbstractDecisionCollector.java:98
final ResourceServer resourceServer
Definition: DecisionPermissionCollector.java:45
final List< Permission > permissions
Definition: DecisionPermissionCollector.java:47
final AuthorizationProvider authorizationProvider
Definition: DecisionPermissionCollector.java:44
final AuthorizationRequest request
Definition: DecisionPermissionCollector.java:46
static boolean isResourcePermission(Policy policy)
Definition: DecisionPermissionCollector.java:181
void grantPermission(AuthorizationProvider authorizationProvider, List< Permission > permissions, ResourcePermission permission, Collection< Scope > grantedScopes, ResourceServer resourceServer, AuthorizationRequest request, Result result)
Definition: DecisionPermissionCollector.java:139

◆ onComplete() [2/4]

void org.keycloak.authorization.policy.evaluation.AbstractDecisionCollector.onComplete ( ResourcePermission  permission)
inlineinherited

org.keycloak.authorization.Decision< D extends Evaluation >を実装しています。

82  {
83  Result result = results.get(permission);
84 
85  if (result != null) {
86  onComplete(result);
87  }
88  }
final Map< ResourcePermission, Result > results
Definition: AbstractDecisionCollector.java:35
void onComplete()
Definition: AbstractDecisionCollector.java:77

◆ onComplete() [3/4]

void org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.onComplete ( )
inline

org.keycloak.authorization.Decision< D extends Evaluation >を実装しています。

90  {
91  super.onComplete();
92 
93  if (request.isSubmitRequest()) {
94  StoreFactory storeFactory = authorization.getStoreFactory();
95  ResourceStore resourceStore = storeFactory.getResourceStore();
96  List<Permission> permissions = ticket.getPermissions();
97 
98  if (permissions != null) {
99  for (Permission permission : permissions) {
100  Resource resource = resourceStore.findById(permission.getResourceId(), resourceServer.getId());
101 
102  if (resource == null) {
103  resource = resourceStore.findByName(permission.getResourceId(), identity.getId(), resourceServer.getId());
104  }
105 
106  if (resource == null || !resource.isOwnerManagedAccess() || resource.getOwner().equals(identity.getId()) || resource.getOwner().equals(resourceServer.getId())) {
107  continue;
108  }
109 
110  Set<String> scopes = permission.getScopes();
111 
112  if (scopes.isEmpty()) {
113  scopes = resource.getScopes().stream().map(Scope::getName).collect(Collectors.toSet());
114  }
115 
116  if (scopes.isEmpty()) {
117  Map<String, String> filters = new HashMap<>();
118 
119  filters.put(PermissionTicket.RESOURCE, resource.getId());
120  filters.put(PermissionTicket.REQUESTER, identity.getId());
121  filters.put(PermissionTicket.SCOPE_IS_NULL, Boolean.TRUE.toString());
122 
123  List<PermissionTicket> tickets = authorization.getStoreFactory().getPermissionTicketStore().find(filters, resource.getResourceServer().getId(), -1, -1);
124 
125  if (tickets.isEmpty()) {
126  authorization.getStoreFactory().getPermissionTicketStore().create(resource.getId(), null, identity.getId(), resource.getResourceServer());
127  }
128  } else {
129  ScopeStore scopeStore = authorization.getStoreFactory().getScopeStore();
130 
131  for (String scopeId : scopes) {
132  Scope scope = scopeStore.findByName(scopeId, resourceServer.getId());
133 
134  if (scope == null) {
135  scope = scopeStore.findById(scopeId, resourceServer.getId());
136  }
137 
138  Map<String, String> filters = new HashMap<>();
139 
140  filters.put(PermissionTicket.RESOURCE, resource.getId());
141  filters.put(PermissionTicket.REQUESTER, identity.getId());
142  filters.put(PermissionTicket.SCOPE, scope.getId());
143 
144  List<PermissionTicket> tickets = authorization.getStoreFactory().getPermissionTicketStore().find(filters, resource.getResourceServer().getId(), -1, -1);
145 
146  if (tickets.isEmpty()) {
147  authorization.getStoreFactory().getPermissionTicketStore().create(resource.getId(), scope.getId(), identity.getId(), resource.getResourceServer());
148  }
149  }
150  }
151  }
152  }
153  }
154  }
final AuthorizationRequest request
Definition: PermissionTicketAwareDecisionResultCollector.java:48
final Identity identity
Definition: PermissionTicketAwareDecisionResultCollector.java:50
PermissionTicketToken ticket
Definition: PermissionTicketAwareDecisionResultCollector.java:49
PermissionTicketStore getPermissionTicketStore()
Scope findByName(String name, String resourceServerId)
List< Permission > getPermissions()
Definition: PermissionTicketToken.java:64
final AuthorizationProvider authorization
Definition: PermissionTicketAwareDecisionResultCollector.java:52
StoreFactory getStoreFactory()
Definition: AuthorizationProvider.java:109
ResourceServer resourceServer
Definition: PermissionTicketAwareDecisionResultCollector.java:51
PermissionTicket create(String resourceId, String scopeId, String requester, ResourceServer resourceServer)
final List< Permission > permissions
Definition: DecisionPermissionCollector.java:47
List< PermissionTicket > find(Map< String, String > attributes, String resourceServerId, int firstResult, int maxResult)
boolean isSubmitRequest()
Definition: AuthorizationRequest.java:181

◆ onComplete() [4/4]

void org.keycloak.authorization.policy.evaluation.AbstractDecisionCollector.onComplete ( Collection< Result permissions)
inlineprotectedinherited
94  {
95 
96  }

◆ onDecision() [1/2]

void org.keycloak.authorization.Decision< D extends Evaluation >.onDecision ( evaluation)
inherited

◆ onDecision() [2/2]

void org.keycloak.authorization.policy.evaluation.AbstractDecisionCollector.onDecision ( DefaultEvaluation  evaluation)
inlineinherited
38  {
39  Policy parentPolicy = evaluation.getParentPolicy();
40  ResourcePermission permission = evaluation.getPermission();
41 
42  if (parentPolicy != null) {
43  if (parentPolicy.equals(evaluation.getPolicy())) {
44  results.computeIfAbsent(permission, permission1 -> {
45  for (Result result : results.values()) {
46  Result.PolicyResult policyResult = result.getPolicy(parentPolicy);
47 
48  if (policyResult != null) {
49  Result newResult = new Result(permission1, evaluation);
50  Result.PolicyResult newPolicyResult = newResult.policy(parentPolicy);
51 
52  for (Result.PolicyResult associatePolicy : policyResult.getAssociatedPolicies()) {
53  newPolicyResult.policy(associatePolicy.getPolicy(), associatePolicy.getEffect());
54  }
55 
56  Map<String, Set<String>> claims = result.getPermission().getClaims();
57 
58  if (!claims.isEmpty()) {
59  permission1.addClaims(claims);
60  }
61 
62  return newResult;
63  }
64  }
65 
66  return null;
67  }).policy(parentPolicy);
68  } else {
69  results.computeIfAbsent(permission, p -> new Result(p, evaluation)).policy(parentPolicy).policy(evaluation.getPolicy(), evaluation.getEffect());
70  }
71  } else {
72  results.computeIfAbsent(permission, p -> new Result(p, evaluation)).setStatus(evaluation.getEffect());
73  }
74  }
final Map< ResourcePermission, Result > results
Definition: AbstractDecisionCollector.java:35

◆ onError()

void org.keycloak.authorization.policy.evaluation.DecisionPermissionCollector.onError ( Throwable  cause)
inlineinherited

org.keycloak.authorization.Decision< D extends Evaluation >を実装しています。

135  {
136  throw new RuntimeException("Failed to evaluate permissions", cause);
137  }

◆ onGrant()

void org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.onGrant ( Permission  grantedPermission)
inlineprotected
64  {
65  // Removes permissions (represented by {@code ticket}) granted by any user-managed policy so we don't create unnecessary permission tickets.
66  List<Permission> permissions = ticket.getPermissions();
67  Iterator<Permission> itPermissions = permissions.iterator();
68 
69  while (itPermissions.hasNext()) {
70  Permission permission = itPermissions.next();
71 
72  if (permission.getResourceId() == null || permission.getResourceId().equals(grantedPermission.getResourceId())) {
73  Set<String> scopes = permission.getScopes();
74  Iterator<String> itScopes = scopes.iterator();
75 
76  while (itScopes.hasNext()) {
77  if (grantedPermission.getScopes().contains(itScopes.next())) {
78  itScopes.remove();
79  }
80  }
81 
82  if (scopes.isEmpty()) {
83  itPermissions.remove();
84  }
85  }
86  }
87  }
PermissionTicketToken ticket
Definition: PermissionTicketAwareDecisionResultCollector.java:49
List< Permission > getPermissions()
Definition: PermissionTicketToken.java:64
final List< Permission > permissions
Definition: DecisionPermissionCollector.java:47

◆ results()

Collection<Permission> org.keycloak.authorization.policy.evaluation.DecisionPermissionCollector.results ( )
inlineinherited
130  {
131  return permissions;
132  }
final List< Permission > permissions
Definition: DecisionPermissionCollector.java:47

メンバ詳解

◆ authorization

final AuthorizationProvider org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.authorization
private

◆ identity

final Identity org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.identity
private

◆ request

final AuthorizationRequest org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.request
private

◆ resourceServer

ResourceServer org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.resourceServer
private

◆ results

final Map<ResourcePermission, Result> org.keycloak.authorization.policy.evaluation.AbstractDecisionCollector.results = new LinkedHashMap<>()
protectedinherited

◆ ticket

PermissionTicketToken org.keycloak.authorization.policy.evaluation.PermissionTicketAwareDecisionResultCollector.ticket
private

このクラス詳解は次のファイルから抽出されました: