ASP.NET网站权限设计实现(二)——角色权限绑定

1、关于使用的几张表的说明

(1)Module:模块表,记录模块名称、编码等模块基本数据。

(2)Permissions:权限表,记录所有模块权限distinct之后的数据。

(3)ModulePermissions:模块权限,记录每个模块对应的权限,一个模块可能存在多条数据,每条表示该模块的一个操作权限。

(4)Roles:角色表,记录角色名称、编码等角色基本数据。

(5)RolePermissions:角色权限表,记录每个角色对应的权限,一个角色可能存在多条数据,每条数据表示该角色在某个模块的一个操作权限;表中的数据其实记录的是角色编码跟ModulePermissions表中的主键对应,表ModulePermissions中特定主键的数据行就表示了某个模块的一个操作权限。

(6)SUser:用户表,记录用户名等用户基本信息。

(7)UserRole:用户角色表,记录每个用户对应的角色,可以是多个,但本例只设置对应一个,只要用户具有了某个角色,那么该用户就具有了和角色一样的权限。

2、关于PowerDesigher :上一篇介绍了初次在数据库生成表的过程,实际上还可以实现更新和逆向操作(根据数据库中的表在PD中生成表模型)。

3、模拟数据

(1)表Module

(2)表Permissions

(3)表ModulePermissions

4、角色分页显示和删除

这里实现功能的代码基本都是最初级的代码,后面另一个版本会在架构、UI、代码等方面进行较大的改进;另外这里的代码纯粹是演示,不会考虑注入、异常等方面的处理。

(1)分页显示数据直接使用GridView了

(2)在列表页面可以全选本页数据一次性删除,全选/全取消使用JQuery实现,选中时将值(这里是角色编码)保存在一个隐藏域中,隐藏域中的值的格式:‘值1‘,‘值2‘,...(数据库中的RoleCode列的数据类型是nvarchar);取消选中时将隐藏域中的值清空;单行CheckBox选中/取消时,将当前行的值追加到隐藏域的值或从隐藏域的值中移除当前行的值 。删除时先判断隐藏域的值是否为空,如果为空提示”选中数据“,如果不为空提示”确定删除吗?“,确认删除后,根据隐藏域中的值构造delete语句(使用in子句)将数据删除。

(3)代码

Index.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Role_Index" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>角色管理</title>
    <script type="text/javascript" src="../Scripts/jquery-1.4.1.min.js"></script>
    <script type="text/javascript">
        //全选/取消CheckBox
        function CheckAll(cbAllId) {
            var keys = $("#txtKeys").val("").val();
            //遍历页面中所有CheckBox,
            //根据GridView头中CheckBox的checked值设置所有CheckBox的checked值,
            //同时,如果Header中CheckBox为选中则获取所有其他CheckBox的值(角色编码),
            //构造:‘值‘,‘值‘,...格式的字符串,方便in查询,
            //如果Header中CheckBox的Checked值为false则清空txtKeys中的值
            $(":checkbox").each(function () {
                //设置当前遍历到的CheckBox的选中状态跟“全选”CheckBox一样
                $(this).attr("checked", $("#cbAll").attr("checked"));
                //如果当前CheckBox选中,将值追加到隐藏域的value
                var cbValue = "‘" + $(this).val() + "‘,";
                if ($("#cbAll").attr("checked") && $(this).attr("id") != "cbAll") {
                    keys += cbValue;
                }
            });

$("#txtKeys").val(keys);
        }
        //单行选择
        function CheckRow(cb) {
            var keys = $("#txtKeys").val();
            var cbValue = "‘" + $(cb).val() + "‘,";
            //移除
            if (!$(cb).attr("checked")) {
                keys = keys.replace(cbValue, "");
            } else if (keys.indexOf(cbValue) == -1) {//追加
                keys += cbValue;
            }
            $("#txtKeys").val(keys);
        }

