关于MVC权限控制的一点小想法

  近来一直在学习MVC。

  先检讨一下自己,本来一直在看WPF并向Silverlight靠拢的,可XAML这个东西一时半会领会不了它的真谛,所以暂时先放下了。虽然MVC看的比较系统,但暂时闲置了WPF和Silverlight还是有点沮丧感,觉得自己没有坚持。

  

  MVC的权限控制一直是一个麻烦事。

  Webform下的窗体身份验证及角色权限管理,我自己有一篇文章做了个总结:Asp.Net实现FORM认证的一些使用技巧

  对于MVC,我不喜欢它自带的Membership那一套,也不喜欢用Linq,所以我着重参考了这篇文章:ASP.NET MVC:窗体身份验证及角色权限管理示例。文章的内容很好,将FORM认证和MVC很好的结合起来,而且角色权限可控制到Action的级别。

  今天我在做自己写的一个简单示例程序时发现,如果当我们的权限管理比较粗狂时,比如,我只需要根据是否登录来判断页面是否需要访问时,如果还是为每一个Controller下的每一个Action都增加属性[Authorize],那就太麻烦了。我在想能不能控制到Controller级别呢?于是做了下面的尝试:

1 [Authorize]
2 public class AccountController : BaseController
3 {
4 } 

 

即将属性[Authorize]写到Controller级别,发现是可用。这样就控制了整个Controller都需要认证后才能访问。但是还是得为每一个Controller下都增加属性[Authorize],也有点麻烦。于是,我想到了Webform下常会做一个Pagebase类,我又做了下面的尝试:

1 [Authorize]
2 public class BaseController : Controller
3 {
4 }
5 
6 public class AccountController : BaseController
7 {
8 }

 

也就是建立一个BaseController基类,带上[Authorize]属性,然后需要认证的Controller都继承这个基类即可。测试通过,那就OK了。今天工作差不多就能到这了。

 

  但也有一些问题,比较普遍的就是在控制Action的角色权限时,需要写死[Authorize(Roles = "manager")]。很多人在问,能不能那个角色能动态的从数据库读取呢?其实我也没有办法。包括以前Webform认证时按角色控制目录的访问属性,也需要在Web.config中写死。

  不过,我有个想法,还没实践,那就是在BaseController中增加相应的虚Action或抽象Action,在这一级定义好[Authorize]属性,或者进行动态的读取,其余的Action重写实现就可以了。不知道可不可行。有时间试一下。

 

  今天暂时就这么多,记一下,给自己也是个提醒。

 

posted @ 2010-12-15 10:32  芈老头  阅读(2203)  评论(2编辑  收藏  举报