a.我的AuthorizeFilterAttribute继承了ActionFilterAttribute
b.重写ActionFilterAttribute的OnActionExecuting(ActionExecutingContext filterContext)方法,这个方法表示在每个Action执行之前处理
c.返回页面的Action上面要加ViewPageAttribute,这样我在Filter里才能区分当前Action是否为页面(注:由于是在Action执行之前,无法通过获取ActionResult的类型来判断)
d.权限判断和处理的逻辑自己看贴的代码里的注释,已经写的很清楚了
在哪儿加这个AuthorizeFilterAttribute呢?一个一个给Action或Controller加都太麻烦了,还记得我们所有的Controller都继承了BaseController吗?在他上面就完事了呗!这样整个系统要不权限就靠BaseController上的一个AuthorizeFilterAttribute说了算~,BaseController如下:
// 所有Controller都要继承的基类
[AuthorizeFilter]
[ExceFilter]
public class BaseController : Controller
{
}
}
6.使用FormsAuthentication实现登录验证
用户登录验证用的是.Net自带的Forms验证,它默认通过加密的cookies来实现用户的登录判断
登录代码如下:
[Description("用户登录")]
public ActionResult UserLogin()
{
string loginName = Request["loginname"];
string pwd = HospUser.GetPwdMD5(Request["pwd"]);
if (!AuthorityFacade.Validate(loginName, pwd))
throw new ValidationException("用户名密码错误,或用户状态不可用");
FormsAuthentication.SetAuthCookie(loginName, true);//加入from验证票据 Cache.RemoveSessionCache("currentuser");//清空当前用户信息缓存
return this.JsonFormat(new ExtResult { success = true });
注销代码如下:
public ActionResult Logout()
{
FormsAuthentication.SignOut();
Cache.RemoveSessionCache("currentuser");//清空当前用户信息缓存
return this.JsonFormat(new ExtResult { success = true });
}
大伙期待的源码:
虽然是从公司实际项目中扒出来的,但整个设计,思想,架构和关键代码基本都是我一个人搞的,而且业务相关的东西我都去掉了所以大家可以随便用。
里面可能涉及到不少东西还没有讲到,在以后的系列中会详细说明。
另外有人说源码编译报错缺少“HibernatingRhinos.NHibernate.Profiler.Appender.DLL”,你可以把这个DLL删除,再根据错误信息删除一行代码即可,这个其实是之前讲过的NHProfiler,NH生成SQL查看工具用的DLL。
源码:HISDemo-10.rar
数据库(估计用SQLSERVER的比较多,所以我把数据库从oracle改成了SqlServer2005,直接附加就可以了):HISDemoDb.rar
总结
权限管理这部分暂时就介绍到这里 ,以后有机会再给大家介绍数据权限,权限与工作流引擎集成,单点登录,多级授权等复杂的权限管理实现。大家可以看到上面介绍权限管理还是有些特点的:
·充分利用MVC特点;
·思路清晰;
·验证逻辑简单;
·维护方便;
·没有效率问题;
·和其他代码完全解耦毫无依赖;
·非常灵活能满足绝大多数需求;
·扩展方便;
我想通过这个权限管理的例子和相关讨论,大家应该明白一个道理,只有真正适合自己当前项目的业务和技术特点的技术方案才是好方案。
在技术水平有限的情况下盲目追求什么通用,什么全适应,往往实现费时费力还不讨好。