introduced a claims processor result data shuttle
parent
2cfaa1c1d7
commit
de9f69e461
|
@ -0,0 +1,96 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright 2015 The MITRE Corporation
|
||||||
|
* and the MIT Kerberos and Internet Trust Consortium
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.mitre.uma.model;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data shuttle to return results of the claims processing service.
|
||||||
|
*
|
||||||
|
* @author jricher
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ClaimProcessingResult {
|
||||||
|
|
||||||
|
private boolean satisfied;
|
||||||
|
private Collection<Claim> unmatched;
|
||||||
|
private Policy matched;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an unmatched result. isSatisfied is false.
|
||||||
|
* @param unmatched
|
||||||
|
*/
|
||||||
|
public ClaimProcessingResult(Collection<Claim> unmatched) {
|
||||||
|
this.satisfied = false;
|
||||||
|
this.unmatched = unmatched;
|
||||||
|
this.matched = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a matched result. isSatisfied is true.
|
||||||
|
* @param matched
|
||||||
|
*/
|
||||||
|
public ClaimProcessingResult(Policy matched) {
|
||||||
|
this.satisfied = true;
|
||||||
|
this.matched = matched;
|
||||||
|
this.unmatched = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the satisfied
|
||||||
|
*/
|
||||||
|
public boolean isSatisfied() {
|
||||||
|
return satisfied;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param satisfied the satisfied to set
|
||||||
|
*/
|
||||||
|
public void setSatisfied(boolean satisfied) {
|
||||||
|
this.satisfied = satisfied;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the unmatched
|
||||||
|
*/
|
||||||
|
public Collection<Claim> getUnmatched() {
|
||||||
|
return unmatched;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param unmatched the unmatched to set
|
||||||
|
*/
|
||||||
|
public void setUnmatched(Collection<Claim> unmatched) {
|
||||||
|
this.unmatched = unmatched;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the matched
|
||||||
|
*/
|
||||||
|
public Policy getMatched() {
|
||||||
|
return matched;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param matched the matched to set
|
||||||
|
*/
|
||||||
|
public void setMatched(Policy matched) {
|
||||||
|
this.matched = matched;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ package org.mitre.uma.service;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import org.mitre.uma.model.Claim;
|
import org.mitre.uma.model.Claim;
|
||||||
|
import org.mitre.uma.model.ClaimProcessingResult;
|
||||||
import org.mitre.uma.model.Policy;
|
import org.mitre.uma.model.Policy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,8 +40,8 @@ public interface ClaimsProcessingService {
|
||||||
*
|
*
|
||||||
* @param claimsRequired the required claims to check against
|
* @param claimsRequired the required claims to check against
|
||||||
* @param claimsSupplied the supplied claims to test
|
* @param claimsSupplied the supplied claims to test
|
||||||
* @return the unmatched claims (if any), an empty set if the claims are satisfied, never null
|
* @return the result of the claims processing action
|
||||||
*/
|
*/
|
||||||
public Collection<Claim> claimsAreSatisfied(Collection<Policy> claimsRequired, Collection<Claim> claimsSupplied);
|
public ClaimProcessingResult claimsAreSatisfied(Collection<Policy> claimsRequired, Collection<Claim> claimsSupplied);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
import org.mitre.uma.model.Claim;
|
import org.mitre.uma.model.Claim;
|
||||||
|
import org.mitre.uma.model.ClaimProcessingResult;
|
||||||
import org.mitre.uma.model.Policy;
|
import org.mitre.uma.model.Policy;
|
||||||
import org.mitre.uma.service.ClaimsProcessingService;
|
import org.mitre.uma.service.ClaimsProcessingService;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -32,20 +33,20 @@ import org.springframework.stereotype.Service;
|
||||||
* @author jricher
|
* @author jricher
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Service("matchAllClaimsProcessor")
|
@Service("matchAllClaimsOnAnyPolicy")
|
||||||
public class MatchAllClaimsProcessor implements ClaimsProcessingService {
|
public class MatchAllClaimsOnAnyPolicy implements ClaimsProcessingService {
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.mitre.uma.service.ClaimsProcessingService#claimsAreSatisfied(java.util.Collection, java.util.Collection)
|
* @see org.mitre.uma.service.ClaimsProcessingService#claimsAreSatisfied(java.util.Collection, java.util.Collection)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Collection<Claim> claimsAreSatisfied(Collection<Policy> claimsRequired, Collection<Claim> claimsSupplied) {
|
public ClaimProcessingResult claimsAreSatisfied(Collection<Policy> claimsRequired, Collection<Claim> claimsSupplied) {
|
||||||
Collection<Claim> allUnmatched = new HashSet<>();
|
Collection<Claim> allUnmatched = new HashSet<>();
|
||||||
for (Policy policy : claimsRequired) {
|
for (Policy policy : claimsRequired) {
|
||||||
Collection<Claim> unmatched = checkIndividualClaims(policy.getClaimsRequired(), claimsSupplied);
|
Collection<Claim> unmatched = checkIndividualClaims(policy.getClaimsRequired(), claimsSupplied);
|
||||||
if (unmatched.isEmpty()) {
|
if (unmatched.isEmpty()) {
|
||||||
// we found something that's satisfied the claims, let's go with it!
|
// we found something that's satisfied the claims, let's go with it!
|
||||||
return unmatched;
|
return new ClaimProcessingResult(policy);
|
||||||
} else {
|
} else {
|
||||||
// otherwise add it to the stack to send back
|
// otherwise add it to the stack to send back
|
||||||
allUnmatched.addAll(unmatched);
|
allUnmatched.addAll(unmatched);
|
||||||
|
@ -53,7 +54,7 @@ public class MatchAllClaimsProcessor implements ClaimsProcessingService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// otherwise, tell the caller that we'll need some set of these fulfilled somehow
|
// otherwise, tell the caller that we'll need some set of these fulfilled somehow
|
||||||
return allUnmatched;
|
return new ClaimProcessingResult(allUnmatched);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Collection<Claim> checkIndividualClaims(Collection<Claim> claimsRequired, Collection<Claim> claimsSupplied) {
|
private Collection<Claim> checkIndividualClaims(Collection<Claim> claimsRequired, Collection<Claim> claimsSupplied) {
|
|
@ -39,6 +39,7 @@ import org.mitre.openid.connect.view.HttpCodeView;
|
||||||
import org.mitre.openid.connect.view.JsonEntityView;
|
import org.mitre.openid.connect.view.JsonEntityView;
|
||||||
import org.mitre.openid.connect.view.JsonErrorView;
|
import org.mitre.openid.connect.view.JsonErrorView;
|
||||||
import org.mitre.uma.model.Claim;
|
import org.mitre.uma.model.Claim;
|
||||||
|
import org.mitre.uma.model.ClaimProcessingResult;
|
||||||
import org.mitre.uma.model.PermissionTicket;
|
import org.mitre.uma.model.PermissionTicket;
|
||||||
import org.mitre.uma.model.ResourceSet;
|
import org.mitre.uma.model.ResourceSet;
|
||||||
import org.mitre.uma.service.ClaimsProcessingService;
|
import org.mitre.uma.service.ClaimsProcessingService;
|
||||||
|
@ -141,12 +142,12 @@ public class AuthorizationRequestEndpoint {
|
||||||
} else {
|
} else {
|
||||||
// claims weren't empty or missing, we need to check against what we have
|
// claims weren't empty or missing, we need to check against what we have
|
||||||
|
|
||||||
Collection<Claim> claimsUnmatched = claimsProcessingService.claimsAreSatisfied(rs.getPolicies(), ticket.getClaimsSupplied());
|
ClaimProcessingResult result = claimsProcessingService.claimsAreSatisfied(rs.getPolicies(), ticket.getClaimsSupplied());
|
||||||
|
|
||||||
// we need to downscope this based on the required set that was matched if it was matched
|
// we need to downscope this based on the required set that was matched if it was matched
|
||||||
|
|
||||||
if (claimsUnmatched.isEmpty()) {
|
if (result.isSatisfied()) {
|
||||||
// if the unmatched claims come back empty, by function contract that means we're happy and can issue a token
|
// the service found what it was looking for, issue a token
|
||||||
|
|
||||||
OAuth2Authentication o2auth = (OAuth2Authentication) auth;
|
OAuth2Authentication o2auth = (OAuth2Authentication) auth;
|
||||||
|
|
||||||
|
@ -175,7 +176,7 @@ public class AuthorizationRequestEndpoint {
|
||||||
rpClaims.addProperty("redirect_user", true);
|
rpClaims.addProperty("redirect_user", true);
|
||||||
rpClaims.addProperty("ticket", ticketValue);
|
rpClaims.addProperty("ticket", ticketValue);
|
||||||
JsonArray req = new JsonArray();
|
JsonArray req = new JsonArray();
|
||||||
for (Claim claim : claimsUnmatched) {
|
for (Claim claim : result.getUnmatched()) {
|
||||||
JsonObject c = new JsonObject();
|
JsonObject c = new JsonObject();
|
||||||
c.addProperty("name", claim.getName());
|
c.addProperty("name", claim.getName());
|
||||||
c.addProperty("friendly_name", claim.getFriendlyName());
|
c.addProperty("friendly_name", claim.getFriendlyName());
|
||||||
|
|
Loading…
Reference in New Issue