//删除时检查是否选中任何记录,如果是让用户确认删除操作
        function ConfirmDel() {
            if ($("#txtKeys").val().length == 0) {
                alert("请先选择要删除的数据");
                return false;
            } else {
                return confirm("确定要删除选中的数据吗?");
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    请输入角色名称:<asp:TextBox ID="txtKeyword" runat="server" Width="301px"></asp:TextBox>
    <asp:Button ID="btnQuery" runat="server" Text="查询" onclick="btnQuery_Click" />
    <!--存储选中项的值列表,以“,”间隔,删除时直接取值构造SQL-->
    <asp:HiddenField ID="txtKeys" runat="server" EnableViewState="false" />
    <div>
        <asp:GridView ID="gvRole" runat="server" AutoGenerateColumns="False" EnableModelValidation="True"
            Width="100%" AllowPaging="True" DataKeyNames="RoleCode" OnPageIndexChanging="gvRole_PageIndexChanging"
            OnRowDataBound="gvRole_RowDataBound" PageSize="4" >
            <Columns>
                <asp:TemplateField>
                    <HeaderTemplate>
                        <input id="cbAll" type="checkbox" onclick="CheckAll();" />
                    </HeaderTemplate>
                    <ItemTemplate>
                        <input id="cbRow" value=‘<%#Eval("RoleCode") %>‘ type="checkbox" onclick="CheckRow(this);" />
                    </ItemTemplate>
                    <ItemStyle Width="30px" />
                </asp:TemplateField>
                <asp:BoundField HeaderText="序号" HeaderStyle-Width="50px" ItemStyle-Width="50px">
                    <HeaderStyle Width="50px"></HeaderStyle>
                    <ItemStyle Width="50px"></ItemStyle>
                </asp:BoundField>
                <asp:BoundField DataField="RoleName" HeaderText="角色名称" />
                <asp:BoundField DataField="RoleCode" HeaderText="角色编码" />
                <asp:HyperLinkField Text="编辑" HeaderStyle-Width="50px" ItemStyle-Width="50px" DataNavigateUrlFields="RoleCode,RoleName"
                    DataNavigateUrlFormatString="Edit.aspx?RoleCode={0}&RoleName={1}">
                    <HeaderStyle Width="50px"></HeaderStyle>
                    <ItemStyle Width="50px"></ItemStyle>
                </asp:HyperLinkField>
            </Columns>
            <EmptyDataTemplate>
                没有数据。
            </EmptyDataTemplate>
            <PagerSettings Position="TopAndBottom" />
        </asp:GridView>
    </div>
    <asp:HyperLink ID="hlNew" runat="server" NavigateUrl="~/Role/Edit.aspx">新增</asp:HyperLink>&nbsp;|&nbsp;
    <asp:LinkButton ID="lbDelete" runat="server" 
        OnClientClick="return ConfirmDel();" onclick="lbDelete_Click">删除</asp:LinkButton>
    </form>
</body>
</html>

说明:

$("#txtKeys") :JQuery得到ID为txtKeys的元素

$("#txtKeys").val() ;:获得ID为txtKeys的元素的值

$("#txtKeys").val("");:设置ID为txtKeys的元素的值,这里是空字符串

$(":checkbox").each(function () { });:遍历当前文档中CheckBox类型的元素,并在function中进行处理

$(this).attr("checked");:获得当前遍历到的CheckBox的checked属性的值

$(this).attr("checked", $("#cbAll").attr("checked"));:设置当前CheckBox的选中状态跟“全选”CheckBox一样,实际上就是通过这种方式给当前CheckBox的checked属性

注意所有CheckBox都有客户端onclick事件,触发时会调用不同JavaScript函数执行

用到的Web服务器控件:TextBox 、Button、HiddenField、GridView、HyperLink、LinkButton

Index.aspx.cs

using System;
using System.Web.UI.WebControls;
using System.Data;

public partial class Role_Index : System.Web.UI.Page
{

private void BindRoles()
    {
        string keyWord = this.txtKeyword.Text.Trim();
        string querySql =
            string.Format("select * from Roles where RoleVisible=1 and RoleName Like ‘%{0}%‘", keyWord);
        SqlHelper dbHelper = new SqlHelper();
        DataTable dtRole = new DataTable();
        dbHelper.FillDataTable(querySql, dtRole);

gvRole.DataSource = dtRole;
        gvRole.DataBind();
    }

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindRoles();
        }
    }
    //翻页
    protected void gvRole_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvRole.PageIndex = e.NewPageIndex;
        BindRoles();
    }
    protected void gvRole_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //行编号
            e.Row.Cells[1].Text = 
                Convert.ToString(gvRole.PageSize * gvRole.PageIndex + e.Row.RowIndex + 1);
        }
    }
    //查询
    protected void btnQuery_Click(object sender, EventArgs e)
    {
        BindRoles();
    }
    //删除
    protected void lbDelete_Click(object sender, EventArgs e)
    {
        string keys = txtKeys.Value.Trim();
        string deleteSql = string.Format("delete from Roles where RoleCode in ({0})",
            keys.TrimEnd(‘,‘));
        SqlHelper dbHelper = new SqlHelper();
        if (dbHelper.ExecuteNonQueryWithTran(deleteSql))
        {
            BindRoles();
            txtKeys.Value = "";
        }
        else
        {
            ClientScript.RegisterStartupScript(this.GetType(),"Infomation", "alert(‘删除失败!‘);",true);
        }
    }
}

