Управление ролями и пользователями на сайте

Смотреть видео

Роли определяют полномочия пользователя в системе. У каждого пользователя может быть несколько ролей. Назначением ролей заведует администратор системы.

Создание Ролей

Управление ролями осуществляется в меню Пользователи / Роли (/roles). Здесь расположена таблица Роли (roles).

Создание пользователей осуществляется в разделе Роли и пользователи / Пользователи (/members) кнопкой Создать пользователя.
При этом открывается модальное окно (форма registrationUserInRole), где необходимо указать логин, пароль, email и выбрать одну из имеющихся ролей для создаваемого пользователя.

В таблице as_users хранятся общие данные по пользователям (телефон, почта и т. д.).

Логин пользователя - латинскими малыми буквами без дефисов и пробелов (например, фамилия человека и инициалы, часто логином может служить e-mail).

Доступ в системе назначается на основании ролей, поэтому необходимо давать пользователю минимальный набор ролей, необходимый для работы этого пользователя.

Структура данных по пользователям

Таблица Пользователи

На странице Пользователи (/members) расположена таблица управления пользователями.

Для более детальной информации по людям используются Контакты (ctr_contacts), связь идет по username. Контакты привязаны к неким Контрагентам (ctr_contragents). И эти контрагенты уже привязаны к различным бизнес сущностям (например, поставщики, клиенты и т.д.).

Для аватара пользователя используется ресурс userImage.

Если при регистрации нового пользователя необходимо сразу помещать информацию о нём в Контакты, Контрагенты, и возможно еще и в специализированную таблицу (перечень поставщиков, клиентов, подрядчиков, либо партнеров и т.д.), то обработку этих вставок вам необходимо добавить в форму регистрации нового пользователя (registrationUserInRole).

Информационное окошко по пользователю

Из таблицы Пользователи в первом столбце (i) есть выход на модальное окошко userInfo. Здесь выводится аватар пользователя (ресурс userImage) и информация из as_users в кратком виде на просмотр.

Страница Мой профиль

На странице профиля (/user) выводится форма Управление пользователем (editProfile). Здесь есть возможность редактировать данные по пользователю из as_users.

Страница пользователя

На странице Пользователь (/member?username=...) выводится форма user с данными из as_users на просмотр, ресурсом userImage, а также перечнем всех ролей пользователя с возможностью редактирования (флажки).

Изменение принадлежности к ролям

Как правило страница с перечнем пользователей, а также страницы с информацией по отдельным пользователям доступна Администратору сайта. В его полномочиях изменять набор ролей, в которые входит пользователь.

Сделать это можно на странице пользователя на форме user. Одна из колонок представлена типом Флажки, в которую выбираются все имеющиеся в системе роли. Администратор выставляет флажки напротив выбранных ролей для конкретного пользователя.

Используются следующие системные хранимые процедуры:

  • Получение ролей пользователя с помощью aspnet_UsersInRoles_GetRolesForUser
  • Удаление роли с помощью aspnet_UsersInRoles_RemoveUsersFromRoles
  • Добавление роли с помощью aspnet_UsersInRoles_AddUsersToRoles

Отслеживание пользователей онлайн

На сайте можно показывать онлайн пользователь или нет.

Для этого используется разметка:

<div class="as-online" data-username="demo1"></div>

Пример использования также можно увидеть в таблице Пользователи.

  • По периоду (по умолчанию 30 сек) будет опрашиваться страница и обновлять эти элементы, если они присутствуют (т.е. вставляться значок с text-success или text-danger). Т.е. данная разметка принимает вид только значка без дополнительных элементов. Период можно изменить через настройку online.period в as.systemOptions.js 
  • Если необходимо принудительно вызвать запуск обновления статусов, то используйте JS функцию as.online.reInit(); (но с подгрузкой скрипта as.online.js)
  • Если поставить настройку online.disableCheck=true в as.systemoptions.js, то показ статуса будет отключен. 
as.sys.loadLib({
            jslink: as.options.jsLoadableURLFormat.format("as.online"),
            csslink: "",
            conditionObject: as.online,
            callback: function () {
                as.online.reInit();
            },
            isCacheable: true
});

Вы можете изменить вывод разметки элемента через функцию as.onlineGetOnlineMakeup: 

as.onlineGetOnlineMakeup = function(st){
  var s = "";
  return s;
}

Страница входа в систему

Страница входа сделана вне рамок движка рендеринга страниц (т.е. не через стандартную форму системы).
Вы можете добавить ссылки на Регистрацию и Восстановление пароля на странице.
Для этого используйте в глобальном CSS:
.regBtn, .forgotpasswordBtn{ display: inline-block !important;}


Кнопки будут ссылаться на страницу /reg и /forgot-password соответственно. Вам необходимо создать страницы под них и использовать компонент Форма.
Также вы можете добавить свою кастомную разметку через настройку с кодом LoginCustomMakeup (она будет добавлена перед кнопкой Войти).

Вы можете назначить класс для поля логина через настройку с кодом LoginInputCssClass.

Если передан URL параметр returnurl на страницу, то при успешном входе будет перенаправление на эту страницу (изначально работа страниц noaccess и
главной при отсутствии доступа перенаправляют на эту страницу с данным параметром).

Вы можете сделать кастомную разметку тела страницы /accountLogin через Lang метку в /langs / langValues с кодом LoginMakeup, partCode=login, в которой есть параметр {loginForm}.  После изменения метки, не забудьте сбрасывать общий кеш.

Пример: 

<div style="width: 500px; margin: 0 auto;">
  <h1><i class="fas fa-sign-in-alt mr-1"></i> Sign in</h1>
  <hr>
  {loginForm}
</div>

