zoukankan      html  css  js  c++  java
  • 站点地图与权限:Sitemap and Role

    上周在做个项目时涉及到用户权限的设计,折腾了半天,脑袋整晕之后终于明白——该吃饭了......

    我们知道不同的用户登录网站后享受的是不同的待遇。这个“用户”又分为“匿名用户”和“注册用户”。匿名用户一般看到的是公共的一些信息,随便看。但是遇到一些页面就不行了,必须注册成“注册用户”才行。而不同的注册用户你可能也要给他们分个类别,比如什么销售人员只能看销售相关的页面啊,采购人员只能看采购方面的页面啊,财务人员只能看财务方面的页面啊,等等......

    这时候就要分“角色”了。

    “角色”让注册用户有所归属。这样你在分配权限的时候就只需要给角色分配就好了。但是你可能会问:我想给销售人员看财务方面的页面呢,怎么办?OK,这就要单独给他加个权限了。这也就是为什么下面会出现2个web.config文件的原因了。

    涉及到网站权限的文件有这么几个:

    1. Web.sitemap 站点地图。可以控制你的导航菜单的显示和隐藏。
    2. web.config(站点根目录下)整个网站的配置文件。这家伙可厉害了!控制网站验证方式、授权方式、成员管理、角色管理......
    3. web.config(相关网页所属的文件夹下)文件夹里的网页的配置文件。它的作用就比较细化了,可以控制用户能否访问到某个页面的权限。

    大致总结了下,启用网站的权限管理一般就用到这3个文件。

    web.sitemap管菜单是否显示,显示了能否有权限访问却不一定,还要配合web.config。就算不显示,只要web.config里没有配置相应权限,那个隐藏的页面也是可以访问的。

    web.config管理权限,就算导航菜单显示了菜单,如果设置拒绝的权限,依然也只是”可远观而不可点击也“。

    所以web.sitemap和web.config要配合起来一起用!

    上代码!

    <!--文件:Web.sitemap(控制导航菜单的显示和隐藏)-->
    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode title="Home" roles="*"><!--此处设置roles="*",母版中的menu才会显示出来! -->
    <siteMapNode title="物料数据维护" roles="Administrator,Produce,*" ><!--此处在roles中加入"*",可让所有角色的用户都看到此菜单,但却不一定有权限进行操作(除非在相应文件夹里的web.config里赋予权限。 -->
    <siteMapNode url="~/Produce/MaterialCreat.aspx" title="创建物料"/>
    <siteMapNode url="~/Produce/MaterialChange.aspx" title="更改物料"/>
    </siteMapNode>
    <siteMapNode title="预测计划" roles="Administrator,Market,*"><!--Produce角色的用户本来是看不到这个菜单的,但是加入"*"就可以看到了,只是还不一定有权限。 -->
    <siteMapNode url="~/Market/AddIndRq.aspx" title="创建预测计划" description=""/>
    <siteMapNode url="~/Market/InputIndRq.aspx" title="创建预测计划-批输入"/>
    <siteMapNode url="~/Market/ChangeIndRq.aspx" title="更改预测计划" description=""/>
    <siteMapNode url="~/Market/ShowIndRq.aspx" title="查看预测计划"/>
    <siteMapNode url="~/Market/Publish.aspx" title="发布预测计划"/>
    </siteMapNode>
    <siteMapNode url="~/Supply/MRP.aspx" title="物料需求(MRP)" roles="Administrator,Supply,Produce,*"/>
    </siteMapNode>
    </siteMap>

    网页的title只是举例,看结构吧。

    下面是站点根目录下的web.config,内容较多。主要涉及到2个数据库连接,3个defaultProvider。

    <!--文件:web.config(站点根目录下)-->
    <configuration>
    <connectionStrings>
    <add name="nsnCS" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=NSN;User ID=sa;Password=sa" providerName="System.Data.SqlClient"/>
    <add name="nsnRole" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=NSN_Role;User ID=sa;Password=sa" providerName="System.Data.SqlClient"/>
    </connectionStrings>

    <system.web><!--注意节点! -->
    <!--验证方式-->
    <authentication mode="Forms" >
    <forms loginUrl="Login.aspx" timeout="60"/>
    </authentication>

    <!--授权-->
    <authorization>
    <allow users="?" /><!--允许匿名访问-->
    </authorization>

    <!--成员管理-->
    <membership defaultProvider="myMBS" userIsOnlineTimeWindow="20">
    <providers>
    <add
    name="myMBS"
    type
    ="System.Web.Security.SqlMembershipProvider"
    connectionStringName
    ="nsnRole"
    enablePasswordRetrieval
    ="false"
    enablePasswordReset
    ="true"
    requiresQuestionAndAnswer
    ="false"
    requiresUniqueEmail
    ="false"
    passwordFormat
    ="Clear"
    applicationName
    ="/"
    maxInvalidPasswordAttempts
    ="5"
    minRequiredPasswordLength
    ="3"
    minRequiredNonalphanumericCharacters
    ="0"
    passwordAttemptWindow
    ="10"
    passwordStrengthRegularExpression
    =""
    />
    </providers>
    </membership>

    <!--启用角色-->
    <roleManager enabled="true" defaultProvider="myRole" >
    <providers>
    <add
    name="myRole"
    connectionStringName
    ="nsnRole"
    type
    ="System.Web.Security.SqlRoleProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
    applicationName
    ="/"
    />
    </providers>
    </roleManager>

    <!--启用安全修整-->
    <siteMap defaultProvider="myprovider" enabled="true">
    <providers>
    <add
    name="myprovider"
    type
    ="System.Web.XmlSiteMapProvider"
    siteMapFile
    ="web.sitemap"
    securityTrimmingEnabled
    ="true"
    />
    </providers>
    </siteMap>
    </system.web>
    </configuration>


    最后是文件夹下的web.config,控制文件夹及文件夹里的单个网页。

    <!--文件:Market/web.config(roles控制权限)-->
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <system.web>
    <authorization>
    <allow roles="Administrator,Market" />
    <deny users="*" /><!--此处设置roles="*",才会将其他角色的用户拒之门外! -->
    </authorization>
    </system.web>

    <location path="ShowIndRq.aspx"><!--Market文件夹里的单个网页设置权限 -->
    <system.web>
    <authorization>
    <allow roles="Produce"/><!--Produce角色的用户即可以看到菜单,也获得了操作的权限。 -->
    </authorization>
    </system.web>
    </location>
    </configuration>


    【摘录】可以将 SqlRoleProvider 配置为与 SqlMembershipProvider 使用相同的数据库和用户信息,以便使用一个数据库即可获得身份验证和授权信息。如要使用同一个数据库获取成员资格和角色信息,请运行 aspnet_regsql.exe 可执行文件,然后安装成员资格功能。然后,在配置中为 SqlRoleProvider 和 SqlMembershipProvider 实例指定同样的连接字符串。另外,还要确保利用相同的 ApplicationName 来配置这两个提供程序实例。

    打完收工!

  • 相关阅读:
    t-SNE可视化(MNIST例子)
    numpy得到数组的index
    Latex的各种帽子
    Mac OSX安装 GitLab 5.x
    yii2 关系...
    基于git的源代码管理模型——git flow
    spl_autoload_register
    如何創建一個自己的 Composer/Packagist 包 (PHP)
    正则表达式语法
    sublime php插件
  • 原文地址:https://www.cnblogs.com/ibgo/p/2431887.html
Copyright © 2011-2022 走看看