2011-01-14 106 views
1

我需要编写一些代码来在我的项目数据库中查找ID。 用户与项目耦合,所有项目与其他对象(如会话)有很多连接。从控制器构造函数中的URL获取参数

现在我需要在运行任何操作之前检查,如果用户尝试访问Session,连接到与会话连接的同一项目。

为此,我想在Actions上使用[Attribute]。 MVC: creating a custom [AuthorizeAttribute] which takes parameters?

这个问题的答案让我开始,但我使用控制器的构造函数来得到我的Project ID

的目标是,我可以在每个构造函数编写一些代码,具有麻烦我所有的根据项目对象的控制器,找到项目ID并使其可访问(公共),因此我的[customauthorize]将有权访问此项目ID以检查用户是否有权访问。

我的问题:

public class SessionController : Controller { 

    NASDataContext _db = new NASDataContext(); 


    public SessionController() { 
     var test = RouteData; 
     var ses = _db.Sessies.First(q=>q.Ses_ID==1); 
    } 

如何访问我的RouteData? RouteData为空,HttpContext为空并且Request为空。

我需要的ID在URL中,这是在的RouteData ...

回答

1

我建议把这个检查的模式,而不是控制。在控制器中,您需要修改每个需要此检查的操作,请记住,这将对您应用的每个操作都执行代码,因此您可能不希望将其应用于控制器级别以开始。更简单的方法是在模型中执行一次检查,然后您的Controller没有“关注”访问权限。这将使这个访问权检查的测试成为可能,因为你只能在一个地方进行测试。

+0

在检查模型。这是一个有趣的方法。一个人会怎么做?你有任何讲座/例子吗?我会在模型上编写一个扩展方法吗?或者,我会像编辑Action GET请求一样,更改获取对象的LINQ代码,并在那里添加过滤器,这会导致找不到该项目,并且需要一些额外的检查是否有正确的错误信息。 – Stefanvds 2011-01-14 12:26:39

+0

这真的归结为模型的实现。如果您只是在您的Controller操作中访问Linq to SQL,那么您有两种基本方法和一种架构方法。第一个使我的建议没有意义,这就是你要修改代码的每一个实例,访问有访问控制的对象的地方。其次是使用L2S对象生成为部分并将检查添加到Project对象的事实。最后是最好的恕我直言,实施存储库模式,并把检查存储库。更清洁,可测试和可维护。 – Lazarus 2011-01-14 12:34:50

1

这就是我现在要解决的问题,我对此很满意。

模块部分:

public partial class Module { 
    public string FullName { 
     get { 
      return Mod_Code + " " + Mod_Titel; 
     } 
    } 
    public string ShortName { 
     get { 
      return Mod_Code; 
     } 
    } 
    public bool IsAccessible() { 
     return this.Projecten.IsAccessible(); 
    } 
} 

项目部分:

public partial class Projecten { 
    public string FullName { 
     get { 
      if (Proj_Kortenaam == Proj_Naam) 
       return Proj_Kortenaam; 

      return Proj_Kortenaam + " " + Proj_Naam; 
     } 
    } 
    public string ShortName { 
     get { 
      return Proj_Kortenaam; 
     } 
    } 

    public bool IsAccessible() { 
     return IsAccessible(HttpContext.Current.User); 
    } 

    public bool IsAccessible(IPrincipal user) { 
     //this code checks if the user can access or not 
     return MvcApplication.projectToegankelijk(user, this._Proj_ID); 
    } 
} 
在模块控制器

然后

[NonAction] 
    public ActionResult noRights() { 
     ViewData["delError"] = "You have no rights."; 
     return View("Error"); 
    } 

    // 
    // GET: /Modules/Details/5 
    public ActionResult Details(int id) { 
     var mod = _db.Modules.First(q => q.Mod_ID == id); 
     if (mod.IsAccessible()) { 
      return View(mod); 
     } 
     return noRights(); 
    } 

我想这样的作品相当整洁:)

相关问题