Реализовать динамическую область в весенней безопасности OAuth - PullRequest
2 голосов
/ 10 ноября 2019

Я занимаюсь разработкой программного обеспечения для открытых банковских операций. Пользователь банка (также называемый клиентом) должен разрешить стороннему программному обеспечению вызывать банковские услуги, такие как снятие наличных и просмотр транзакций для одного из своих счетов, на ограниченную сумму. Для реализации этого подхода следует использовать протокол OAuth. Чтобы дать этим веб-службам разрешение на вызов, определены некоторые области, например, области действия для службы лицензий на снятие средств и области просмотра службы транзакций. Важно то, что эти разрешения не должны предоставляться всем учетным записям пользователей. Клиент увидит список своих аккаунтов на странице подтверждения. учетные записи должны быть выбраны. Пользователь разрешит сторонней системе отозвать или просмотреть транзакцию. Если объем, запрошенный сторонней системой, включает снятие наличных, он также должен включать сумму на странице подтверждения для каждого аккаунта. Есть ли списки счетов и их объем? мы не можем определить эти области раньше, потому что каждый пользователь имеет свою учетную запись.

enter image description here Если учетная запись и сумма не входят в сферу действия, как их получить и сохранить на странице подтверждения после подтверждения пользователем? Я изменил страницу подтверждения, чтобы показать список учетных записей для решения этой проблемы, затем попытался ожидать сохранения этих учетных записей в таблице утверждения, но, очевидно, в классе 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 для сохранения всех областей. Я думаю, что я, возможно, неправильно понял концепцию

...