说明:

SqlHelper:是数据访问类,包含一些方法提供对数据库的访问和操作

ExecuteNonQueryWithTran:调用SqlCommand的ExecuteNonQuery方法执行insert、update、delete语句,添加了事务处理

5、角色新增和修改

(1)新建角色

这儿的关键是绑定权限、全选或全取消及获取选中项的值、构造insert语句,先看一下页面运行后的结果

(1.1)绑定权限

使用两个GridView嵌套,最外面的(gvParent)显示顶级模块名称;嵌套在内的(gvChild)在gvParent的RowDataBound中进行数据绑定以显示二级模块名称(根据gvParent当前行的模块编码Moudle表中查询数据; 在gvChild的RowDataBound中绑定权限复选框列表,数据根据gvChild当前行的模块编码从下面视图(V_ModulePermissions)中查询,这里的复选框用的是<input type="checkbox" />,首先跟权限的数量构造CheckBox的html代码字符串,然后用Label显示出来,由于Label在客户端生成的代码中将变为所有这些CheckBox的父元素,所以也方便将来实现单模块的全选或者全取消,具体内容看后面代码。

视图V_ModulePermissions:

SQL:

SELECT     dbo.Permissions.PermissionName, dbo.ModulePermissions.ModuleCode, dbo.ModulePermissions.PermissionCode, dbo.ModulePermissions.ID
FROM         dbo.ModulePermissions INNER JOIN
                      dbo.Permissions ON dbo.ModulePermissions.PermissionCode = dbo.Permissions.PermissionCode INNER JOIN
                      dbo.Module ON dbo.ModulePermissions.ModuleCode = dbo.Module.ModuleCode
WHERE     (dbo.Module.ModuleVisible = 1) AND (dbo.Permissions.PermissionVisible = 1)

(1.2)全选或全取消及获取选中项的值

每一个CheckBox的Click事件触发时都会调用一个JavaScript函数执行,这些函数不仅是完成选中或者取消选中,还要完成获得并追加或移除相应的CheckBox的值,最终构造的字符串是这种格式:,1,,2,,3,,4,...,并存储在隐藏域中。代码后面附上 。

(1.3)构造insert语句

获取隐藏域的值进行字符串替换和拆分,遍历拆分出来的数据,构造insert语句,最后执行。

(2)修改角色

关键是设置当前角色已有权限项选中,先看页面结果

这里的处理是根据URL参数RoleCode的值从视图V_RolePermissions查询该角色的所有权限,然后构造一个字符串,在构造<input type="checkbox" />时判断该字符串是否包含此权限的标识,如果包含,就添加 checked属性。

SQL:

SELECT     dbo.V_ModulePermissions.ID, dbo.RolePermissions.RoleCode
FROM         dbo.V_ModulePermissions INNER JOIN
                      dbo.RolePermissions ON dbo.V_ModulePermissions.ID = dbo.RolePermissions.ModulePermissionID

(3)新建、修改全部代码

Edit.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Edit.aspx.cs" Inherits="Role_Edit" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>编辑角色</title>
    <script type="text/javascript" src="../Scripts/jquery-1.4.1.min.js"></script>
    <script type="text/javascript">
        //全部模块全选或全取消
        function cbAllCheck(obj) {
            $("#txtPermissions").val("");
            $(":checkbox").each(function () {
                $(this).attr("checked", $(obj).attr("checked"));
                if ($(obj).attr("checked")) {
                    if ($(this).val() != "on") {
                        $("#txtPermissions").val($("#txtPermissions").val() + "," + $(this).val() + ",");
                    }
                } 
            });
        }

//当前模块全选或全取消
        function cbModuleCheck(obj, cblID) {
            $("#" + cblID).find(":input").each(function () {
                $(this).attr("checked", $(obj).attr("checked"));
                if ($(obj).attr("checked")) {
                    if ($("#txtPermissions").val().indexOf("," + $(this).val() + ",") == -1) {
                        $("#txtPermissions").val($("#txtPermissions").val() + "," + $(this).val() + ",");
                    }
                } else {
                    $("#txtPermissions").val(
                        $("#txtPermissions").val().replace("," + $(this).val() + ",", ""));
                }
            });
        }
        //当前权限选中或取消
        function cbPermissionCheck(obj) {
            if ($(obj).attr("checked")) {
                $("#txtPermissions").val($("#txtPermissions").val() + "," + $(obj).val() + ",");
            } else {
                $("#txtPermissions").val(
                        $("#txtPermissions").val().replace("," + $(obj).val() + ",", ""));
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:HiddenField ID="txtPermissions" runat="server" />
    <div>
        角色名称:<asp:TextBox ID="txtRoleName" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
            ControlToValidate="txtRoleName" Display="Dynamic" ErrorMessage="&lt;---请填写角色名称"></asp:RequiredFieldValidator>
    </div>
    <div>
        角色编码:<asp:TextBox ID="txtRoleCode" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" 
            ControlToValidate="txtRoleCode" Display="Dynamic" ErrorMessage="&lt;---请填写角色编码"></asp:RequiredFieldValidator>
    </div>
    <div><input id="cbAll" type="checkbox" onclick="cbAllCheck(this)" />全选</div>
    <div>
        <asp:GridView runat="server" ID="gvParent" AutoGenerateColumns="False" EnableModelValidation="True"
            DataKeyNames="ModuleCode" ShowHeader="false" 
            OnRowDataBound="gvParent_RowDataBound" Width="100%">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Label ID="lblTopModule" runat="server" Font-Bold="true" Text=‘<%# Eval("ModuleName") %>‘></asp:Label>
                        <br />
                        <asp:GridView runat="server" ID="gvChild" AutoGenerateColumns="False" EnableModelValidation="True"
                            DataKeyNames="ModuleCode" ShowHeader="false" 
                            OnRowDataBound="gvChild_RowDataBound" Width="100%">
                            <Columns>
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:Label ID="lblMoudle" runat="server" Text=‘<%# Eval("ModuleName") %>‘></asp:Label>
                                        <asp:CheckBox id="cbModule" runat="server"/>全选
                                        <br />
                                        <asp:Label ID="lblPermissions" runat="server"></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
                            </Columns>
                        </asp:GridView>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
    <div>
        <asp:Button ID="btnSubmit" runat="server" Text="提交" onclick="btnSubmit_Click" />
    </div>
    </form>
</body>
</html>

Edit.aspx.cs

using System;
using System.Web.UI.WebControls;
using System.Data;
using System.Text;

public partial class Role_Edit : System.Web.UI.Page
{
    private DataSet ds = new DataSet();
    private StringBuilder RolePermission { get; set; }

private void BindTopModule()
    {
        if (ds != null && ds.Tables.Count > 0)
        {
            //筛选顶级模块
            DataRow[] drs = ds.Tables[0].Select("ParentCode=‘0‘");
            //克隆表结构
            DataTable dt = ds.Tables[0].Clone();
            foreach (DataRow dr in drs)
            {
                dt.ImportRow(dr); 
            }
            gvParent.DataSource = dt;
            gvParent.DataBind();
        }
    }
    private void SetRolePermission()
    {
        string querySql = string.Format("select * from V_RolePermissions where RoleCode=‘{0}‘",
            ViewState["RoleCode"]);
        DataTable dt = new DataTable();
        SqlHelper helper = new SqlHelper();
        helper.FillDataTable(querySql, dt);
        if (dt != null)
        {
            foreach (DataRow dr in dt.Rows)
            {
                RolePermission.Append("," + dr["ID"].ToString() + ",");
            }
        }
    }

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            txtRoleName.Text = Request.QueryString["RoleName"];
            ViewState["RoleCode"] = txtRoleCode.Text = Request.QueryString["RoleCode"];
            //修改时根据RoleCode获得当前Role的所有权限ID
            if (ViewState["RoleCode"]!=null)
            {
                RolePermission = new StringBuilder(); ;
                SetRolePermission();
                txtPermissions.Value = RolePermission.ToString();
            }
            SqlHelper helper = new SqlHelper();
            String querySql = "select * from Module where ModuleVisible=1;select * from V_ModulePermissions";
            helper.FillDataSet(querySql, ds) ;
            BindTopModule();
        }
    }

protected void gvParent_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridView gv = (GridView)e.Row.FindControl("gvChild");
            if (ds != null && ds.Tables.Count > 0)
            {
                DataRow[] drs = ds.Tables[0].Select("ParentCode=‘" + gvParent.DataKeys[e.Row.RowIndex].Value + "‘");
                DataTable dt = ds.Tables[0].Clone();
                foreach (DataRow dr in drs)
                {
                    dt.ImportRow(dr); 
                }
                gv.DataSource = dt;
                gv.DataBind();
            }
        }
    }

