Я сделал в огромном приложении с множеством разных разрешений и разных ролей что-то вроде следующего [у меня здесь нет кода, поэтому я просто попытаюсь воссоздать его здесь]:
Сначала я реализовал класс SecuredPage следующим образом:
public class SecuredPage : System.Web.UI.Page
{
// Those Permissions are mandatory, so user needs to have all of them
public List MandatoryPermissions { get; set; }
// Those Permissions are optional, so if the user have at least one of them, he can access
public List OptionalPermissions { get; set; }
protected override void OnLoad(EventArgs e)
{
MyUser loggedUser = (MyUser) this.User;
base.OnLoad(e);
foreach (Permission mandatoryPermission in MandatoryPermissions)
{
// if the user don't have permission, we can redirect him
if (!loggedUser.HasPermission(mandatoryPermission))
{
RedirectToDontHaveAccess();
break;
}
}
bool hasAccessToThePage = false;
foreach (Permission optionalPermission in OptionalPermissions)
{
// If the user has at least one of the permissions, he can access
if (loggedUser.HasPermission(optionalPermission))
{
hasAccessToThePage = true;
}
}
if (!hasAccessToThePage)
{
RedirectToDontHaveAccess();
}
}
private void RedirectToDontHaveAccess()
{
throw new NotImplementedException();
}
}
Это будет моя базовая страница для всех страниц, для доступа к которым пользователю нужны разрешения. MandatoryPermissions
— это разрешения, которые ДОЛЖНЫ быть у пользователя все для доступа к странице, а OptionalPermissions
— это разрешения, которые пользователю нужны хотя бы одному из них для доступа к странице. Нет необходимости использовать оба на каждой странице, потому что если у вас есть MandatoryPermissions
, не имеет значения, есть у вас дополнительные опции или нет.
Разрешение - это перечисление:
public enum Permission
{
// Usually this enum will replicate a domain table from the database
EditUser = 1,
SearchUserByUsername = 2,
SearchUserByEmail = 3
}
А MyUser
— это реализация MembershipUser
:
public class MyUser : System.Web.Security.MembershipUser
{
internal bool HasPermission(Permission permission)
{
//
// TODO: Check on database if the user has the permission or not
//
}
}
Тогда единственное, что вам нужно сделать на своих страницах, это заполнить списки разрешений:
public partial class EditUser : SecuredPage
{
protected void Page_Load(object sender, EventArgs e)
{
MandatoryPermissions.Add(Permission.EditUser);
}
}
public partial class SearchUser : SecuredPage
{
protected void Page_Load(object sender, EventArgs e)
{
OptionalPermissions.Add(Permission.SearchUserByUsername);
OptionalPermissions.Add(Permission.SearchUserByEmail);
}
}
Хорошо, пример с поиском был не очень хорош, но я думаю, вы поняли.
Вся идея в том, что base.OnLoad(e);
вызывается непосредственно перед проверкой разрешений, поэтому вам просто нужно заполнить разрешения в вашем Page_Load
.
Я не уверен, что это лучшее решение, но я уверен, что это очень помогает :)
person
homemdelata
schedule
25.04.2009