logo

[ELMA3] Создание собственных глобальный настроек для модуля

В статье приведен пример создания глобальных настроек для доступа в модуль. В данном примере реализован пункт меню модуля, который в зависимости от прав доступа будет отображаться или скрываться. Даже если пользователь получит прямую ссылку на страницу Вашего модуля – доступ будет запрещен, о чем свидетельствует сообщение о нехватке прав.

Пример отображения данных

Рис. 1. Доступ к модулю в глобальных настройках доступа

Методы интерфейса IModuleAccessPermissionProvider

/// <summary>
/// Получить словарь из значений "Идентификатор модуля->Привилегия доступа к модулю"
/// </summary>
/// <returns></returns>
Dictionary<string, Permission> GetModuleAccessPermissions();

Методы интерфейса IPermissionProvider

/// <summary>
/// Получить список привилегий
/// </summary>
/// <returns></returns>
IEnumerable<Permission> GetPermissions();

/// <summary>
/// Получить информацию о назначении привилегий ролям по умолчанию
/// </summary>
/// <returns></returns>
IEnumerable<PermissionStereotype> GetPermissionStereotypes();

Пример реализации интерфейсов

[Component]
public class ModuleAccessPermission : IModuleAccessPermissionProvider, IPermissionProvider
{
    public const string Module = __ModuleInfo.ModuleId;

    public static string ModuleName = SR.M("Ваш модуль");

    /// <summary>
    /// Идентификатор для "Доступ к Вашему модулю"
    /// </summary>
    public const string ModuleAccessPermissionId = "{DC849F17-681F-45d9-8C06-C017283BE766}";

    /// <summary>
    /// Доступ к Вашему модулю
    /// </summary>
    public static readonly Permission ModulePermissionAccess =
        new Permission(ModuleAccessPermissionId,
                        SR.M("Доступ к Вашему модулю"),
                        SR.M("Возможность работы с модулем"),
                        ModuleName,
                        moduleUid: Module
                        //Можно добавить ,readOnly: true - тогда в данной привилегии будет только указанная группа.
                        );

        
    /// <summary>
    /// Получить словарь из значений "Идентификатор модуля->Привилегия доступа к модулю"
    /// </summary>
    /// <returns></returns>
    public Dictionary<string, Permission> GetModuleAccessPermissions()
    {
        return new Dictionary<string, Permission> { { Module, ModulePermissionAccess } };
    }

    /// <summary>
    /// Получить список привилегий
    /// </summary>
    /// <returns></returns>
    public IEnumerable<Permission> GetPermissions()
    {
        return new[]
                    {
                        ModulePermissionAccess
                    };
    }

    /// <summary>
    /// Получить информацию о назначении привилегий ролям по умолчанию
    /// </summary>
    /// <returns></returns>
    public IEnumerable<PermissionStereotype> GetPermissionStereotypes()
    {
        return new[]
		{
			new PermissionStereotype(
				new[] 
                {
                    ModulePermissionAccess
				},
				SecurityConstants.AdminGroupDescriptor)
		};
    }

    public List<string> LocalizedItemsNames
    {
        get { return null; }
    }

    public List<string> LocalizedItemsDescriptions
    {
        get { return null; }
    }

    public List<string> LocalizedItemsCategories
    {
        get { return null; }
    }
}

В данном примере представлена реализация доступа к модулю (отображается или скрывается соответствующий пункт меню в зависимости от прав доступа). Как создать свой пункт меню, Вы можете прочитать в данной статье.

После активации модуля в глобальных настройках доступа появится раздел с Вашими привилегиями. Для применения привилегий можно воспользоваться двумя способами:

  1. Навесить атрибут с привилегией на контроллер или метод контроллера.
  2. Проверить привилегии в отдельных методах/представлениях.

Пример кода контроллера с атрибутом:

public class HomeController : BPMController
{
    [ContentItem]
    [Permission(ModuleAccessPermission.ModuleAccessPermissionId)]
    public ActionResult ViewItem()
    {
        return View("View");
    }
}

Пример проверки привилегий в методах/представлениях:

if (SecurityService.HasPermission(UserManager.Instance.GetCurrentUser(),
    ModuleAccessPermission.ModulePermissionAccess))
{
    //Ваш код
}

Ссылки на элементы API

  • IModuleAccessPermissionProvider (для версий 3.13, 3.15, 4.0);
  • IPermissionProvider (для версий 3.13, 3.15, 4.0).

Прикрепленные файлы