#spring-security #sap #cloud-foundry #sap-cloud-platform #sap-cloud-sdk
#spring-безопасность #sap #cloud-foundry #sap-облачная платформа #sap-cloud-sdk
Вопрос:
Я использую SAP S / 4HANA Cloud SDK (S4SDK) в сочетании с моделью программирования облачных приложений (CAPM). У меня есть артефакты workflow и Fiori в Neo, которые используют службу S4SDK, запущенную в Cloud Foundry (CF). Затем служба S4SDK вызывает S / 4HANA (общедоступное) облако, используя системного пользователя. Я настроил принцип распространения с Neo на CF согласно следующей ссылке:
Основное распространение из Neo в среду Cloud Foundry
Я разрабатываю свой проект уже пару месяцев. Теперь пришло время настроить доступ на основе ролей к моим службам OData. Мне нужно убедиться, что у меня есть внутренняя проверка, чтобы убедиться, что только утверждающие могут установить статус моего запроса на «Одобрено», например.
Я планирую сделать это, объявив несколько служб OData в файле my-service.cds. Затем, используя spring-security, я предоставлю доступ к службе утверждающих только тем, у кого есть коллекция ролей утверждающих.
Я слежу за этим блогом:
Мой xs-security.json выглядит следующим образом:
{
"xsappname": "s4projectcreate",
"tenant-mode": "dedicated",
"description": "Security profile of called application",
"scopes": [
{
"name": "uaa.user",
"description": "UAA"
},
{
"name": "$XSAPPNAME.AdminApprove",
"description": "UAA"
},
{
"name": "$XSAPPNAME.RiskApprove",
"description": "UAA"
}
],
"role-templates": [
{
"name": "Token_Exchange",
"description": "UAA",
"scope-references": [
"uaa.user"
]
},
{
"name": "Admin_Approver",
"description": "Request Admin Approver",
"scope-references": [
"$XSAPPNAME.AdminApprove"
]
},
{
"name": "Risk_Approver",
"description": "Request Risk Approver",
"scope-references": [
"$XSAPPNAME.RiskApprove"
]
}
]
}
Я сделал следующие записи в своем spring-security.xml (в противном случае, согласно блогу):
<sec:intercept-url pattern="/odata/v2/ProjCreateApprover/**" access="#oauth2.hasScope('${xs.appname}.AdminApprove')" method="GET" />
<sec:intercept-url pattern="/odata/v2/**" access="isAuthenticated()" method="GET" />
Когда я захожу в CF cockpit (org. level) и перехожу в раздел Безопасность / роли, я могу создать новую коллекцию ролей и добавить в нее два шаблона ролей.
Затем я перехожу к конфигурации доверия, где я вижу разделы SCIA (он же SAP Cloud Identity) и ‘Neo’. Последнее я настроил, когда настраивал принцип распространения с Neo на CF. Я могу зайти в любую учетную запись и ввести свой адрес электронной почты пользователя. Затем я могу назначить свою коллекцию ролей пользователю (мне).
Проблема в том, что все, что я здесь делаю, похоже, не позволяет мне пройти новую проверку безопасности. Я всегда получаю следующее сообщение при попытке получить доступ к защищенному пути: Доступ запрещенaccess_denied
Как я должен назначить эту роль? Использую ли я адрес электронной почты, потому что обычно это идентификатор в CF? Должен ли я что-то делать на уровне пространства или даже приложения? Нужно ли мне повторно привязывать службу XSUAA или что-то в этомроде?
Я тестирую в браузере. Если у меня еще нет сеанса, это заставляет меня войти в систему. Незащищенная служба по-прежнему работает нормально.
ПРИЛОЖЕНИЕ: Вот полезная нагрузка JWT. Похоже, у меня действительно есть области из роли:
{
"jti": "aa4f13c4c456429ab7d7f**218b1ef86",
"ext_attr": {
"enhancer": "XSUAA",
"zdn": "test**n"
},
"given_name": "P0000**",
"xs.user.attributes": {},
"family_name": "unknown.org",
"sub": "123526eb-fda8-49cf-a507-506**d28efba",
"scope": [
"s4projectcreate!t23.AdminApprove",
"openid",
"s4projectcreate!t23.RiskApprove",
"uaa.user"
],
"client_id": "sb-s4projectcreate!t23",
"cid": "sb-s4projectcreate!t23",
"azp": "sb-s4projectcreate!t23",
"grant_type": "urn:ietf:params:oauth:grant-type:saml2-bearer",
"user_id": "1235**eb-fda8-49cf-a507-506b8d28efba",
"origin": "httpsap1.hana.ondemand.comc3d8**a55",
"user_name": "p0000**",
"email": "P0000**@unknown.org",
"rev_sig": "8f**7376",
"iat": 1552347533,
"exp": 1552390733,
"iss": "http://test**n.localhost:8080/uaa/oauth/token",
"zid": "382217ca-6332-4b03-85ee-8f**85fd903a",
"aud": []
}
Комментарии:
1. В SAP Cloud Identity идентификатором пользователя по умолчанию должен быть адрес электронной почты. Можете ли вы проверить, содержит ли ваш JWT соответствующие области? Вы можете достичь этого, создав небольшую службу, которая использует AuthTokenAccessor и возвращает текущий токен.
2. Спасибо, я добавил полезную нагрузку JWT в текст вопроса. Похоже, у меня действительно есть области, и я был удивлен, что идентификатор пользователя на самом деле является p-номером, я думаю, потому что он был распространен из neo
3. Несколько комментариев к вашим вопросам: 1. Чтобы сделать недействительным JWT, вам нужно предоставить конечную точку выхода в маршрутизаторе, которая делает недействительным токен. Я написал, как это сделать в этой главе книги: s3-eu-west-1.amazonaws.com/gxmedia.galileo-press.de/leseproben /…
4. 2. Вы можете добавить области в AppRouter, чтобы выполнить проверку авторизации первого уровня. Однако во многих приложениях вы будете работать с авторизациями более детализированным образом внутри микросервиса. Кроме того, вы все равно должны защищать свои микросервисы, поскольку в противном случае они не защищены в Интернете. Это также обсуждается в этой главе книги: s3-eu-west-1.amazonaws.com/gxmedia.galileo-press.de/leseproben /…
5. Для дальнейшего изучения: 1. Поскольку JWT содержит область видимости, не могли бы вы проверить свой
cf env
и убедиться, что xsappname указано правильно? 2. Какой код ошибки http вы на самом деле получаете, это 401 или 403? 3. Что касается (2), работает ли это только с включенной аутентификацией, т. Е. Без проверки области действия, но с действительным аутентифицированным пользователем на внутреннем микросервисе? Спасибо.
Ответ №1:
перейдите на облачную платформу sap, внутри вашего субсчета вы получите доверительное управление, просто включите его. вы увидите ссылку на свою роль ниже, выполнив это, вы получите разрешение на доступ к сервису.