我将尝试解释我打算如何在我的项目中实现这一点。要求与您的要求相似:用户具有具有权限的角色,并且所有内容都可以从权限定义、角色的权限列表和用户的角色列表等中更改。因此,在某一时刻,用户可能有权访问某些内容,而在另一时刻,如果管理员更改某事,他无权访问。
在我放一些代码之前,我会回答你的问题。
我需要单独创建吗,
基于表的安全性?
-是的
我可以把安全放在我的
存储库,以便返回
记录已经被修剪,或者应该
它是控制器的一部分吗?
-我认为安全性应该是业务逻辑的一部分,所以我会把它放在控制器和存储库之间。
我需要一个安全属性来
验证控制器请求?
-在我的项目中,我把它放在属性中,但有时我需要从控制器访问它,但由于我将安全逻辑保留在业务层中,我认为这不是问题。
第一个属性是简单的属性,只允许登录用户执行操作:
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");
}
附言我不确定我是否可以向显然比我更有经验的人提出任何建议:),所以如果我发送垃圾邮件,我对此表示歉意。