Во многих многопользовательских веб-приложениях необходимо разграничить права пользователей на операции. Например, администратору системы доступны все операции, обычному пользователю только некоторые, напрмер, нельзя удалять и редактировать записи, и т.п.
С точки зрения пользователя веб-приложения операция представляется элементом управления — кнопкой, ссылкой, — при помощи которой эта операция может быть запущена (произведен вызов функции уровней DLL — DAL — DB). Поэтому для разграничения прав пользователя на операции в простейшем случае достаточно разграничить права на элементы управления.
Для этого в БД можно организовать подходящую для нужд приложения структуру. При авторизации пользователя из этой структуры в его UserProfile считывается информация о запрещенных для него операциях (или разрешенных, если так удобней) в таблицу NotAccessOperations:
Контролы, которые должны быть избирательно доступны пользователям в зависимости от их прав, пусть реализуют интерфейс IAccessControl, в котором описаны свойства, соответствующие некоторой структуре доступа пользователей к операциям:
Желательно, чтобы обработка всех IAccessControl-контролов на предмет их доступности пользователю производилась в одном месте некоторым единообразным способом, напрмер, была вынесена в отдельный класс:
Реализация IAccessControl-контролов может быть, например, такой:
С точки зрения пользователя веб-приложения операция представляется элементом управления — кнопкой, ссылкой, — при помощи которой эта операция может быть запущена (произведен вызов функции уровней DLL — DAL — DB). Поэтому для разграничения прав пользователя на операции в простейшем случае достаточно разграничить права на элементы управления.
Для этого в БД можно организовать подходящую для нужд приложения структуру. При авторизации пользователя из этой структуры в его UserProfile считывается информация о запрещенных для него операциях (или разрешенных, если так удобней) в таблицу NotAccessOperations:
public class UserProfile
{
...
Hashtable notAccessOperations = new Hashtable();
public Hashtable NotAccessOperations
{
get { return notAccessOperations; }
}
...
}
Контролы, которые должны быть избирательно доступны пользователям в зависимости от их прав, пусть реализуют интерфейс IAccessControl, в котором описаны свойства, соответствующие некоторой структуре доступа пользователей к операциям:
public interface IAccessControl
{
...
string IdGroup { get;set;}
...
}
Желательно, чтобы обработка всех IAccessControl-контролов на предмет их доступности пользователю производилась в одном месте некоторым единообразным способом, напрмер, была вынесена в отдельный класс:
public static class UserAccessController
{
...
public static void ResoleUserAccess(WebControl ctrl)
{
...
//здесь предполагается, что профиль пользователя хранится в сессии
if (((UserProfile)HttpContext.Current.Session["UserProfile"]).NotAccessOperations.Contains(((IAccessControl)ctrl).IdGroup))
{
ctrl.Visible = false;
}
...
}
...
}
Реализация IAccessControl-контролов может быть, например, такой:
public class SomeCommandButton : CompositeControl, IAccessControl
{
...
public string IdGroup
{
set { ViewState["IdGroup"] = value; }
get
{
object o = ViewState["IdGroup"];
return (o != null) ? (string)ViewState["IdGroup"] : "";
}
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
UserAccessController.ResoleUserAccess(this);
}
...
}