簡體   English   中英

在MVC應用程序的存儲庫層中進行授權的模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM