私は、次のようなさまざまな権限とさまざまな役割を持つ巨大なアプリケーションで実行しました[ここにはコードがないので、ここで再作成してみます]:
私は最初に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();
}
}
これは、ユーザーがアクセスするためのアクセス許可を必要とするすべてのページのBasePageになります。はMandatoryPermissions
、ユーザーがページにアクセスするためにそれらすべてを持っているOptionalPermissions
必要があるアクセス許可であり、ユーザーがページにアクセスするためにそれらの少なくとも1つを必要とするアクセス許可です。オプションがあるかどうかは関係ないので、すべてのページで両方を使用する必要はあり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);
}
}
OK、検索例はそれほど良くありませんでしたが、私はあなたが写真を撮ったと思います。
全体的な考え方はbase.OnLoad(e);
、アクセス許可の検証の直前に呼び出されるため、にアクセス許可を入力するだけですPage_Load
。
これが最善の解決策かどうかはわかりませんが、大いに役立つと確信しています:)