MySql用户角色管理及权限分配(使用MySQLMembershipProvider和MySqlRoleProvider)

来源:互联网 发布:mac jenkins 配置 编辑:程序博客网 时间:2024/06/08 18:10

在Asp.net mvc 中使用MySQLMembershipProvider和MySqlRoleProvider进行用户角色管理及权限分配

首先引入:MySql.Data,MySql.Web,MySql.Data.Entity

配置文件:

<configuration>
  <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
    <remove name="LocalMySqlServer"/>
    <add name="LocalMySqlServer"
         connectionString="Datasource=localhost;Database=lsdb;uid=root;pwd=soso;"
         providerName="MySql.Data.MySqlClient"/>
  </connectionStrings>

 

    <membership defaultProvider="MySQLMembershipProvider">
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
        <add autogenerateschema="true" connectionStringName="LocalMySqlServer"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false"
         applicationName="MvcApplication1" requiresUniqueEmail="false"
         passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="5"
         minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         passwordStrengthRegularExpression="" name="MySQLMembershipProvider"
         type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.4.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
      </providers>
    </membership>

 

    <roleManager enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" defaultProvider="MySqlRoleProvider">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
        <add name="MySqlRoleProvider" connectionStringName="LocalMySqlServer" applicationName="MvcAppMySql" writeExceptionsToEventLog="false"  type="MySql.Web.Security.MySqlRoleProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />

      </providers>
    </roleManager>

第一次autogenerateschema为true,之后可以设置false。

这些配置好之后,就可以选中Web.Config文件,点击ASP.NET配置,创建用户和角色(创建两个角色Admin和User;两个用户分别属于两个角色,名称自己定)。如果当前你正在用Asp.net mvc 2项目,你也可以运行项目后直接注册用户。然后查询你的MySql数据库,会看到你创建的用户和角色。但是在ASP.NET配置中配置访问规则,好像不起作用(不知道为啥,如果有知道的可以告诉我,谢谢)。访问规则只好在配置文件里手动添加:

如果想设置只有Admin角色才可以访问Admin文件下的页面,就可以这样设置

  <location path="Admin">
    <system.web>
      <authorization>
        <allow roles="Admin"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

 

根据角色配置菜单权限该怎么做呢,想了很久,因为没有机会了解别人的成熟解决方案。下面是自己的拙见:

在Site.Master添加脚本,每次页面加载的时候获取当前用户角色,然后根据角色显示哪些菜单

  <script type="text/javascript">
        $(document).ready(function () {
            $.ajax(
            {
                type: "POST",
                url: "/Home/GetRole",
                success: function (result) {
                    if (result.role != "") {
                        switch (result.role) {
                            case "Admin":
                                $("#cmdAdmin").show();
                                break;
                            case "User":
                                $("#cmdAdmin").hide();
                                break;
                            default:
                                debugger;
                                $("#cmdAdmin").hide();
                                break;
                        };
                    }
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

当然html的菜单处要添加id为cmdAdmin的菜单

            <div id="menucontainer">
           
                <ul id="menu">             
                    <li><%: Html.ActionLink("主页", "Index", "Home")%></li>
                    <li id="cmdAdmin"><%: Html.ActionLink("管理员", "Index", "Admin")%></li>
                    <li><%: Html.ActionLink("关于", "About", "Home")%></li>
                </ul>
           
            </div>

同时,在Home的控制器中添加方法GetRole,让上面ajax调用

        public JsonResult GetRole()
        {
            string roleVal = "None";
            if (!string.IsNullOrEmpty(this.User.Identity.Name))
            {
                if (this.User.IsInRole("Admin"))
                {
                    roleVal = "Admin";
                }
                else if (this.User.IsInRole("User"))
                {
                    roleVal = "User";
                }
                else
                {
                    roleVal = "Default";
                }
            }
            return Json(new { role = roleVal });
        }

 

这样就可以实现了。