我正在开发一种开放式银行软件,银行用户(也称为客户)必须允许第三方软件以有限的金额调用银行服务,例如提取现金和查看他的一个帐户的交易。要实现此方法,应使用 OAuth 协议。为了授予这些 Web 服务调用权限,定义了一些范围,例如撤销许可服务的范围和查看交易服务的范围。重要的是,不应将这些权限授予所有用户的帐户。客户将在批准页面上看到他的帐户列表。帐户应该是可选择的。用户将允许第三方系统撤回或查看交易。如果第三方系统要求的范围包括提现,它还应包括每个帐户的批准页面上的金额。帐户列表及其金额是否在范围内?我们之前无法定义这些范围,因为每个用户都有不同的帐户。
如果账户和金额不在范围内,用户确认后如何在审批页面获取和保存?我更改了批准页面以显示帐户列表以解决此问题,然后试图将这些帐户存储在 Approval 表中,但显然在 ApprovalStoreUserApprovalHandler 类中 updateAfterApproval 方法仅过滤和存储先前定义的范围参数
public AuthorizationRequest updateAfterApproval(AuthorizationRequest authorizationRequest,
Authentication userAuthentication) {
// Get the approved scopes
Set<String> requestedScopes = authorizationRequest.getScope();
Set<String> approvedScopes = new HashSet<String>();
Set<Approval> approvals = new HashSet<Approval>();
Date expiry = computeExpiry();
// Store the scopes that have been approved / denied
Map<String, String> approvalParameters = authorizationRequest.getApprovalParameters();
for (String requestedScope : requestedScopes) {
String approvalParameter = scopePrefix + requestedScope;
String value = approvalParameters.get(approvalParameter);
value = value == null ? "" : value.toLowerCase();
if ("true".equals(value) || value.startsWith("approve")) {
approvedScopes.add(requestedScope);
approvals.add(new Approval(userAuthentication.getName(), authorizationRequest.getClientId(),
requestedScope, expiry, ApprovalStatus.APPROVED));
}
else {
approvals.add(new Approval(userAuthentication.getName(), authorizationRequest.getClientId(),
requestedScope, expiry, ApprovalStatus.DENIED));
}
}
approvalStore.addApprovals(approvals);
boolean approved;
authorizationRequest.setScope(approvedScopes);
if (approvedScopes.isEmpty() && !requestedScopes.isEmpty()) {
approved = false;
}
else {
approved = true;
}
authorizationRequest.setApproved(approved);
return authorizationRequest;
}
我想到的一种方法是自定义一个 UserApprovalHandler 来保存所有范围。我想我可能完全误解了这个概念