简单的MVC 权限管理

花了3天时间研究了下对于 NHibernate+MVC4+bootstrap+Redis(这个是选配只做了登陆测试)+T4 这些都是第一次使用。用着有些生硬权当鼓励下自己,记录下来有空就继续完善。

思路是:扩展AuthorizeAttribute,在Controller里面标识类或方法,来获取档期url地址 判断是否合法访问

首选是框架的结构:

一个简单的三层 ,Libs里面放了nhibernate 和redis的dll

Model 、IDTO、DTO、 IBusiness、Business这几个层都是用T4模板生成

NHibernate.CMS.Framework放了些工具方法

NHibernate.CMS.MVC是 相当于UI展现

结构就大概这样了,主要的几个访问方法IDO文件

  /// <summary>
    /// 基仓储实现的方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IBaseRepository<T> where T : class,new()
    {
        //添加
        object AddEntities(T entity);

        object AddEntities(string entityName, object obj);

        //修改
        bool UpdateEntities(T entity);

        //修改
        bool UpdateEntities(string entityName, object obj);

        //删除
        bool DeleteEntities(T entity);
        //删除
        bool DeleteEntities(string entityName, object obj);
        bool DeleteEntities(string query);
        bool DeleteEntities(string query, object[] values, Type.IType[] types);

        //查询
        IList<T> LoadEntities(Func<T, bool> wherelambda);
        IList<T> LoadEntities(string queryString);

        //分页
        IList<T> LoadPagerEntities<S>(int pageSize, int pageIndex,
            out int total, Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda);

        IList<T> LoadPagerEntities<S>(PageResult pagsinfo, out int total, Func<T, bool> whereLambda, bool isAsc, System.Linq.Expressions.Expression<Func<T, object>> orderByLambda);

        IList<T> LoadPagerEntities<S>(PageResult pagsinfo, out int total, string whereLambda, string orderByLambda);

        System.Data.DataTable LoadPagerEntities(PageResult pagsinfo, out int total, string whereLambda, string orderByLambda);

        System.Collections.IList ExecuteSQL(string queryString);

        //获取实体
        T GetSingleModel(T entity,object id);
        T GetSingleModel(Func<T, bool> wherelambda);
    }

