Ограничение доступа к веб-сервисам для пользователей Портала
Glossary Item Box
Общие сведения
Портал — это компонент платформы Creatio, основная цель которого — реализовать процесс самообслуживания клиентов и партнеров вашей компании. Также портал можно использовать для организации работы внутренних пользователей, если необходим ограниченный доступ к функциональности основного приложения.
Основной сценарий использования портала — предоставить доступ большому количеству внешних по отношению к организации пользователей к ограниченному количеству данных из системы. Для решения таких задач возникает потребность управлять тем, какие пользователи (портальные или пользователи компании) имеют доступ к веб-сервисам приложения.
Данная статья актуальна для версии системы 7.13.2 и новее.
Создание конфигурационного веб-сервиса подробно описано в статье "Разработка и вызов конфигурационного сервиса".
Префиксы маршрутов конфигурационных веб-сервисов
Для управления доступом к веб-сервисам приложения в Creatio реализован механизм префиксов маршрута. Используя определеннные ServiceRoute атрибуты класса сервиса, можно задать необходимый префикс маршрута (табл. 1).
Табл. 1. — Префиксы маршрутов конфигурационных веб-сервисов
Доступ | Атрибут | Префикс маршрута | Пример кода |
---|---|---|---|
Только для пользователей Портала самообслуживания | SspServiceRoute | /ssp |
[ServiceContract] [SspServiceRoute] public class SspOnlyService : BaseService { } Пример вызова ~/ssp/rest/SspOnlyService ~/ssp/soap/SspOnlyService |
Только для внутренних пользователей |
DefaultServiceRoute или не указывать ни один ServiceRoute атрибут |
отсутствует |
[ServiceContract] public class InternalService : BaseService { } или [ServiceContract] [DefaultServiceRoute] public class InternalService : BaseService { } Пример вызова ~/rest/InternalService ~/soap/InternalService |
И для внутренних пользователей и для Портала |
одновременно атрибуты DefaultServiceRoute и SspServiceRoute |
/ssp или отсутствует |
[ServiceContract] [DefaultServiceRoute] [SspServiceRoute] public class CommonService : BaseService { } Пример вызова ~/rest/CommonService ~/soap/CommonService ~/ssp/rest/CommonService ~/ssp/soap/CommonService |
атрибут ServiceRoute с указанием префикса (например, "custom") [ServiceRoute("custom")] |
произвольный префикс маршрута сервиса |
[ServiceContract] [ServiceRoute("custom")] public class CustomPrefixService : BaseService { } Пример вызова ~/custom/rest/CustomPrefixService ~/custom/soap/CustomPrefixService |
Допустимо использовать одновременно несколько атрибутов ServiceRoute, SspServiceRoute и DefaultServiceRoute. В результате будут созданы маршруты для сервиса со всеми вариантами префиксов.
Ограничение доступа портальных пользователей к внутреннему API
Если пользователь портала (SspUserConnection) обратится к сервису по маршруту без префикса “/ssp”, сервис вернет в ответ страницу с кодом 403 (Forbidden).
Ограничение доступа внутренних пользователей к портальному API
Если внутренний пользователь приложения (UserConnection) обратится к сервису по маршрутус префиксом “/ssp”, сервис вернет в ответ страницу с кодом 403 (Forbidden).
Изменение доступа к базовому сервису
В приложении существует набор базовых сервисов, доступ к которым есть только у внутренних пользователей.
Для изменеия доступа к базовому сервису необходимо:
- В пользовательском пакете создать сервис с настройкой доступа для портальных пользователей.
- Добавить для него те методы базового сервиса, которые должны быть доступны для портальных пользователей.
- Изменить пользовательские или расширить базовые клиентские схемы, изменив вызов базового сервиса на вызов созданного сервиса (см. шаг 1).
- Скомпилировать конфигурацию.
Пример исходного кода сервиса, который расширяет доступ к базовому сервису ActivityUtilService:
namespace Terrasoft.Configuration { using System; using System.IO; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; using Terrasoft.Configuration.FileUpload; using Terrasoft.Core.Factories; using Terrasoft.Web.Common; using Terrasoft.Web.Common.ServiceRouting; [ServiceContract] // Сервис доступен и для внутренних пользователей и для Портала. [DefaultServiceRoute] [SspServiceRoute] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class PartnerActivityUtilService: BaseService { // Базовый сервис, доступ к которому необходимо расширирть. private static readonly ActivityUtilService _baseService = new ActivityUtilService(); [OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] public Guid CreateActivityFileEntity(JsonActivityFile jsonActivityFile) { return _baseService.CreateActivityFileEntity(jsonActivityFile); } [OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] public Guid CreateFileEntity(JsonEntityFile jsonEntityFile) { return _baseService.CreateFileEntity(jsonEntityFile); } } }
ServiceStack сервисы ядра
Методы сервисов ServiceStack ядра (DataService, ManagerService и другие) по умолчанию доступны только для внутренних пользователей.
Для того, чтобы какой-то из методов был доступен также и на Портале, необходимо пометить такой метод атрибутом SspServiceAccess - в этом случае метод будет иметь дополнительный маршрут с префиксом вида ~/DataService/ssp/…
Если нужно, чтобы логика метода отличалась для Портала, необходимо создать новый сервис, указав для него атрибут SspServiceAccess, в конструктор которого передать имя оригинального метода. Например:
[SspServiceAccess(nameof(SelectQuery))] public class SspSelectQuery : SelectQuery { }
создает контракт, метод которого будет зарегистрирован по пути
~/DataService/ssp/SelectQuery.
Доступ к методам ServiceStack с префиксом “ssp” запрещен внутренним пользователям, а к методам ServiceStack без префикса “ssp” - пользователям портала.