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