これをプロジェクトにどのように実装するつもりだったかを説明しようと思います。要件はあなたの要件と似ています。ユーザーには権限を持つ役割があり、権限の定義、役割の権限リスト、ユーザーの役割リストなどからすべてを変更できます。したがって、管理者が変更した場合、ある瞬間にユーザーが何かにアクセスできる可能性があります。何か、彼はアクセスできません。
コードを入れる前に、あなたの質問に答えます。
個別のテーブルベースのセキュリティを作成する必要がありますか?
-はい
リポジトリにセキュリティを設定して、返されたレコードがすでにトリミングされているようにすることはできますか、それともコントローラの一部にする必要がありますか?
-セキュリティはビジネスロジックの一部である必要があると思います。そのため、セキュリティはコントローラとリポジトリの間のどこかに配置します。
コントローラリクエストを検証するためにセキュリティ属性が必要ですか?
-私のプロジェクトでは、属性に入れましたが、コントローラーからにアクセスする必要がある場合もありますが、セキュリティロジックをビジネスレイヤーに保持しているので、問題ないと思います。
最初の属性は、ログに記録されたユーザーがアクションを実行できるようにする単純な属性です。
public class LoggedUserFilterAttribute : ActionFilterAttribute
{
public bool Logged { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!SessionManager.IsUserLogged)
{
filterContext.Result = new RedirectToRouteResult(GetRedirectToNotLoggedRouteValues());
this.Logged = false;
}
else
this.Logged = true;
}
public RouteValueDictionary GetRedirectToNotAuthorizedRouteValues()
{
RouteValueDictionary routeValues = new RouteValueDictionary();
routeValues.Add("action", "NotAuthorized");
routeValues.Add("controller", "Authorization");
return routeValues;
}
public RouteValueDictionary GetRedirectToNotLoggedRouteValues()
{
RouteValueDictionary routeValues = new RouteValueDictionary();
routeValues.Add("action", "NotLogged");
routeValues.Add("controller", "Authorization");
return routeValues;
}
}
次に、たとえば、スーパーユーザーのみがアクセスできる属性があります。
public class SuperUserFilterAttribute : LoggedUserFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (Logged)
{
MyBaseController controller = filterContext.Controller as MyBaseController;
if (controller == null)
throw new Exception("Please use MyBaseController instead of built in Controller");
User loggedUser = controller.Model.UserBO.GetUserByID(SessionManager.LoggedUser.UserID);
if(!loggedUser.IsSuperUser)
{
filterContext.Result = new RedirectToRouteResult(GetRedirectToNotAuthorizedRouteValues());
}
}
}
}
MyBaseControllerは、Controllerを継承するクラスであり、ビジネスオブジェクトのコンテナーを表すModelクラスのインスタンスを持っています。コントローラのアクションボディで、必要に応じて現在のエンティティのユーザー権限を確認し、それに応じて適切なビューを返します。
[LoggedUserFilter]
public ActionResult LoadSomeEntity(int customerServiceID,int entityID)
{
UserRights userPermissionsView = Model.SecurityBO.GetUsersRightsOnEntity(SessionManager.LoggedUser.UserID, entityID);
if(userPermissionsView.Write)
return View("EditEntity",Model.EntityBO.GetEntityByID(entityID));
if(userPermissionsView.Read)
return View("ViewEntity",Model.EntityBO.GetEntityByID(entityID));
return View("NotAuthorized");
}
ps明らかに私よりもはるかに多くの経験を持っている人に何か提案できるかどうかはわかりません:)ですから、スパムを送信している場合は、そのことをお詫びします。