protected void gvChild_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (ds != null && ds.Tables.Count > 1)
            {
                Label lblPermissions = (Label)e.Row.FindControl("lblPermissions");
                StringBuilder appendCheckBox = new StringBuilder();
                DataRow[] drs = ds.Tables[1].Select("ModuleCode=‘" + ((GridView)sender).DataKeys[e.Row.RowIndex].Value + "‘");
                for (int index = 0; index < drs.Length;index++ )
                {
                    DataRow dr = drs[index];
                    appendCheckBox.Append(
                        string.Format("<input type=‘checkbox‘ id=‘{0}‘ value=‘{1}‘ onclick=‘cbPermissionCheck(this)‘ {3} />{2} ",
                        "cb" + e.Row.RowIndex.ToString("00") + index.ToString("00"),
                        dr["ID"].ToString(),
                        dr["PermissionName"].ToString(),
                        RolePermission != null && RolePermission.ToString().IndexOf("," + dr["ID"].ToString() + ",") >= 0 ? "checked" : ""
                        )
                        );
                    //(delegate(string id){return id==dr["id"].ToString();})>=0
                }

lblPermissions.Text = appendCheckBox.ToString();

((CheckBox)e.Row.FindControl("cbModule")).Attributes.Add("onclick", "cbModuleCheck(this,‘" + lblPermissions.ClientID+ "‘)");
            }
        }
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        if (IsValid)
        {
            string roleName = txtRoleName.Text.Trim();
            string roleCode = txtRoleCode.Text.Trim();
            string[] permissions = txtPermissions.Value
                .TrimStart(‘,‘)
                .TrimEnd(‘,‘)
                .Replace(",,", ",")
                .Split(‘,‘);
            StringBuilder appendSql = new StringBuilder();
            if (ViewState["RoleCode"] != null)
            {
                appendSql.Append(string.Format("delete from RolePermissions where RoleCode=‘{0}‘;", ViewState["RoleCode"]));
                appendSql.Append(string.Format("update Roles set RoleCode=‘{0}‘,RoleName=‘{1}‘ where RoleCode=‘{2}‘",
                    roleCode, roleName, ViewState["RoleCode"]));
            }
            else
            {
                appendSql.Append(string.Format("insert into Roles(RoleCode,RoleName) values(‘{0}‘,‘{1}‘)",
                    roleCode, roleName));
            }
            foreach (string s in permissions)
            {
                if (!string.IsNullOrEmpty(s))
                {
                    appendSql.Append(
                        string.Format(";insert into dbo.RolePermissions values(‘{0}‘,{1})",
                            roleCode, s));
                }
            }

txtPermissions.Value = "";

//Response.Write(appendSql.ToString());

SqlHelper helper = new SqlHelper();
            if (helper.ExecuteNonQueryWithTran(appendSql.ToString()))
            {
                Response.Redirect("../Redirect.html?Role/Index.aspx");
            }
            else
            {
                ClientScript.RegisterStartupScript(this.GetType(), "Infomation", "alert(‘操作失败!‘);", true);
            }
        }
    }
}

