权限管理_权限管理系统 - CSDN
权限管理 订阅
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 很多人常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。 展开全文
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 很多人常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。
信息
规    则
根据系统设置的安全规则
认    证
用户和密码的系统
分    类
身份认证”、“密码加密”
中文名
权限管理
外文名
authority management
权限管理场景举例
企业IT管理员一般都能为系统定义角色,给用户分配角色。这就是最常见的基于角色访问控制。场景举例:1、给张三赋予“人力资源经理”角色,“人力资源经理”具有“查询员工”、“添加员工”、“修改员工”和“删除员工”权限。此时张三能够进入系统,则可以进行这些操作;2、去掉李四的“人力资源经理”角色,此时李四就不能够进入系统进行这些操作了。以上举例,局限于功能访问权限。还有一些更加丰富、更加细腻的权限管理。比如:1、因为张三是北京分公司的“人力资源经理”,所以他能够也只能够管理北京分公司员工和北京分公司下属的子公司(海淀子公司、朝阳子公司、西城子公司、东城子公司等)的员工;2、因为王五是海淀子公司的“人力资源经理”,所以他能够也只能够管理海淀子公司的员工;3、普通审查员审查财务数据的权限是:在零售行业审核最高限额是¥50万,在钢铁行业最高限额是¥1000万;高级审查员不受该限额限制;4、ATM取款每次取款额不能超过¥5000元,每天取款总额不能超过¥20000元。这些权限管理和数据(可以统称为资源)直接相关,又称为数据级权限管理、细粒度权限管理或者内容权限管理。
收起全文
精华内容
参与话题
  • 完整的权限管理系统

    千次阅读 2018-08-24 16:01:37
    权限管理系统定义 权限管理是一个几乎所有后台系统的都会涉及的一个重要组成部分,主要目的是对整个后台管理系统进行权限的控制,而针对的对象是员工,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,...

    权限管理系统定义

    权限管理是一个几乎所有后台系统的都会涉及的一个重要组成部分,主要目的是对整个后台管理系统进行权限的控制,而针对的对象是员工,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,数据泄露等问题。

    其实权限管理的设计并不难,就目前来说最广泛的是一个账号对应多个角色,每个角色对应相应的权限集(RBAC模型)这种模型基本可以应对所有的问题,且通过角色可以实现灵活且多样的的权限操作需求,我们梳理一下上面主要提到的几个名词:账号、角色、权限。

    1. 账号的定义

    每个员工想要进入系统肯定都会有一个账号,而这个账号就是一把钥匙。

    我们通过控制账号所具备的权限,进而控制这个员工的授权范围。

    因此需要告诫员工,账号密码不能轻易提供他人,不然遇到的问题由自己承担。

    2. 角色的定义

    角色管理是确定角色具备哪些权限的一个过程,他是一个集合的概念,是众多最小权限颗粒的组成。

    我们通过把权限给这个角色,再把角色给账号,从而实现账号的权限,因此它承担了一个桥梁的作用。

    引入角色这个概念,可以帮助我们灵活的扩展,使一个账号可以具备多种角色。

    角色的命名最好按照职位而定,例如市场部普通员工,市场部主管等。因为职位在任何企业都是存在的,且是有限的,并且容易理解,市场部文员那就是市场部文员角色,方便我们配置权限时的判断,避免配置错误。

    3. 权限的定义

    权限可以分为三种:页面权限,操作权限,数据权限。

    页面权限

    控制你可以看到哪个页面,看不到哪个页面。

    很多系统都只做到了控制页面这一层级,它实现起来比较简单,一些系统会这样设计,但是比较古板,控制的权限不精细,难以在页面上对权限进行更下一层级的划分。

    操作权限

    则控制你可以在页面上操作哪些按妞。

    延伸:当我们进入一个页面,我们的目的无非是在这个页面上进行增删改查,那在页面上对应的操作可能是:查询,删除,编辑,新增四个按钮。

    可能你在某个页面上,只能查询数据,而不能修改数据。

    数据权限

    数据权限则是控制你可以看到哪些数据,比如市场A部的人只能看到或者修改A部创建的数据,他看不到或者不能修改B部的数据。

    延伸:数据的控制我们一般通过部门去实现,每条记录都有一个创建人,而每一个创建人都属于某个部门,因此部门分的越细,数据的控制层级也就越精细,这里是否有其他好的方式除了部门这个维度还有其他什么方式可以控制数据权限,大家可以提出来探讨一下。


    很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容。在此以权限管理的使用场景来说明一下完整的权限管理内容。

    一、鉴权管理,即权限判断逻辑


    1. 最基本的权限管理就是菜单管理

    用户没有权限的功能模块在菜单节点上是不显示的。(很多人以为这就是权限管理!)

    示例:

    普通业务人员登录系统后,是看不到【用户管理】菜单的。
          
    2. 功能权限管理

    B/S系统的功能体现为URL,所以功能权限管理主要是针对URL访问的管理。(很多人都不清楚权限管理的对象是什么?)

    示例:

    经过授权,部门经理可以查看【用户管理】菜单,并查看部门用户信息,但权限设计要求,该部门经理没有添加用户的权限。

    所以在访问【添加用户】的功能(URL)时,应该有没有授权的提示信息。

    同时在【用户管理】页面上,【添加用户】的按钮应该灰色显示,不能点击。
          
    3. 行级权限管理

    示例:

    论坛管理员,权限设计要求 A能管理论坛 【新闻版块】,不能管理论坛 【技术交流】

    此时的权限设计就应该根据论坛的相应ID来判断权限信息。
          
    4. 列级权限管理

    示例:

    业务权限设计要求,除销售人员以外,其他用户不能看到客户的联系方式信息。

    此时的权限设计要判断相应的字段(列)是否可以显示。
          
    5. 组织机构/部门级数据权限管理

    示例:

    业务权限设计要求,销售一部的人员只能看到本部门的销售订单,销售二部的人员只能看到本部门的销售订单,但销售经理可以同时看到销售一部和销售二部的销售订单。

    此时的权限设计就要根据销售订单数据本身的部门属性来做判断
          
    6. 范围型业务数据权限管理

    示例:

    大卖场销售人员在下销售订单时,要选择相应的产品所在仓库信息。

    业务权限设计要求,【国美】的销售人员在选择仓库的下拉列表中不能看到【广州仓库】,而【大中电器】的销售人员在选择仓库的下拉列表中不能看到【北京顺义仓库】

    二、授权管理,即权限分配过程

    以上的权限管理内容都要通过系统的授权功能来分配给具体的用户,授权功能应该足够灵活。
       
    1. 直接对用户授权,直接分配到用户的权限具有最优先级别。
       
    2. 对用户所属岗位授权,用户所属岗位信息可以看作是一个分组,和角色的作用一样,但是每个用户只能关联一个岗位信息。
       
    3. 对用户所属角色授权,用户所属角色信息可以看作是一个权限分组,每个用户可以关联多个角色。
       
    4. 角色直接关联具体的功能权限(URL),也可以关联负权限,即此角色关联的权限不能使用负权限功能。负权限具有优先级别。
       
    5. 分级授权,系统管理员可以将自己拥有的权限信息授权给其他用户。即可以设置分级管理员和超级管理员。
       
    以上才是一个完整的权限管理系统,你有这样的完整权限的设计吗?

    展开全文
  • 本课程是基于SSM+Maven框架的权限管理系统,非常详细,包含源代码和数据库表结构设计,非常适合企业级开发的入门实战课程。技术采用:Spring+SpringMVC+MyBatis+MySql+easyUI+Ajax+Maven,都是现实市场主流技术。...
  • 用户权限管理系统

    万次阅读 2018-07-19 15:57:44
    角色管理模块实现了角色的新增、修改和删除,对应角色的权限查看,重新给各个角色分配功能等功能;菜单管理模块实现了菜单的增删改功能。 本项目结构上分为表现层、业务层和数据访问层。层次间的依赖关系自下到上。....

    该项目主要是完成用户权限系统的开发,该系统分为登陆、用户管理、角色管理和菜单管理4个模块。
    分别在登陆模块实现了简单的登陆功能;用户管理模块实现了用户的增加、删除、修改、查看信息、用户角色分配等功能;角色管理模块实现了角色的新增、修改和删除,对应角色的权限查看,重新给各个角色分配功能等功能;菜单管理模块实现了菜单的增删改功能。
    本项目结构上分为表现层、业务层和数据访问层。层次间的依赖关系自下到上。采用的技术有三层架构、Jquery 等。其中表现层采用easyui框架开发;业务层封装业务流程,为适应业务的变更,每一业务模块均有专门的接口及实现类,数据访问层封装数据,为适应数据的变更,每个模块均有专门的接口及实现类。

    1功能一

    1.1、功能名称

    系统登录功能

    1.2、客户端界面及描述

    登陆界面如图1所示。

    图1登陆界面

    登录按钮功能描述:

    1. 判断用户名密码是否输入 是:继续,否:return;
    2. 获取用户名密码,使用ajax提交服务器端C#进行验证,并返回验证结果;
    3. 客户端通过ajax回调函数获取服务端的验证结果,成功:页面跳转Main.aspx; 否则提示登录失败信息。

    1.3、客户端主要核心脚本

    <script>

            $(function () {

                $('#btnOK').click(function () {

                    var usercode = $('#usercode').val();

                    var pwd = $('#pwd').val();

                    $.ajax({

                        type: 'post',

                        url: "Login.aspx?action=login",

                        data: { usercode: usercode, pwd: pwd },

                        //contentType: 'application/json',

                        dataType: 'json',

                        success: function (data) {

                            if (data.isSuccessed) {

                                location.href = "Main.aspx";

                            }

                            else

                                alert(data.Message);

                        },

                        error: function (xmlReq, err, c) {

                            alert("error:" + err);

                        }

                    });

                })

            })

        </script>

    1.4、服务器端代码

    private void CheckLogin()

        {

            string usercode = Request["usercode"];

            string pwd = Request["pwd"];

            SYSTEM.BLL.sysuser bll = new SYSTEM.BLL.sysuser();

            var user = bll.GetModel(usercode);

            if (user != null)

            {

                if (user.pwd == pwd)

                {

                    Session["username"] =user.username.ToString();  //记录当前用户在session 里面

                    WriteMessage(true, "登陆成功");

                }

                else

                {

                    WriteMessage(false, "登陆失败");

                }

            }

            else

            {

                WriteMessage(false, "登陆失败");

            }

        }

    2功能二

    2.1、功能名称

    用户管理功能

    2.2、客户端界面及描述

    用户管理主界面如图2所示,增加用户如图3所示,修改用户如图4所示,用户角色分配如图5所示。

    图2用户管理主界面

    用户管理主界面描述:点击左边系统设置的用户管理按钮,进入主界面,查看所有用户信息。

    图3新增用户

    新增用户功能描述:点击右边界面的新增按钮,弹出新增数据界面,对用户进行增加操作。点击弹出窗口中的确定,即可增加成功;如果点击关闭,即可取消添加。

    图4修改用户

    修改用户功能描述:点击右边界面的修改按钮,弹出修改数据界面,对用户进行修改操作。点击弹出窗口中的确定,即可修改成功;如果点击关闭,即可取消修改。

    图5用户角色分配

    用户角色分配功能描述:点击右边界面的用户角色按钮,弹出角色数据界面,对用户进行角色分配操作。点击弹出窗口中的确定,即可完成角色分配;如果点击关闭,即可取消分配。

    2.3、客户端主要核心脚本

    2.3.1用户管理主界面

      function loaddata() {

                    $("#dg").datagrid({

                        url: "userlist.aspx?action=select",//加载的URL  

                        isField: "usercode",

                        pagination: true,//显示分页  

                        pageSize: 5,//分页大小  

                        pageList: [5, 10, 15, 20],//每页的个数  

                        fit: true,//自动补全  

                        fitColumns: true,

                        toolbar: '#tb',

                        sortName: 'usercode',

                        queryParams: {},//condition(),

                        singleSelect: true,

                        //iconCls: "icon-save",//图标  

                        //title: "用户管理",

                        columns: [[      //每个列具体内容  

                                  { field: 'usercode', title: '用户名', width: 100, sortable: true },

                                  { field: 'username', title: '姓名', width: 100, sortable: true },

                                  {

                                      field: 'pwd', title: '密码', width: 100,

                                      formatter: function (value, row, index) {

                                          return '******';

                                      }

                                  },

                                  { field: 'cmt', title: '备注' }

                        ]]

                    })

                }

    2.3.1增加用户

       $('#btnAdd').click(function () {

                    $('#w').dialog({

                        title: '新增数据',

                        width: 400,

                        height: 200,

                        closed: false,

                        cache: false,

                        href: 'useredit.aspx',

                        modal: true,

                        buttons: [{

                            text: '确定',

                            iconCls: 'icon-ok',

                            handler: function () {

                                //数据保存代码                            

                                $('#ff').form('submit', {

                                    url: "useredit.aspx?action=addrecord",    //表单提交地址 并带参数

                                    onSubmit: function () {

                                        return $(this).form('validate');  //验证表单是否通过验证规则

                                    },

                                    success: function (returndata) {

                                        var obj = eval("(" + returndata + ")")

                                        if (obj.isSuccessed) {

                                            $('#dg').datagrid('reload');   //刷新数据表格datagrid

                                            $('#w').dialog('close');    //关闭弹出新增窗口

                                            $.messager.show({

                                                title: '提示',

                                                msg: obj.Message,

                                                timeout: 2000,

                                                showType: 'show'

                                            });

                                        }

                                        else {

                                            alert('保存失败!');

                                        }

                                    }

                                });

                            }

                        }, {

                            text: '关闭',

                            iconCls: 'icon-delete',

                            handler: function () {

                                $('#w').dialog('close');                     //关闭弹出新增窗口

                            }

                        }]

                    });

                });

    2.3.1修改用户

      $('#btnEdit').click(function () {

                    var row = $('#dg').datagrid('getSelected');

                    if (row == null) {

                        $.messager.show({

                            title: '提示',

                            msg: '请选择您要编辑的数据.',

                            timeout: 2000,

                            showType: 'slide'

                        });

                        return;

                    }

     

                    $('#w').dialog({

                        title: '修改数据',

                        width: 400,

                        height: 200,

                        closed: false,

                        cache: false,

                        href: 'useredit.aspx?action=update&id=' + row.usercode,

                        modal: true,

                        buttons: [{

                            text: '确定',

                            iconCls: 'icon-ok',

                            handler: function () {

                                //数据保存代码                            

                                $('#ff').form('submit', {

                                    url: "useredit.aspx?action=updaterecord&id=" + row.usercode,    //表单提交地址 并带参数

                                    onSubmit: function () {

                                        return $(this).form('validate');  //验证表单是否通过验证规则

                                    },

                                    success: function (returndata) {

                                        var obj = eval("(" + returndata + ")")

                                        if (obj.isSuccessed) {

                                            $('#dg').datagrid('reload');   //刷新数据表格datagrid

                                            $('#w').dialog('close');    //关闭弹出新增窗口

                                            $.messager.show({

                                                title: '提示',

                                                msg: obj.Message,

                                                timeout: 2000,

                                                showType: 'show'

                                            });

                                        }

                                        else {

                                            alert('保存失败!');

                                        }

                                    }

                                });

                            }

                        }, {

                            text: '关闭',

                            iconCls: 'icon-delete',

                            handler: function () {

                                $('#w').dialog('close');                     //关闭弹出新增窗口

                            }

                        }]

                    });

                });

    2.3.1删除用户

        $('#btnDel').click(function () {

                    var row = $('#dg').datagrid('getSelected');

                    if (row == null) {

                        $.messager.show({

                            title: '提示',

                            msg: '请选择您要删除的数据.',

                            timeout: 2000,

                            showType: 'slide'

                        });

                        return;

                    }

                    $.ajax({

                        url: 'useredit.aspx?action=delete&id=' + row.usercode,

                        success: function (data) {

                          

                            if (data.isSuccessed) {

                                $('#dg').datagrid('reload');   //刷新数据表格datagrid

     

                                $.messager.show({

                                    title: '提示',

                                    msg: data.Message,

                                    timeout: 2000,

                                    showType: 'show'

                                });

                            }

                            else {

                                alert('删除失败!');

                            }

                        }

     

                    })

     

                });

    2.3.1用户角色分配

      $('#btnrole').click(function () {

                    var row = $('#dg').datagrid('getSelected');

                    if (row == null) {

                        $.messager.show({

                            title: '提示',

                            msg: '请选择您要分配角色的用户.',

                            timeout: 2000,

                            showType: 'slide'

                        });

                        return;

                    }

                    $('#w').dialog({

                        title: '角色数据',

                        width: 400,

                        height: 200,

                        closed: false,

                        cache: false,

                        href: 'userrolelist.aspx?action=choose&id=' + row.usercode,

                        modal: true,

                        buttons: [{

                            text: '确定',

                            iconCls: 'icon-ok',

                            handler: function () {

                                var rolerow = $('#dgrole').datagrid('getSelected');

     

                                $.ajax({

                                    type: "GET",

                                    url: "userrolelist.aspx?action=save",                                    data: { usercode: row.usercode, roleid: rolerow.roleid },

                                                                  success: function (returndata) {

                                        var obj = eval("(" + returndata + ")");

                                        if (obj.isSuccessed) {

                                            $('#w').dialog('close');

                                        }

                                        else { }

                                    }

                                });

                            }

                        }, {

                            text: '关闭',

                            iconCls: 'icon-delete',

                            handler: function () {

                                $('#w').dialog('close');                     //关闭弹出新增窗口

                            }

                        }]

                    });

                });

    2.4、服务器端代码

      private void GetList()

        {

                int pageindex = int.Parse(Request.Form["page"]);

                int pagesize = int.Parse(Request.Form["rows"]);

                string sort = Request.Form["sort"];

                string order = Request.Form["order"];

                string value = Request.Form["value"];

                SYSTEM.BLL.sysuser bll = new SYSTEM.BLL.sysuser();

                DataTable dt = new DataTable();

                ResultData data = new ResultData();

                string strOrder = "";

                if(!string.IsNullOrEmpty(sort))

                {

                    strOrder = sort + " " + order;

                }

                string strWhere = "";

                if (!string.IsNullOrEmpty(value))

                {

                    strWhere = string.Format(" usercode like '%{0}%' or username like '%{0}%'", value);

                }

                data.total = bll.GetRecordCount(strWhere);

                data.rows = bll.GetListByPage(strWhere, strOrder, (pageindex - 1) * pagesize + 1, pageindex * pagesize).Tables[0];

                WriteData(Newtonsoft.Json.JsonConvert.SerializeObject(data));

            }      

     private void Save()

        {     

            model.usercode = Request.Form["usercode"];

            model.username = Request.Form["username"];

            model.cmt = Request.Form["cmt"];

            model.pwd = Request.Form["pwd"];

            if (blluser.Add(model))

            {

                WriteMessage(true, "添加成功");

            }

            else

            {

                WriteMessage(false, "添加失败");

            }      

        }

        private void GetOne()

        {

            SYSTEM.Model.sysuser model = blluser.GetModel(Request["id"].ToString());

     

            WriteData(Newtonsoft.Json.JsonConvert.SerializeObject(model));       

        }

        private void Update()

        {

            //新建对象

            SYSTEM.Model.sysuser model = blluser.GetModel(Request["id"].ToString());       

            model.username = Request.Form["username"].ToString();

            model.cmt = Request.Form["cmt"].ToString();

            if (blluser.Update(model))

            {

                WriteMessage(true, "修改成功!");   //响应,向前端传送数据

            }

            else

            {

                WriteMessage(false, "修改失败!");

            }       

        }

        private void Delete()

        {

            if (blluser.Delete(Request["id"].ToString()))

            {

                WriteMessage(true, "删除成功!");   //响应,向前端传送数据

            }

            else

            {

                WriteMessage(false, "删除失败!");

            }

        }

    3功能三

    3.1、功能名称

    角色管理功能

    3.2、客户端界面及描述

    角色权限查看如图6所示,角色权限保存如图7所示。

    图6角色权限查看

    角色权限查看功能描述:点击查看,即可查看各个角色的对应权限。

    图7角色权限保存

    角色权限保存功能描述:先选择一个角色,再在功能中选择功能,点击保存。再点击查看,即可添加角色对应的功能。

    3.3、客户端主要核心脚本

     function loadtreedata() {

                $('#tg').treegrid({

                    title: '系统功能列表',

                    fit: true,

                    animate: true,//是否用动画效果

                    collapsible: false,//是否可折叠

                    //pagination: true,//分页控件

                    rownumbers: true,//行号

                    //fitColumns: true,

                    url: 'rolelist.aspx?action=menuselect',

                    method: 'get',

                    toolbar: '#menutb',

                    idField: 'id',//根据那个字段判断树节点关系

                    treeField: 'funname',//根据那个列展现树

                    showFooter: false,//是否使用页脚

                    sortName: 'funid',//默认排序字段,后台通过参数名“sort”获取

     

                    singleSelect: false,

                    //sortOrder: 'desc',//默认排序规则,后台通过参数名“order”获取

                    columns: [[

                        { title: '', field: 'funid', hidden: true },

                        { title: '功能', field: 'funname', width: 220, sortable: true },

                        { title: '地址', field: 'url', width: 150, sortable: true },

                        { title: '图标', field: 'icno', width: 80 },

                        { title: '备注', field: 'cmt', width: 100, sortable: true }

     

                    ]],

                    onBeforeExpand: function (node) {

                    },

                    onLoadSuccess: function () {

                    },

                    onClickRow: function (node) {

                        //点击行触发

                    },

                    onClickCell: function (rowIndex, field, value) {//点击表格触发

                    }

                });

            }

     

     function loaddata() {

                $("#dg").datagrid({

                    url: "rolelist.aspx?action=select",//加载的URL  

                    isField: "roleid",

                    pagination: true,//显示分页  

                    pageSize: 5,//分页大小  

                    pageList: [5, 10, 15, 20],//每页的个数  

                    fit: true,//自动补全  

                    fitColumns: true,

                    toolbar: '#tb',

                    sortName: 'roleid',

                    queryParams: {},//condition(),

                    singleSelect: true,

                    //iconCls: "icon-save",//图标  

                    //title: "用户管理",

                    columns: [[      //每个列具体内容  

                              { field: 'roleid', title: '', hidden: true },

                              { field: 'rolename', title: '角色名称', width: 200, sortable: true },

     

                              { field: 'cmt', title: '备注', width: 500 },

                              {

                                  field: 'right', title: '权限',

                                  formatter: function (value, row, index) {

                                      return '<a href="#" οnclick="ShowMenu(' + row.roleid + ')">查看</a>';

                                  }

                              },

                    ]]

                })

            }

      $('#btnSaveMenu').on('click', function () {

                    var row = $('#dg').datagrid('getSelected');

                    if (row == null) {

                        $.messager.show({

                            title: '提示',

                            msg: '请选择你要分配功能的角色.',

                            timeout: 2000,

                            showType: 'slide'

                        });

                        return;

                    }

     

                    var newfunids = [];

                    var rows = $('#tg').treegrid('getSelections');

                    for (i = 0 ; i < rows.length; i++) {

                        newfunids.push(rows[i].id);

                    }

     

                    $.ajax({

                        url: 'rolelist.aspx?action=savemenu&id=' + row.roleid,

                        type: 'post',

                        data: JSON.stringify(newfunids),

                        success: function (data) {

                            var obj = eval("(" + data + ")")

                            if (obj.isSuccessed) {

                                $('#tg').datagrid('reload');   //刷新数据表格datagrid

     

                                $.messager.show({

                                    title: '提示',

                                    msg: obj.Message,

                                    timeout: 2000,

                                    showType: 'show'

                                });

                            }

                            else {

                                alert('保存失败!');

                            }

                        }

     

                    })

     

                });

    3.4、服务器端代码

      private void SaveMenu()

            {

                SYSTEM.BLL.sysrolefun bll = new SYSTEM.BLL.sysrolefun();

                string id = Request["id"].ToString();

                foreach(var m in  bll.GetModelList(string.Format(" roleid = {0}", id)))

                {

                    bll.Delete(m.id);

                }

     

                string[] strarr = HttpUtility.UrlDecode(Request.Form.ToString()).Replace("]", "").Replace("[", "").Split(',');

     

                foreach(var funid in strarr)

                {

                    var mm = new SYSTEM.Model.sysrolefun();

                    mm.funid = decimal.Parse(funid);

                    mm.roleid = decimal.Parse(id);

                    bll.Add(mm);

                }

     

                WriteMessage(true, "OK!");

     

               

            }

    4功能

    4.1、功能名称

    菜单管理功能

    4.2、客户端界面及描述

    菜单管理主界面如图8所示,新增菜单如图9所示,修改菜单如图10所示。

     

    图8菜单管理主界面

    菜单管理主界面描述:点击左边的菜单管理按钮,打开如上图所示的界面。对菜单的相关信息进行管理。

    图9增加菜单

    增加菜单功能描述:点击页面的新增按钮,弹出新增数据界面,对需要的菜单进行添加。点击确定,即可完成添加;点击关闭,添加取消。

    图10修改菜单

    修改菜单功能描述:点击页面的修改按钮,弹出修改数据界面,对需要的菜单进行修改。点击确定,即可完成修改;点击关闭,修改取消。

    4.3、客户端主要核心脚本

    function loaddata() {

                $('#tg').treegrid({

                    title: '',

                    fit: true,

                    animate: true,//是否用动画效果

                    collapsible: false,//是否可折叠

                    //pagination: true,//分页控件

                    rownumbers: true,//行号

                    //fitColumns: true,

                    url: 'menulist.aspx?action=select',

                    method: 'get',

                    toolbar: '#tb',

                    idField: 'id',//根据那个字段判断树节点关系

                    treeField: 'funname',//根据那个列展现树

                    showFooter: false,//是否使用页脚

                    sortName: 'funid',//默认排序字段,后台通过参数名“sort”获取

                    //sortOrder: 'desc',//默认排序规则,后台通过参数名“order”获取

                    columns: [[

                        { title: '功能', field: 'funname', width: 220, sortable: true },

                        { title: '地址', field: 'url', width: 150, sortable: true },

                        { title: '图标', field: 'icno', width: 80 },

                        { title: '备注', field: 'cmt', width: 100, sortable: true }

     

                    ]],

                    onBeforeExpand: function (node) {

                    },

                    onLoadSuccess: function () {

                    },

                    onClickRow: function (node) {

                        //点击行触发

                    },

                    onClickCell: function (rowIndex, field, value) {//点击表格触发

                    }

                });

            }

    <script>

            //获取当前窗口的操作类型

            var action = '<% =action%>';

            var id = '<% =id%>';

            $(function () {

                loadform();  //如果是编辑进入,需要加载编辑数据

                $('#pid').combobox({

                    url:'menuedit.aspx?action=combobox',

                    valueField:'funid',

                    textField:'funname'

                });

                //$('#cc').combotree({

                //    url: 'get_data.php',

                //    required: true

                //});

            })

     

            function loadform() {

                if (action == 'update') {

                    $.ajax({

                        url: 'menuedit.aspx?action=getrecord&id=' + id,

                        success: function (data) {

                            data = eval('(' + data + ')');

                            $('#ff').form('load', data);

                        }

     

                    })

                }

            }

        </script>

     

    4.4、服务器端代码

      private void GetTreeList()

            {

                SYSTEM.BLL.sysfunction bll = new SYSTEM.BLL.sysfunction();

                DataTable dt = new DataTable();

                ResultData data = new ResultData();

              

     

                data.total = bll.GetRecordCount("");

                data.rows = bll.GetTreeList("").Tables[0];

                WriteData(Newtonsoft.Json.JsonConvert.SerializeObject(data));

            }

     

    展开全文
  • 如何设计一个权限管理模块?

    千次阅读 2019-05-29 19:29:42
    比如,管理员登入财务系统,能看见员工模块,员工登录就看不见,这就是菜单权限;员工登录财务系统,只能看见自己的工资明细,却看不见别人的,这就是数据权限。 那么如何做一个实用的权限模块呢? 我们来设计三...

     

    我们每天都在使用各种各样的办公自动化系统,也叫OA、ERP系统。不同的用户登录能看到的菜单和数据资源都不一样。

    比如,管理员登入财务系统,能看见员工模块,员工登录就看不见,这就是菜单权限;员工登录财务系统,只能看见自己的工资明细,却看不见别人的,这就是数据权限。

    那么如何做一个实用的权限模块呢?

    我们来设计三张表,用户表、用户权限表、资源表。

     

    用户表存放账号登录信息,资源表存放菜单和按钮资源,用户权限表存放用户ID和资源ID的关联关系。这样就能表示一个用户拥有哪些资源了。

    哈哈,上面实现资源权限是不是很简单了,那么如何将数据权限加入进去呢?

    这里我们引入一个概念:组织结构,可以将一个部门、一个分组、一个用户看成一个组织,组织之间是具备层级关系的。

     

    我们要用这个组织结构来划分用户数据权限。上图中,admin的组织结构编号为001,A部门就定义为001001,B部门定义为001001001,A组就为001001001001,B组就为001001001002,以此类推,给每一个组织定好编号,根据组织结构,每一个用户都会在组织里,每一条数据都可以跟组织结构关联起来。

    例如:财务人员录入员工工资明细,财务人员的组织结构肯定高于员工,通过组织结构编号就能模糊查询出员工信息,然后给员工录入数据;用户登录之后,可以通过组织结构编号查询属于自己的数据权限。所以编号也不是随便定义的,要有一定规律。

    基于组织结构,我们的权限模块基础表,就可以分为,组织结构表、用户表、用户权限表、资源表。

     

    注意:用户表属于组织结构,要新增组织结构ID作为外键关联,团队、部门、小组都这样关联起来,就可以实现数据权限了。

    运用组织结构的设计模式,基本可以解决OA、ERP等自动化办公系统的权限管理。

     

    更多推送文章请关注公众号:

     

    展开全文
  • 其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: ...
  • 权限管理

    2019-10-10 17:10:42
    基本上涉及到用户参与的系统都要进行权限管理权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份...

    1 权限管理1.1 什么是权限管理

    基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

    权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

    1.2 用户身份认证1.2.1 概念

    身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。

    1.2.2 用户名密码身份认证流程

    1.2.3 关键对象

    上边的流程图中需要理解以下关键对象:

    Subject:主体

    访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;

    Principal:身份信息

    是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。

    credential:凭证信息

    是只有主体自己知道的安全信息,如密码、证书等。

    1.3 授权1.3.1 概念

    授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

    1.3.2 授权流程

    下图中橙色为授权流程。

    1.3.3 关键对象

    授权可简单理解为who对what(which)进行How操作:

    Who,即主体(Subject),主体需要访问系统中的资源。

    What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。

    How,权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。

    权限分为粗颗粒和细颗粒,粗颗粒权限是指对资源类型的权限,细颗粒权限是对资源实例的权限。

    主体、资源、权限关系如下图:

    1.3.4 权限模型

    对上节中的主体、资源、权限通过数据模型表示。

    主体(账号、密码)

    资源(资源名称、访问地址)

    权限(权限名称、资源id)

    角色(角色名称)

    角色和权限关系(角色id、权限id)

    主体和角色关系(主体id、角色id)

    如下图:

    通常企业开发中将资源和权限表合并为一张权限表,如下:

    资源(资源名称、访问地址)

    权限(权限名称、资源id)

    合并为:

    权限(权限名称、资源名称、资源访问地址)

    上图常被称为权限管理的通用模型,不过企业在开发中根据系统自身的特点还会对上图进行修改,但是用户、角色、权限、用户角色关系、角色权限关系是需要去理解的。

    1.3.5 权限分配

    对主体分配权限,主体只允许在权限范围内对资源进行操作,比如:对u01用户分配商品修改权限,u01用户只能对商品进行修改。

    权限分配的数据通常需要持久化,根据上边的数据模型创建表并将用户的权限信息存储在数据库中。

    1.3.6 权限控制

    用户拥有了权限即可操作权限范围内的资源,系统不知道主体是否具有访问权限需要对用户的访问进行控制。

    1.3.6.1 基于角色的访问控制

    RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:

    上图中的判断逻辑代码可以理解为:

    if(主体.hasRole(“总经理角色id”)){

    查询工资

    }

    缺点:以角色进行访问控制粒度较粗,如果上图中查询工资所需要的角色变化为总经理和部门经理,此时就需要修改判断逻辑为“判断主体的角色是否是总经理或部门经理”,系统可扩展性差。

    修改代码如下:

    if(主体.hasRole(“总经理角色id”) || 主体.hasRole(“部门经理角色id”)){

    查询工资

    }

    1.3.6.2 基于资源的访问控制

    RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制,比如:主体必须具有查询工资权限才可以查询员工工资信息等,访问控制流程如下:

    上图中的判断逻辑代码可以理解为:

    if(主体.hasPermission(“查询工资权限标识”)){

    查询工资

    }

    优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化为总经理和部门经理也只需要将“查询工资信息权限”添加到“部门经理角色”的权限列表中,判断逻辑不用修改,系统可扩展性强。

    1 权限管理解决方案1.1 粗颗粒度和细颗粒度1.1.1 什么是粗颗粒度和细颗粒度

    对资源类型的管理称为粗颗粒度权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。

    1.1.2 如何实现粗颗粒度和细颗粒度

    对于粗颗粒度的权限管理可以很容易做系统架构级别的功能,即系统功能操作使用统一的粗颗粒度的权限管理。

    对于细颗粒度的权限管理不建议做成系统架构级别的功能,因为对数据级别的控制是系统的业务需求,随着业务需求的变更业务功能变化的可能性很大,建议对数据级别的权限控制在业务层个性化开发,比如:用户只允许修改自己创建的商品信息可以在service接口添加校验实现,service接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一致则不允许修改商品信息。

    1.2 基于url拦截

    基于url拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行继续访问。

    如下图:

    1.3 使用权限管理框架

    对于权限管理基本上每个系统都有,使用权限管理框架完成权限管理功能的开发可以节省系统开发时间,并且权限管理框架提供了完善的认证和授权功能有利于系统扩展维护,但是学习权限管理框架是需要成本的,所以选择一款简单高效的权限管理框架显得非常重要。

    1 基于url拦截实现1.1 环境准备

    jdk:1.7.0_72

    web容器:tomcat7

    系统框架:springmvc3.2.0+mybatis3.2.7

    (详细参考springmvc教案)

    前台UI:jquery easyUI1.2.2

    1.2 数据库

    创建mysql5.1数据库

    创建用户表、角色表、权限表、角色权限关系表、用户角色关系表。

    导入脚本,先导入shiro_sql_talbe.sql再导入shiro-sql_table_data.sql

    1.3 activeUser用户身份类

    用户登陆成功记录activeUser信息并将activeUser存入session。

    1.4 anonymousURL.properties

    anonymousURL.properties公开访问地址,无需身份认证即可访问。

    1.5 commonURL.properties

    commonURL.properties公共访问地址,身份认证通过无需分配权限即可访问。

    1.6 用户身份认证拦截器

    使用springmvc拦截器对用户身份认证进行拦截,如果用户没有登陆则跳转到登陆页面,本功能也可以使用filter实现 。

    1.7 用户授权拦截器

    使用springmvc拦截器对用户访问url进行拦截,如果用户访问的url没有分配权限则跳转到无权操作提示页面(refuse.jsp),本功能也可以使用filter实现。

    1.8 用户登陆

    用户输入用户账号和密码登陆,登陆成功将用户的身份信息(用户账号、密码、权限菜单、权限url等)记入activeUser类,并写入session。

    1.8.1 controller

    1.8.2 service接口

    1 shiro介绍1.1 什么是shiro

    Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

    1.2 为什么要学shiro

    既然shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。

    shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。

    java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

    1.3 Shiro架构

    1.3.1 Subject

    Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权

    1.3.2 SecurityManager

    SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。

    SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

    1.3.3 Authenticator

    Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

    1.3.4 Authorizer

    Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

    1.3.5 realm

    Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

    注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

    1.3.6 sessionManager

    sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

    1.3.7 SessionDAO

    SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

    1.3.8 CacheManager

    CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

    1.3.9 Cryptography

    Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

    1.4 shiro的jar包

    与其它java开源框架类似,将shiro的jar包加入项目就可以使用shiro提供的功能了。shiro-core是核心包必须选用,还提供了与web整合的shiro-web、与spring整合的shiro-spring、与任务调度quartz整合的shiro-quartz等,下边是shiro各jar包的maven坐标。

    org.apache.shiro

    shiro-core

    1.2.3

    org.apache.shiro

    shiro-web

    1.2.3

    org.apache.shiro

    shiro-spring

    1.2.3

    org.apache.shiro

    shiro-ehcache

    1.2.3

    org.apache.shiro

    shiro-quartz

    1.2.3

    也可以通过引入shiro-all包括shiro所有的包:

    org.apache.shiro

    shiro-all

    1.2.3

    参考lib目录 :

    1 shiro认证1.1 认证流程

    1.2 入门程序(用户登陆和退出)1.2.1 创建java工程

    jdk版本:1.7.0_72

    eclipse:elipse-indigo

    1.2.2 加入shiro-core的Jar包及依赖包

    1.2.3 log4j.properties日志配置文件

    log4j.rootLogger=debug, stdout

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

    1.2.4 shiro.ini

    通过Shiro.ini配置文件初始化SecurityManager环境。

    配置eclipse支持ini文件编辑:

    在eclipse配置后,在classpath创建shiro.ini配置文件,为了方便测试将用户名和密码配置的shiro.ini配置文件中:

    [users]

    zhang=123

    lisi=123

    1.2.5 认证代码

    1.2.6 认证执行流程

    1、 创建token令牌,token中有用户提交的认证信息即账号和密码

    2、 执行subject.login(token),最终由securityManager通过Authenticator进行认证

    3、 Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)

    4、 IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

    1.2.7 常见的异常

    UnknownAccountException

    账号不存在异常如下:

    org.apache.shiro.authc.UnknownAccountException: No account found for user。。。。

    IncorrectCredentialsException

    当输入密码错误会抛此异常,如下:

    org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.

    更多如下:

    DisabledAccountException(帐号被禁用)

    LockedAccountException(帐号被锁定)

    ExcessiveAttemptsException(登录失败次数过多)

    ExpiredCredentialsException(凭证过期)等

    1.3 自定义Realm

    上边的程序使用的是Shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。

    1.3.1 shiro提供的realm

    最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权,通常自定义的realm继承AuthorizingRealm。

    1.3.2 自定义Realm

    1.3.3 shiro-realm.ini

    [main]

    #自定义 realm

    customRealm=cn.itcast.shiro.authentication.realm.CustomRealm1

    #将realm设置到securityManager

    securityManager.realms=$customRealm

    思考:这里为什么不用配置[users]了??

    1.3.4 测试代码

    测试代码同入门程序,将ini的地址修改为shiro-realm.ini。

    分别模拟账号不存在、密码错误、账号和密码正确进行测试。

    1.4 散列算法

    散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容。散列算法常用于对密码进行散列,常用的散列算法有MD5、SHA。

    一般散列算法需要提供一个salt(盐)与原始内容生成摘要信息,这样做的目的是为了安全性,比如:111111的md5值是:96e79218965eb72c92a549dd5a330112,拿着“96e79218965eb72c92a549dd5a330112”去md5破解网站很容易进行破解,如果要是对111111和salt(盐,一个随机数)进行散列,这样虽然密码都是111111加不同的盐会生成不同的散列值。

    1.4.1 例子

    1.4.2 在realm中使用

    实际应用是将盐和散列后的值存在数据库中,自动realm从数据库取出盐和加密后的值由shiro完成密码校验。

    1.4.2.1 自定义realm

    1.4.2.2 realm配置

    配置shiro-cryptography.ini

    1.4.2.3 测试代码

    测试代码同上个章节,注意修改ini路径。

    1 shiro授权1.1 授权流程

    1.2 授权方式

    Shiro 支持三种方式的授权:

    编程式:通过写if/else 授权代码块完成:

    Subject subject = SecurityUtils.getSubject();

    if(subject.hasRole(“admin”)) {

    //有权限

    } else {

    //无权限

    }

    注解式:通过在执行的Java方法上放置相应的注解完成:

    @RequiresRoles(“admin”)

    public void hello() {

    //有权限

    }

    JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:

    <shiro:hasRole name=“admin”>

    <!— 有权限—>

    </shiro:hasRole>

    本教程序授权测试使用第一种编程方式,实际与web系统集成使用后两种方式。

    1.3 授权测试1.3.1 shiro-permission.ini

    创建存放权限的配置文件shiro-permission.ini,如下:

    在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2…” “角色=权限1,权限2…”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。

    1.3.2 权限字符串规则

    权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

    例子:

    用户创建权限:user:create,或user:create:*

    用户修改实例001的权限:user:update:001

    用户实例001的所有权限:user:*:001

    1.3.3 测试代码

    测试代码同认证代码,注意ini地址改为shiro-permission.ini,主要学习下边授权的方法,注意:在用户认证通过后执行下边的授权代码。

    1.3.4 基于角色的授权

    对应的check方法:

    上边check方法如果授权失败则抛出异常:

    org.apache.shiro.authz.UnauthorizedException: Subject does not have role […]

    1.3.5 基于资源授权

    对应的check方法:

    上边check方法如果授权失败则抛出异常:

    org.apache.shiro.authz.UnauthorizedException: Subject does not have permission […]

    1.4 自定义realm

    与上边认证自定义realm一样,大部分情况是要从数据库获取权限数据,这里直接实现基于资源的授权。

    1.4.1 realm代码

    在认证章节写的自定义realm类中完善doGetAuthorizationInfo方法,此方法需要完成:根据用户身份信息从数据库查询权限字符串,由shiro进行授权。

    1.4.2 shiro-realm.ini

    ini配置文件还使用认证阶段使用的,不用改变。

    思考:shiro-permission.ini中的[roles]为什么不需要了??

    1.4.3 测试代码

    同上边的授权测试代码,注意修改ini地址为shiro-realm.ini。

    1.4.4 授权执行流程

    1、执行subject.isPermitted(“user:create”)

    2、securityManager通过ModularRealmAuthorizer进行授权

    3、ModularRealmAuthorizer调用realm获取权限信息

    4、ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配

    1 shiro与项目集成开发

    1.1 shiro与spring web项目整合

    shiro与springweb项目整合在“基于url拦截实现的工程”基础上整合,基于url拦截实现的工程的技术架构是springmvc+mybatis,整合注意两点:

    1、shiro与spring整合

    2、加入shiro对web应用的支持

    1.1.1 取消原springmvc认证和授权拦截器

    去掉springmvc.xml中配置的LoginInterceptor和PermissionInterceptor拦截器。

    1.1.2 加入shiro的 jar包

    1.1.3 web.xml添加shiro Filter

    1.1.4 applicationContext-shiro.xml

    securityManager:这个属性是必须的。

    loginUrl:没有登录认证的用户请求将跳转到此地址进行认证,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。

    unauthorizedUrl:没有权限默认跳转的页面。

    1.1.5 自定义realm

    此realm先不从数据库查询权限数据,当前需要先将shiro整合完成,在上边章节定义的realm基础上修改。

    1.1.6 登录

    1.1.7 首页

    由于session由shiro管理,需要修改首页的controller方法,将session中的数据通过model传到页面。

    1.1.8 退出

    由于使用shiro的sessionManager,不用开发退出功能,使用shiro的logout拦截器即可。

    /logout.action = logout

    1.1.9 无权限refuse.jsp

    当用户无操作权限,shiro将跳转到refuse.jsp页面。

    1.1.10 shiro过虑器总结

    anon:例子/admins/**=anon 没有参数,表示可以匿名使用。

    authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,FormAuthenticationFilter是表单认证,没有参数

    roles:例子/admins/user/=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/=roles[“admin,guest”],每个参数通过才算通过,相当于hasAllRoles()方法。

    perms:例子/admins/user/=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/=perms[“user:add:,user:modify:”],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

    rest:例子/admins/user/=rest[user],根据请求的方法,相当于/admins/user/=perms[user:method] ,其中method为post,get,delete等。

    port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。

    authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证

    ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

    user:例如/admins/user/**=user没有参数表示必须存在用户, 身份认证通过或通过记住我认证通过的可以访问,当登入操作时不做检查

    注:

    anon,authcBasic,auchc,user是认证过滤器,

    perms,roles,ssl,rest,port是授权过滤器

    1.2 认证1.2.1 添加凭证匹配器

    添加凭证匹配器实现md5加密校验。

    修改applicationContext-shiro.xml:

    1.2.2 修改realm认证方法

    修改realm代码从数据库中查询用户身份信息,将sysService注入realm。

    1.3 授权1.3.1 修改realm授权方法

    修改realm代码从数据库中查询权限信息,将sysService注入realm。

    1.3.2 对controller开启AOP

    在springmvc.xml中配置shiro注解支持,可在controller方法中使用shiro注解配置权限:

    1.3.3 权限注解控制

    商品查询controller方法添加权限(item:query):

    上边代码@RequiresPermissions(“item:query”)表示必须拥有“item:query”权限方可执行。

    同理,商品修改controller方法添加权限(item:update):

    1.3.4 jsp标签控制1.3.4.1 标签介绍

    Jsp页面添加:

    <%@ tagliburi="http://shiro.apache.org/tags"prefix=“shiro” %>

    1.3.4.2 jsp页面添加标签

    如果有商品修改权限页面显示“修改”链接。

    1.4 缓存

    shiro每次授权都会通过realm获取权限信息,为了提高访问速度需要添加缓存,第一次从realm中读取权限数据,之后不再读取,这里Shiro和Ehcache整合。

    1.4.1 添加Ehcache的jar包

    1.4.2 配置cacheManager

    在applicationContext-shiro.xml中配置缓存管理器。

    1.4.3 配置shiro-ehcache.xml

    1.4.4 清空缓存

    当用户权限修改后,用户再次登陆shiro会自动调用realm从数据库获取权限数据,如果在修改权限后想立即清除缓存则可以调用realm的clearCache方法清除缓存。

    realm中定义clearCached方法:

    在权限修改后调用realm中的方法,realm已经由spring管理,所以从spring中获取realm实例,调用clearCached方法。

    1.5 session管理

    在applicationContext-shiro.xml中配置sessionManager:

    1.6 验证码1.6.1 自定义FormAuthenticationFilter

    需要在验证账号和名称之前校验验证码。

    1.6.2 FormAuthenticationFilter配置

    修改applicationContext-shiro.xml中对FormAuthenticationFilter的配置。

    在shiroFilter中添加filters:

    formAuthenticationFilter定义

    1.6.3 登陆页面

    添加验证码:

    1.6.4 配置validatecode.jsp匿名访问

    修改applicationContext-shiro.xml:

    1.7 记住我

    用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆。

    1.7.1 用户身份实现java.io.Serializable接口

    向cookie记录身份信息需要用户身份信息对象实现序列化接口,如下:

    1.7.2 配置rememberMeManager

    1.7.3 FormAuthenticationFilter配置

    修改formAuthenticationFitler添加页面中“记住我checkbox”的input名称:

    1.7.4 登陆页面

    在login.jsp中添加“记住我”checkbox。

    展开全文
  • Android权限管理

    千次阅读 2019-07-17 12:39:52
    Android权限管理(PermissionsDispatcher框架使用)简述一、Android权限二、6.0以上权限管理 简述 由于对于安全考虑,Android对于权限管理更加的严谨,以6.0位界分为两种处理方式:6.0以下系统还是保持旧的处理...
  • shiro、基于url权限管理、超详细

    万次阅读 多人点赞 2018-10-14 15:27:38
    如果需要本篇博客内容的代码!... ... 只要有用户参与的系统一般都要有权限管理权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 ...
  • 常见模块设计--权限管理(一)

    万次阅读 多人点赞 2017-05-31 23:29:57
    也就是说一个用户可以有多个角色,一个角色可以有多个权限,通过将角色和权限分离开来提高设计的可扩展性,通常一个用户有多个角色,一个角色也会属于多个用户(多对多),一个角色有多个权限,一个权限也会属于多个...
  • 系统权限管理设计

    万次阅读 多人点赞 2014-07-16 12:19:47
    关于权限菜单的设计
  • 权限管理框架

    千次阅读 2019-04-15 14:40:52
    之前看的视频笔记, 做个备份,以免想找的时候总找不到。... 基本上涉及到用户参与的系统都要进行权限管理权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略...
  • 3. 掌握基于url的权限管理(不使用Shiro权限框架的情况下实现权限管理) 4. shiro实现用户认证 5. shiro实现用户授权 6. shiro与企业web项目整合开发的方法 权限管理原理知识 什么是权限管理 只要有用户参与的系统一般...
  • php后台权限授权管理系统的思路

    千次阅读 2018-05-11 09:12:11
    建立3个表: auth_rule 权限规则 例如:user/index 还有pid 比如系统管理下面有菜单管理 ...auth_group_access 权限授权,授权 给用户,是否有这个权限。含:uid->用户的id, group_id权限组的id->超级管理员or
  • 权限管理——用户认证和用户授权

    万次阅读 2016-07-16 21:42:10
    因为做了权限的项目经理,so,恶补一下一个权限框架:shiro。其实作为框架首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但框架没有必要这样。框架应该尽可能掩盖复杂的地方,露出一个干净而直观...
  • 权限管理及实现思路

    万次阅读 2013-03-01 11:05:54
    一个系统包含众多模块,要求能够通过权限管理,控制不同用户对模块的访问权限,而且需要控制到对某个模块的某个操作(增删改查)的级别。一般情况下,通过角色对用户进行统一授权,在某些特殊情况下,能够单独对用户...
  • 给数据库用户授权1–授权、查,增,改的方法use StudentManageDB go --分配权限 grant select,insert,Update on Students to sharkUser01 grant create table to sharkUser01发现可以对查、增、改操作,但是不能执行...
  • Hadoop用户权限管理及hdfs权限管理

    万次阅读 2018-05-08 16:11:53
    1.创建用户student1,所属分组为studentschown -R student1:students /home/hadoop/hadoop-2.7.6 root用户将hadoop的相关操作权限授予student12.修改Hadoop目录的权限 chmod -R 755 /home/hadoop/hadoop-2.7.63....
  • 这就极大地简化了权限管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以 很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新...
  • 分级权限分配

    千次阅读 2019-05-30 17:51:27
    _=1559207520060 ...多部门共用系统、各个部门有其自己的管理员,并给其部门员工分配权限,即实现多级管理员层层分配,分级管理员只能管理自己职责范围内的模板权限分配,FineReport自主...
  • 通用权限管理系统-Bootstrap框架/JasigCAS单点登录/Dubbo接口授权: 已经放到GitHub,请参阅这里:https://github.com/pumadong/cl-privilege 这已经是第三个版本,放弃了Thrift这个通讯框架,改用Dubbo;对于界面,...
1 2 3 4 5 ... 20
收藏数 1,175,197
精华内容 470,078
关键字:

权限管理