DTO是实现IDTO的接口

    //连接-单例模式 用法2
    public class Singleton
    {
        private  static Singleton _instance = null;
        private static readonly object lockHelper = new object();

        protected  ISession m_Session;
        public ISession SingletonSession
        {
            get { return m_Session; }
        }

        protected  ISessionFactory Singleton_SessionFactory;
        private Singleton() {
            string path = NHibernate.CMS.Framework.Utility.AppSettingsHelper.GetString("hibernatecfgxml") + "Config/hibernate.cfg.xml";
                 //HttpContextBase.GetServerPath("Config/hibernate.cfg.xml");
            var config = new Configuration().Configure(path);
            Singleton_SessionFactory = config.BuildSessionFactory();
            m_Session = Singleton_SessionFactory.OpenSession();
        }
        public static Singleton CreateInstance
        {
            get
            {
                if (_instance == null)
                {
                    lock (lockHelper)
                    {
                        if (_instance == null)
                            _instance = new Singleton();
                    }
                }
                return _instance;
            }
        }

    }
    public partial class BaseRepository<T> where T : class
    {

        //添加
        public object AddEntities(T entity)
        {

            try
            {

                var id = Singleton.CreateInstance.SingletonSession.Save(entity);
                Singleton.CreateInstance.SingletonSession.Flush();
                return id;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            return null;

        }
        //添加
        public object AddEntities(string entityName, object obj)
        {
            try
            {

                var id = Singleton.CreateInstance.SingletonSession.Save(entityName, obj);
                Singleton.CreateInstance.SingletonSession.Flush();
                return id;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            return null;

        }

        //修改
        public bool UpdateEntities(T entity)
        {
            try
            {
                Singleton.CreateInstance.SingletonSession.Update(entity);
                Singleton.CreateInstance.SingletonSession.Flush();
                return true;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }

            return false;
        }
        //修改
        public bool UpdateEntities(string entityName, object obj)
        {
            try
            {
                Singleton.CreateInstance.SingletonSession.Update(entityName, obj);
                Singleton.CreateInstance.SingletonSession.Flush();
                return true;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }

            return false;
        }
        //删除
        public bool DeleteEntities(T entity)
        {
            try
            {
                Singleton.CreateInstance.SingletonSession.Delete(entity);
                Singleton.CreateInstance.SingletonSession.Flush();
                return true;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }

            return false;
        }
        //删除
        public bool DeleteEntities(string entityName, object obj)
        {
            try
            {
                Singleton.CreateInstance.SingletonSession.Delete(entityName, obj);
                Singleton.CreateInstance.SingletonSession.Flush();
                return true;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            return false;
        }
        //删除
        public bool DeleteEntities(string query)
        {
            try
            {
                Singleton.CreateInstance.SingletonSession.Delete(query);

                Singleton.CreateInstance.SingletonSession.Flush();
                return true;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            return false;
        }
        //删除
        public bool DeleteEntities(string query, object[] values, Type.IType[] types)
        {
            try
            {
                Singleton.CreateInstance.SingletonSession.Delete(query, values, types);
                Singleton.CreateInstance.SingletonSession.Flush();
                return true;
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            return false;
        }

        //查询
        public IList<T> LoadEntities(Func<T, bool> wherelambda)
        {
            return Singleton.CreateInstance.SingletonSession.Query<T>() .Where(wherelambda).ToList<T>();

        }
        //查询
        public IList<T> LoadEntities(string queryString)
        {
            IQuery query = Singleton.CreateInstance.SingletonSession.CreateQuery(queryString);
            return query.List<T>();
        }
        //分页
        public IList<T> LoadPagerEntities<S>(int pageSize, int pageIndex, out int total,
            Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda)
        {
            var tempData = Singleton.CreateInstance.SingletonSession.Query<T>().Where<T>(whereLambda);

            total = tempData.Count();
            //排序获取当前页的数据
            if (isAsc)
            {
                tempData = tempData.OrderBy<T, S>(orderByLambda).
                      Skip<T>(pageSize * (pageIndex - 1)).
                      Take<T>(pageSize).ToList();
            }
            else
            {
                tempData = tempData.OrderByDescending<T, S>(orderByLambda).
                     Skip<T>(pageSize * (pageIndex - 1)).
                     Take<T>(pageSize).ToList();
            }
            return tempData.ToList();
        }
        ////分页 System.Linq.Expressions.Expression<Func<T, bool>>
        public IList<T> LoadPagerEntities<S>(PageResult pagsinfo, out int total, Func<T, bool> whereLambda, bool isAsc, System.Linq.Expressions.Expression<Func<T, object>> orderByLambda)
        {
            //检查查询变量
            if (pagsinfo.pageIndex < 0)
                throw new ArgumentException("当前页数不能小于0", "pageIndex");

            if (pagsinfo.pageSize <= 0)
                throw new ArgumentException("每页记录数不能小于0", "pageCount");

            int skip, take;

            skip =  pagsinfo.pageSize*(pagsinfo.pageIndex - 1) ;
            take = pagsinfo.pageSize;

            var queryOver = Singleton.CreateInstance.SingletonSession.Query<T>().Where(whereLambda);
            var Ovorder = Singleton.CreateInstance.SingletonSession.Query<T>().Where(whereLambda);
            total = Ovorder.ToList().Count;
            if (isAsc)

                return queryOver.AsQueryable().OrderBy(orderByLambda).Skip(skip).Take(take).ToList();

            else
                return queryOver.AsQueryable().OrderByDescending(orderByLambda).Skip(skip).Take(take).ToList();

        }

        /// <summary>
        /// 执行sql分页
        /// </summary>
        public DataTable LoadPagerEntities(PageResult pagsinfo, out int total, string whereLambda, string orderByLambda)
        {
            if (pagsinfo.pageIndex < 0)
                throw new ArgumentException("当前页数不能小于0", "pageIndex");

            if (pagsinfo.pageSize <= 0)
                throw new ArgumentException("每页记录数不能小于0", "pageCount");

            if (string.IsNullOrWhiteSpace(whereLambda))
                whereLambda = " 1=1 ";

            int skip, take;
            //(@pageIndex-1)*@pageSize+1 AND @pageIndex*@pageSize
            skip = (pagsinfo.pageSize + 1) * (pagsinfo.pageIndex - 1);
            take = (pagsinfo.pageSize * pagsinfo.pageIndex);
            string queryString1 = string.Format("select ROW_NUMBER() OVER( ORDER BY  {0}) AS RowNumber,* from {1} where {2} ", orderByLambda, typeof(T).Name, whereLambda);
            string queryString = string.Format(@"select *
from(
{0}
) T where RowNumber BETWEEN {1} and {2} ", queryString1, skip, take);

                ISQLQuery query1 = Singleton.CreateInstance.SingletonSession.CreateSQLQuery(queryString1);
                total = query1.List().Count;
                using (IDbCommand command = Singleton.CreateInstance.SingletonSession.Connection.CreateCommand())
                {
                    command.CommandText = queryString;

                    IDataReader reader = command.ExecuteReader();
                    DataTable result = new DataTable();
                     result.Load(reader);
                     return result;
                   // return reader.GetSchemaTable();
                }
        }

        public IList ExecuteSQL(string queryString)
        {

            ISQLQuery query = Singleton.CreateInstance.SingletonSession.CreateSQLQuery(queryString);
            return query.List();

        }
        //获取单条
        public T GetSingleModel(T entity, object id)
        {
            System.Type types = typeof(T);
          object obj=  Singleton.CreateInstance.SingletonSession.Get(types.Name, id);
          if (obj == null) return null;
          return obj as T;
        }
        //获取单条
        public T GetSingleModel(Func<T, bool> wherelambda)
        {
            System.Type types = typeof(T);
            var obj = Singleton.CreateInstance.SingletonSession.Query<T>().Where(wherelambda).ToList<T>().FirstOrDefault();
            if (obj == null) return null;
            return obj as T;
        }
    }

前端调用验证部分:

[Permission]--标示为权限验证
public class AdminControllerBase : Controller--其他Controller继承此类

Permission继承AuthorizeAttribute

 /// <summary>
    /// 权限拦截
    /// </summary>
    public class PermissionAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 登陆页面
        /// </summary>
        public class PageUrl
        {
            public string Controller { get; set; }
            public string Action { get; set; }
            public string Url
            {
                get { return string.Format("{0}/{1}", Controller, Action); }
            }
        }
        private PageUrl url;

        //重写Authorization
        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            //获取当前页面地址
            url = new PageUrl();
            url.Controller = filterContext.RouteData.Values["controller"] as string;
            url.Action = filterContext.RouteData.Values["action"] as string;

            //判断用户是否登录
           // string  Token=Caching.Get("adminLogin-key").ToString();//缓存
            Model.adminlogin loginModel = HttpContext.Current.Session[CMSKeys.SESSION_ADMIN_INFO] as Model.adminlogin;
                //NHibernate.CMS.RedisFramework.RedisHelper.Single_Get_Itme<Model.adminlogin>(RedisKeys.REDIS_KEY_ADMINLOGIN + Token);

            if (loginModel==null)
            {
                // 未登录,跳转至登录页面
                filterContext.Result = new RedirectResult("/Home/Login");
                return;
            }
            else
            {

                if (!AuthorizeCore(filterContext.HttpContext))
                {
                    filterContext.Result = new RedirectResult("/Home/Error/premission");
                    //filterContext.HttpContext.Response.Write("");
                }
                //redirect to login page
            }
        }

        /// <summary>
        /// 重写AuthorizeAttribute的AuthorizeCore方法
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool result = false;
            //string Token = Caching.Get("adminLogin-key").ToString();//缓存
            Model.adminlogin loginModel = HttpContext.Current.Session[CMSKeys.SESSION_ADMIN_INFO] as Model.adminlogin;
                //NHibernate.CMS.RedisFramework.RedisHelper.Single_Get_Itme<Model.adminlogin>(RedisKeys.REDIS_KEY_ADMINLOGIN + Token);

            //获取登陆标示
            if (loginModel != null)
            {

                //进行权限校验

                string action = url.Action;
                string controller = url.Controller;
                //如果是admin 拥有所有权限
                if (loginModel.UserName == "admin") return true;

                Isys_actionService action_bll = new sys_actionService();//模块功能信息表
                Isys_acl_userService acl_user_bll = new sys_acl_userService();//用户权限控制信息表
                Isys_acl_groupService acl_group_bll = new sys_acl_groupService();//分组权限控制信息表
                Isys_group_userService group_user_bll = new sys_group_userService();//用户与用户组信息表

                var actionModel = action_bll.GetSingleModel(o => o.actionKey == action && o.moduleKey == controller);
                if (actionModel == null) return false;//表示没找到 action

                var acl_userModel = acl_user_bll.GetSingleModel(w => w.actionID == actionModel.actionID && w.userID == loginModel.UserID);
                if (acl_userModel != null) return true;//表示有该权限
                var group_userModel = group_user_bll.GetSingleModel(k => k.userID == loginModel.UserID);

                var acl_groupModel = acl_group_bll.GetSingleModel(o => o.groupID == group_userModel.groupID && o.actionID == actionModel.actionID);
                if (acl_groupModel != null)
                    result = acl_groupModel.access;

            }
            return result;
        }

    }

到此 验证机制主要部分已经写完就剩下在表里面添加数据测试了。

登陆测试

以上admind登陆的

测试a

时间: 2024-10-11 11:05:21

简单的MVC 权限管理的相关文章

ci中简单实用的权限管理

实用的权限管理 对多数网站来说,使用完整的rbac权限管理杀鸡用牛刀绝对的吃力不讨好,因为我们只是简单分角色然后对角色进行管理行使其相对于的角色赋予的权限; 在实际的开发中用位运算来对权限进行验证是十分实用的技巧 1. 用2的n次幂组成权限值的集合,如1.2.4.8.16...,某用户的权限值为其子集中的整数之和,如 7=1+2+4,5=1+4.每个功能模块对应不同的权限值(2^n) 从数据库中取出用户的权限值k和功能模块权限值g进行位运算, 既 $t = k&g ; $result = $t

Yii2系列教程五:简单的用户权限管理

上一篇文章讲了用户的注册,验证和登录,这一篇文章按照约定来说说Yii2之中的用户和权限控制. 你可以直接到Github下载源码,以便可以跟上进度,你也可以重头开始,一步一步按照这个教程来做. 鉴于本教材基于Yii2 Basic,所以对RBAC的详细讲解我后面再单独出文章来说说吧,这里主要是简单地说一说权限控制 上一篇文章所实现的功能还比较简单,可以发一条状态,但是不知道你注意到没有,如果是没有注册的用户也可以使用我们的应用(类似小微博)来发状态,这是不符合情理的.正确的做法是在用户没有注册,登录

easyUI+mvc权限管理后台

通过按钮和菜单,组合成基本的功能,菜单的功能可以编码修改,但浏览功能是菜单基本的入口,只有角色赋予了浏览功能,才能访问. 基本按钮表 菜单模块 菜单分配按钮 角色授权 下面是对一张表的基本操作 模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyRight.Model { /// <summary> /// 流水号 /// </summar

用最基本的EF+MVC+JQ+AJAX+bootstrap实现权限管理的简单实例 之登陆和操作权限

先来一堆关于上篇文章的废话(不喜者点此隐藏) 今天把博客加了个小功能,就是点标题可以隐藏或展示相关内容,做法很傻,就是引用了bootstrap的两个css类和全部的js文件,其实这样的小功能完全应该自己做的,主要还是因为前端差,还有就是懒.请大家不要太过在意命名和前端样式,我并没有进入公司工作,命名没有具体规范,都是随心所欲.前端实在太差,如果你觉得颜色样式太差,只能说明我的审美有问题,咱们主要看功能实现. 上篇文章发布后有一定的推荐量和浏量,对一个初学者来说,自认为还是挺不错的.最主要的是收到

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10

今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求为一个具体的功能页面 /// </summary> public class AdminActionMethod : Attribute { /// <summary> /// 页面请求路径 /// </summary> public string ActionUrl {

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是翔通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基本不用了.还有最主要的原因就是锻炼下自己的能力.好了其他就不多说了,下面来看下我对这个项目的整体概述吧: 目录: 目录我以后会在这边添加上去的 一.Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理 基本设计 项目中使用到的工具: Visual Studio 2013,

asp.net mvc +easyui 实现权限管理(二)

一写完后,好久没有继续写了.最近公司又在重新开发权限系统了,但是由于我人微言轻,无法阻止他们设计一个太监版的权限系统.想想确实是官大一级压死人啊, 没办法我只好不参与了 让他们去折腾. 我就大概说一下公司目前在做的权限系统,各位看官给点评价. 设计总体要求: (注:项目名称为 统一权限管理系统) 1.做一个通用权限系统. 2.权限设计按照角色设置. 3.提供统一权限接口 以上就是整体要求,解释一下, 我们的通用是指的以后每开发一套新系统,只需要在统一权限管理系统中进行相应的配置就好了,无需再去开

ASP.NET MVC+EF框架+EasyUI实现权限管理系列

http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个 项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个 系列

MVC身份验证及权限管理

MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: <authentication mode="Forms"> <forms loginUrl="Login.aspx" defaultUrl="Default.aspx" protection="All" /> &l