Также вы можете установить SQL коллбек falcon_afterLogin для выполнения некоторых действий после успешного входа пользователя в систему: 

CREATE OR ALTER PROCEDURE [dbo].falcon_afterLogin
	@parameters ExtendedDictionaryParameter READONLY,  -- userGuid, langID
	@username nvarchar(32)
AS
BEGIN
  exec as_print @str='falcon_afterLogin'

  -- SELECT 1 Msg, Result, RediectUrl
 select 1 Result, '' Msg, '' RedirectUrl

  -- SELECT 2 Outer commands
  select '' type
END

Дополнительные проверки пользователя при входе

Данную процедуру можно использовать для дополнительных проверок входа пользователя. Если в SELECT 1 вернуть Result=0, то пользователь не войдет под своим аккаунтом, при этом будет выведено сообщение Msg. Если задан RedirectUrl, то после успешного входа пользователь будет перенаправлен на данный URL. 

Есть возможность полностью заблокировать страницу /account/login (например, используя другие формы кастом формы входа). Для этого создайте в /settings  настройку DisableAccountLoginPage = 1 

Куда перенаправляется пользователь после входа?

При успешном входе применяются следующие правила (в порядке приоритета): 

1. Если есть процедура falcon_afterLogin с непустым RedirectUrl в SELECT 1, то пользователь переходит по указанному адресу после успешного входа 

2. Если есть у ролей пользователя страницы с галочкой Панель управления и В меню, то выбирается первая из них (минимальное значение Порядок в меню) для перехода после входа.

3. Переход на главную страницу. 

Нормализация логина пользователя при входе в систему

В некоторых случаях необходима нормализация логина, приведение к единому виду. Для этого используется процедура falcon_normalizeLogin. Она выполняется ДО проверки доступа по логину и паролю. На входе username, введенный пользователь. На выходе будет username, который будет проверяться системой для входа.

Вы можете ее использовать при регистрации в форме. Если подобная процедура существует, то она будет вызываться и при входе в систему для обработки входящего логина.

CREATE PROCEDURE [dbo].falcon_normalizeLogin @login nvarchar(128)
AS BEGIN
    select lower(@login)
END
 Процедура на вход получает @login и возвращает 1 строковое значение в SELECT.

Вход и регистрация через социальные сети

На странице входа можно реализовать возможность входа и регистрации через социальные сети. Для этого используйте сервис uLogin (действий на внешнем сервисе не требуется выполнять).

Для этого необходимо реализовать следующие процедуры:

Настройка параметров виджета социальных сетей

CREATE procedure [dbo].[user_getSocialSettings]
AS
BEGIN
     SELECT 1 [Enabled], 'panel' Display, 'classic' Theme,
         'first_name,last_name,email' Fields,
         'facebook,instagram,vkontakte,odnoklassniki' Providers,
         'crm' RegRole, 'soc-{email}' UsernameFormat -- uid, email

END

Важные параметры:

  • Enabled. Если Enabled=1, то доступна возможность регистрации через социальные сети.
  • RegRole - указывает, какая роль будет добавлена новым пользователям, зарегистрированным через социальные сети.
  • UsernameFormat - определяет как будет формироваться имя пользователя на основе данных из социальной сети. Можно использовать 2 переменных {email} и {uid}.

Настройка кастомной процедуры создания пользователя (необязательная)

Данная процедура вызывается после создания системного пользователя и назначения ему роли RegRole. Ее можно использовать для создания дополнительных объектов в базе и подготовки письма.

CREATE PROCEDURE[dbo].[user_createSocialUser]
     @username nvarchar(128), @role nvarchar(64), @email nvarchar(128), @firstName nvarchar(128), @lastName nvarchar(128), @network nvarchar(128), @uid nvarchar(128), @verifiedEmail nvarchar(128), @url nvarchar(256)=''


  -- ВАЖНО. Параметр добавился 06.11.19
AS BEGIN
   -- создание дополнительных объектов
   SELECT 1 Result, '' Msg, 'Регистрация' EmailSubject,
       @username + ' - ' + @role + ' - ' + @email + ' - ' + @firstName + ' - ' + @lastName + ' - '+ @network + ' - ' + @uid + ' - ' + @verifiedEmail EmailBody

END

В параметре @url передается исходный адрес страницы, например, /account/login/supplier (чтобы можно было регистрировать пользователей под разные роли) исходя из URL.
Выходная модель содержит стандартные Result (1 если все хорошо) и Msg (текст ошибки), а также EmailBody и EmailSubject.
Письмо отправляется только если EmailBody непустое.

Примечание
Для регистрации пользователей для разных ролей, необходимо видоизменять ссылку, например:
/account/login/supplier
/account/login/customer

В итоге этот адрес передается в параметре @url в процедуру user_createSocialUser. В ней вы можете сравнить url и назначить соответствующую роль.
ВАЖНО. Никогда не назначайте роль беря название прямо из параметра!!! (в него могут передать все что угодно, например значение admin)

Отслеживание действий пользователя

В таблицу as_trace автоматически логируются записи по следующим событиям:

  • exception - если возникла ошибка, при этом указывается где и какая ошибка
  • pv - просмотр страницы, указывается ссылка на страницу
  • sf - сохранение формы, указывается какая форма была сохранена
Таким образом можно увидеть когда (поле created) какое (поле code) где именно и какого рода (поля header и text) событие возникло у пользователя (поле username)
Примечание:
Вы и сами можете вставлять записи в as_trace с собственным кодом, чтобы отслеживать некие события.
Например, при регистрации нового пользователя можно добавлять в as_trace запись с кодом reg, в header указывать роль с которой был зарегистрирован пользователь,

а в text логин и пароль зарегистрировавшегося пользователя.
Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.