(4)操作成功后的提示及页面跳转

Redirect.html

使用setInterval函数倒计时

获取传递过来的路径(传递的是相对路径),倒计时到0秒时,使用window.clearInterval(intervalId)清除setInterval事件,并指定window.location.href=路径,使得由当前页跳转到目的页

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>继续</title>
    <script type="text/javascript">
        //秒数
        var count = 3;
        //setIntervalId
        var setIntervalId;
        var url = location.href;
        url = url.substring(url.indexOf("?") + 1, url.length);
        function Redirect() {
            var displayOjb = document.getElementById("showTime")
            if (count == 0) {
                //清除setInterval
                window.clearInterval(setIntervalId);
                displayOjb.innerHTML = "网页正在自动跳转";
                location.href = url;
            }
            else {
                displayOjb.innerHTML = "操作成功!" + count + "秒后网页自动跳转。";
                count--;
            }
        }
        setIntervalId = setInterval("Redirect()", 1000);
    </script>
</head>
<body>
<div id="showTime"></div>
</body>
</html>

OK,到此全部完成,感觉说的太多了,所以有些内容没介绍,看代码吧。

ASP.NET网站权限设计实现(二)——角色权限绑定

时间: 2024-08-04 21:59:47

ASP.NET网站权限设计实现(二)——角色权限绑定的相关文章

