在服务层中进行任何数据库更新之前,我有一个关于授权/验证用户操作的问题。
我有一个JobPostingController,它提供了创建/更新/删除作业发布的方法。
我希望用户只有在他是实体的所有者时才能更新/删除作业发布。 (在我的JobPosting实体中有像JobPostingOwner这样的东西)
有没有一种简单的方法来创建自定义控制器动作过滤器来实现这一目标?
根据我的理解,检查是否允许用户更新/删除特定实体应该在服务层中,但不知道是否有比
更简单的方法public void UpdateJobPosting(JobPosting jobPosting, User user)
{
if(jobPostingOwnerId == user.Id) --> OK
else --> not OK
}
另一个简单的例子:
/JobPosting/Edit/(id)
我想始终检查用户是否真的被允许编辑此职位发布。 所以在服务层,我会这样做:
public JobPosting GetJobPosting(int id, User user)
{
var query = from item in context.JobPostings
where item.id == id
&& item.OwnerId == user.Id
select item;
....
}
这是正确的方法还是有另一种模式?
答案 0 :(得分:0)
首先,您需要在服务层中使用这样的方法:
public bool IsUserAllowed(int potingId, User user)
{
var query = from item in context.JobPostings
where item.id == potingId
&& item.OwnerId == user.Id
select item;
var result = query.FirstOrDefault();
return result != null;
}
然后创建自定义操作过滤器(来自CustomActionFilterAttribute
的名为AuthorizeAttribute
的类),在AuthorizeCore
方法中,您只需检查用户的权限:
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
base.AuthorizeCore(httpContext);
var routeData = httpContext.Request.RequestContext.RouteData;
var jobPostingId = (routeData.Values["id"] as string) ?? (httpContext.Request["id"] as string);
var user = UserManager.FindUser(httpContext.User.Identity.GetUserId<int>());
return _jobPosting.IsUserAllowed(int.Parse(jobPostingId), user);
}
最后,您必须使用自定义操作过滤器修饰Edit
操作方法:
[CustomActionFilter]
[HttpPost]
public ActionResult Edit(int id)
{
// ....
}