小弟知道分不多,但是真情所在呀!直入真题。
我在设计一个asp.net进销存网站,刚开始就遇到了以前从没想过的一个问题,听我慢慢说,大神大婶,先抽烟喝茶,不要走开,因为你的回答可能会帮助很多像我一样的伪菜鸟、假资深,以前只是写页面,现在想自己设计了,原本觉得简单的东西,一下子没有头绪了。
程序是这样的:
我准备这样做,用户如果直接输入URL地址登录系统的页面,我用Form认证设置直接给他踢到登录页面(login.aspx),这个认证没有研究过,还是最近才知道的,就觉得只要在web.config中简单的加这么一段话就行:    <!--Form认证设置Start-->
    <authentication mode="Forms">
      <forms loginUrl="Manager/Login.aspx"  name=".ASPXAUTH" ></forms>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
    <!--Form认证设置End-->好,这一步先假装是这样的,如果不是,先看完下面的,再用臭鸡蛋扔我。
我首先新建一个模板页,我是这样想的,在模版页里用menu导航控件动态的从数据库拿数据出来,但是有个前提,不同的用户登录到系统中,看到的超链接是不一样的(比如说,管理员登录了,可以看到后台管理,而普通用户只能看到一些基本的模块链接,而后台管理这个链接是看不到的)这一步,怎么做?我是这样做的,我在加载模板页的时候就通过登录用户,获取他的角色ID,再通过角色ID,找到他和模块表对应的ID映射,如果这句看不明白的话,看我下面的数据库设计
***********************************************************
模块表:
ID     父ID     模块名  是否禁用  是否系统   描述
-----------------------------------------------
1 0 YWZQ 0 0 根
2 1 系统应用 0 0 系统应用
3 1 系统维护 0 0 系统维护
4 2 部门管理 0 0 部门管理
5 2 角色管理 0 0 角色管理
6 2 用户管理 0 0 用户管理
7 3 日志管理 0 0 日志管理
8 1 进销存管理 0 0 进销存管理
9 8 采购管理 0 0 采购管理
10 8 库存管理 0 0 库存管理
11 8 销售管理 0 0 销售管理
12 8 客户关系管理 0 0 客户关系管理
13 8 统计管理 0 0 统计管理
***********************************************************
权限表:
ID      角色名    描述
-----------------------------------------
1 管理员 权限最大、可以对系统做任何操作
2 普通用户 只能操作部分系统功能
***********************************************************
模块权限对应表:
ID     角色ID  模块ID
-----------------------
1 1 2
2 1 3
3 1 8
4 2 8
***********************************************************
用户表:
ID     角色ID   用户名称           密码     是否禁用    创建时间                  修改时间   其他
1 1 admin         123456 0 2012-01-07 00:00:00.000 NULL NULL
2 2 kangjian 123456 0 2012-01-07 00:00:00.000 NULL NULL
***********************************************************
接着上面的话,就是我知道当前登录的用户能访问哪些模块,我也可以通过他的角色ID,显示出他能访问这些模块的链接还有子链接,但是,有这么一种,可能,我没想明白,当前这个用户,登录到系统中了,他虽然没有某些页面的权限,换句话说,就是他没有能跳转过去某个页面的超链接,但是,他知道这个页面的URL地址,通过导航栏,他输入URL登录了,这个时候,我怎么判断?我还是在加载页面的时候判断这个用户的角色?再判断他的模块?再把当前模块的ID拿出来,到映射表中查看有没有对应的?如果没有就跳转到首页或者提示没有权限吗?我觉得这样做,总是不对劲,第一个原因就是,我怎么知道我当前页面的模块ID,总不能每次添加一个页面手动配置一个与数据库中相对应的ID吧。就这个问题,很纠结,求大神大婶,神回复啊还有另外一个比较没底的事儿,当前登录用户的名称也配置在模板页中(就像是CSDN中最上方的自己的登录名一样的东西)是不是不妥呀?是不是会让模板页变的有些臃肿啊,又是动态导航信息,又是用户信息,会不会加载有效率问题?如果不妥的话,有什么好的解决方案呢?这个问题,也很纠结,求大神讲解小弟这个还没有开始,就快要灭绝的小系统,不值一提,只是希望能帮我,还有更多的没有头绪的人,缕出一个清醒的思路来希望有更好的方案,更适合的方案,求解答,小弟,拜谢,替那些被帮到的人,再谢asp.netC#数据库企业开发进销存

解决方案 »

  1.   

    呵呵,你所担心的都是实现细节。
    既然都是你说你在做设计,那么一个被细节捆住手脚的设计师,是弄不出好东西来的
    简单比方,北京奥运会,无论是鸟巢,还是水立方,在实际施工上都碰到很多具体的难度细节,如果当初的设计师就把这些玩意装心里,那么他是设计不出鸟巢和水立方,他会和你一样把自己卡在那些“难度”上就你这东西抛开那些细节在设计上几乎没有任何难度,首先他是树,那么如何表达树这个已经不是什么问题。当然对于你的系统,不存在多角色继承,例外处理。其实连数据库都利用不到,一个角色写一个sitemap配置文件就足够了
    =================================================================
    总不能每次添加一个页面手动配置一个与数据库中相对应的ID吧至于这个,也没什么不可以,设计师首先面对的一个问题就是千万别把自己当神仙,俺们应该承认自己不是神仙无法就预先知道所有的东西,所以能有一个可以灵活配置的配置文件就可以了,手动就手动,没啥不可以滴,只要他足够灵活就好(当然也不是木有可以自动配置的表述,比如MEF+T4模版引擎去自动生成对应的sitemap文件,当然这都是后话,多他不多少他不少)
    ps:总体上说你还是没有过度到设计师的地步,设计师并不关心模版页是不是臃肿这类问题。设计师的责任是设计一个逻辑上行的通的方案,并且能保证这个方案可以修改,扩展及维护
      

  2.   

    权限验证那块,你可以写一个独立的页面出来,然后每个需要验证权限的页面不要在继承默认的System.Web.UI.Page,而是继承你写的那个权限验证页面(比如BasePage,BasePage是个类文件,继承System.Web.UI.Page)。这样每次用户访问功能页面的时候都会先执行BasePage里面的权限验证了。
      

  3.   

    权限问题。首先你需要一个全局判断登陆状态和权限的地方.比如:基类,filter. 等等权限对应关系可以像二楼所说,写入一个xml配置任何页面都必须要对角色权限,登陆状态进行审核 。 审核失败 跳出. 
      

  4.   

    需要验证的页面写入权限表,BasePage里面读取用户权限信息(比如用户登录后权限信息写入session)和权限表里面的规则进行匹配,通过允许访问,不通过跳转或提示。