java权限管理与用户角色权限设计

java权限管理与用户角色权限设计 实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能.因此B/S业务系统都需要有一个或多个权限系统来实现访问权限检测,让经过授权的用户可以正常合法的使用已授权功能,而对那些未经授权的“非法用户”将

【数据库设计-2】权限设计-系统登录用户权限设计

需求分析---场景 假设需要为公司设计一个人员管理系统,并为各级领导及全体员工分配系统登录账号.有如下几个要求: 1. 权限等级不同:公司领导登录后可查看所有员工信息,部门领导登录后只可查看本部门员工的信息,员工登录后只可查看自己的信息: 2. 访问权限不同:如公司领导登录后,可查看员工薪水分布界面,而员工则不能看到: 3. 操作权限不同:如系统管理员可以在信息发布界面进行增删改查发布信息,而普通员工只可以在信息发布界面进行查看,不能修改.删除和新增. 功能分析 1. 登录一个系统,基本都需要用

权限设计-系统登录用户权限设计

需求分析-场景 假设需要为公司设计一个人员管理系统,并为各级领导及全体员工分配系统登录账号.有如下几个要求: 1. 权限等级不同:公司领导登录后可查看所有员工信息,部门领导登录后只可查看本部门员工的信息,员工登录后只可查看自己的信息: 2. 访问权限不同:如公司领导登录后,可查看员工薪水分布界面,而员工则不能看到: 3. 操作权限不同:如系统管理员可以在信息发布界面进行增删改查发布信息,而普通员工只可以在信息发布界面进行查看,不能修改.删除和新增. 功能分析 1. 登录一个系统,基本都需要用户输

