Реализовать динамическую область видимости в Spring Security OAuth

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

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

0 ответов

Другие вопросы по тегам