[英]Pattern for doing authorization in repository layer of MVC application
我有一個帶有存儲庫層的Windows身份驗證的MVC應用程序。 控制器與數據庫的所有交互都是通過存儲庫完成的。 每個控制器都有對存儲庫的引用:
public class PostController : Controller
{
private Repository db = new Repository();
[HttpPost]
public ActionResult DeletePost(int id)
{
// Authorize that the user is allowed to delete this post...
db.DeletePost(id);
}
}
我的問題是,是否有一種將授權邏輯移動到存儲庫層的好方法。 我希望Repository.DeletePost()
函數拒絕刪除未經過身份驗證的用戶創建的帖子。 問題是我的存儲庫不知道經過身份驗證的用戶是誰。 控制器知道(通過Controller.User
)。
將Controller.User
傳遞到Repository
構造函數不起作用,因為在調用構造函數時, Controller.User
顯然沒有定義。
如何通知Repository
誰是經過身份驗證的用戶? 在每個動作中構建Repository
是否最好? 或者在存儲庫層中處理它是一個壞主意?
或者在存儲庫層中處理它是一個壞主意?
我認為控制器是一個更好的授權地點。 讓存儲庫成為數據的網關,控制器成為應用程序的守門員。 我期望在生命周期的早期看到授權/認證邏輯。
做一些像:
db.DeletePostForUser(id, User.Identity.UserId);
然后在您的存儲庫中:
public void DeletePostForUser(int id, int userId)
{
var post = context.Posts.SingleOrDefault(m => m.PostId == id && m.User.UserId == userId)
if (post != null)
{
context.Posts.Remove(post);
context.SaveChanges();
}
}
來自@BigDaddy和@ChrisPratt的好建議。
我最終通過創建一個基本控制器來解決這個問題,類似於這個答案 。 我的基本控制器類看起來像:
public class BaseController : Controller
{
private ILog _log;
private Repository _db;
protected Repository Db
{
get
{
return _db ?? (_db = new Repository(User));
}
}
protected ILog Log
{
get
{
return _log ?? (_log = LogManager.GetLogger(this.GetType()));
}
}
}
我的所有控制器都繼承自此類,並且具有對延遲加載的Repository
內置訪問權,該Repository
具有對當前經過身份驗證的用戶的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.