RABC权限控制(页面操作角色,权限和进行分配)

上一节主要说的是如何通过url进行权限控制,这一节就说一下如何开发一个权限控制的界面,这样我们就能很方便的创建角色,并分配给用户不同角色和不同权限. 1.编写角色管理页面 这个编写较为简单,主要是通过modelform快速实现的,下面代码比较简单,我就不多说了 效果图如下: 代码如下: def role_list(request): """角色列表""" roles_list = Role.objects.all() # 分页 current_p

权限设计(二)

针对这样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的). 其实比新闻更好的例子是论坛板块的版主. 下面是版本二的解决方案: 在版本二的功能表中加入了一个ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类A的ResourceType为:NTA,分类B为:NTB): 功能表: Functi

PHP-购物网站开发设计(二)

2015-07-7 今天介绍购物网站的后台数据库设计,数据库使用的是MySQL (1)在MySQL数据库中新建Database,命名为test (2)在test下新建三个数据表,分别为mismatch_user(用户信息表),goods(商品信息表),shop_car(购物车信息表) (3)为每个表添加信息如下: mismatch_user: 其中user_id为用户id信息,username为用户名称,password为登录密码,mail为用户邮箱. goods: 其中name为商品名称,pr

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

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

ASP.NET Identity “角色-权限”管理 1

本文是基于ASP.NET Identity v2的实施的“角色-权限”实验小结,不对基础知识进行介绍,读者需理解面向对象.接口编程.AOP.MVC,掌握ASP.NET MVC.JavaScript和EF. 环境:VS2013 update4,EF6,ASP.NET MVC 5,bootstrap,Automapper,MvcPager等. 1.       前言 VS2013 ASP.NET MVC模板只提供基础的Role-User权限管理,如:账号管理Account,登录注册等,为提高实用性,

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

前两天因有事就没来得及写.今天刚刚好空了.这次写的是对角色和管理员对页面按钮之间的控制.先看页面效果 说明:先根据角色设置好角色的权限,然后管理员在对应的角色下的权限去设置其权限. 在设置角色权限的时候 当某个角色对应某个页面的按钮都是未选中的时候,则设置它的IsShow为0,反之则为1,这样有利于设置管理员的时候方便查询需要设置的页面. 当isshow为0的时候删除管理员表对应的该页面Id的记录. 角色和管理员页面按钮显示这块到这里就结束了. 百度网盘源码下载地址

角色权限系统的 一些概念

用一个功能模块来举例子.一.建立角色功能并做分配:1.如果现在要做一个员工管理的模块(即Resources),这个模块有三个功能,分别是:增加,修改,删除.给这三个功能各自分配一个ID,这个ID叫做功能代号:Emp_addEmp,Emp_deleteEmp,Emp_updateEmp.2.建立一个角色(Role),把上面的功能代码加到这个角色拥有的权限中,并保存到数据库中.角色包括系统管理员,测试人员等.3.建立一个员工的账号,并把一种或几种角色赋给这个员工.比如说这个员工既可以是公司管理人员,