Search
Write a publication
Pull to refresh

Организация разграничения прав пользователя на операции в ASP.NET-приложении

Reading time2 min
Views626
Во многих многопользовательских веб-приложениях необходимо разграничить права пользователей на операции. Например, администратору системы доступны все операции, обычному пользователю только некоторые, напрмер, нельзя удалять и редактировать записи, и т.п.

С точки зрения пользователя веб-приложения операция представляется элементом управления — кнопкой, ссылкой, — при помощи которой эта операция может быть запущена (произведен вызов функции уровней 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);
}

...
}
Tags:
Hubs:
Total votes 11: ↑3 and ↓8-5
Comments3

Articles