各位大神和大婶们,一个架构问题,深也不深,看我道来,求高手高高手把小弟解答。

iceman_kang 2013-01-07 11:43:12
小弟知道分不多,但是真情所在呀!

直入真题。
我在设计一个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中最上方的自己的登录名一样的东西)是不是不妥呀?是不是会让模板页变的有些臃肿啊,又是动态导航信息,又是用户信息,会不会加载有效率问题?如果不妥的话,有什么好的解决方案呢?这个问题,也很纠结,求大神讲解

小弟这个还没有开始,就快要灭绝的小系统,不值一提,只是希望能帮我,还有更多的没有头绪的人,缕出一个清醒的思路来

希望有更好的方案,更适合的方案,求解答,小弟,拜谢,替那些被帮到的人,再谢

...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
踏平扶桑 2013-01-10
  • 打赏
  • 举报
回复
引用 11 楼 iceman_kang 的回复:
引用 7 楼 5653325 的回复:权限验证那块,你可以写一个独立的页面出来,然后每个需要验证权限的页面不要在继承默认的System.Web.UI.Page,而是继承你写的那个权限验证页面(比如BasePage,BasePage是个类文件,继承System.Web.UI.Page)。这样每次用户访问功能页面的时候都会先执行BasePage里面的权限验证了。 感谢兄……
需要验证的页面写入权限表,BasePage里面读取用户权限信息(比如用户登录后权限信息写入session)和权限表里面的规则进行匹配,通过允许访问,不通过跳转或提示。
wanghui0380 2013-01-08
  • 打赏
  • 举报
回复
呵呵,你所担心的都是实现细节。 既然都是你说你在做设计,那么一个被细节捆住手脚的设计师,是弄不出好东西来的 简单比方,北京奥运会,无论是鸟巢,还是水立方,在实际施工上都碰到很多具体的难度细节,如果当初的设计师就把这些玩意装心里,那么他是设计不出鸟巢和水立方,他会和你一样把自己卡在那些“难度”上 就你这东西抛开那些细节在设计上几乎没有任何难度,首先他是树,那么如何表达树这个已经不是什么问题。当然对于你的系统,不存在多角色继承,例外处理。其实连数据库都利用不到,一个角色写一个sitemap配置文件就足够了 ================================================================= 总不能每次添加一个页面手动配置一个与数据库中相对应的ID吧 至于这个,也没什么不可以,设计师首先面对的一个问题就是千万别把自己当神仙,俺们应该承认自己不是神仙无法就预先知道所有的东西,所以能有一个可以灵活配置的配置文件就可以了,手动就手动,没啥不可以滴,只要他足够灵活就好(当然也不是木有可以自动配置的表述,比如MEF+T4模版引擎去自动生成对应的sitemap文件,当然这都是后话,多他不多少他不少) ps:总体上说你还是没有过度到设计师的地步,设计师并不关心模版页是不是臃肿这类问题。设计师的责任是设计一个逻辑上行的通的方案,并且能保证这个方案可以修改,扩展及维护
iceman_kang 2013-01-08
  • 打赏
  • 举报
回复
引用 7 楼 5653325 的回复:
权限验证那块,你可以写一个独立的页面出来,然后每个需要验证权限的页面不要在继承默认的System.Web.UI.Page,而是继承你写的那个权限验证页面(比如BasePage,BasePage是个类文件,继承System.Web.UI.Page)。这样每次用户访问功能页面的时候都会先执行BasePage里面的权限验证了。
感谢兄弟指出的做法,但是我是个‘选择控’,是直接全局验证好呢,还是手动配置部分页面进行继承好呢?
iceman_kang 2013-01-08
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
呵呵,你所担心的都是实现细节。 既然都是你说你在做设计,那么一个被细节捆住手脚的设计师,是弄不出好东西来的 简单比方,北京奥运会,无论是鸟巢,还是水立方,在实际施工上都碰到很多具体的难度细节,如果当初的设计师就把这些玩意装心里,那么他是设计不出鸟巢和水立方,他会和你一样把自己卡在那些“难度”上 就你这东西抛开那些细节在设计上几乎没有任何难度,首先他是树,那么如何表达树这个已经不是什么问题……
兄弟说的没错,确实总是被细节的东西所困扰,总觉得这个坎儿过不去,其他就做不下去。。软肋呀。 设计师可真不敢当,只是想慢慢的有个自己开发网站的框架,选择一个最优方案(可能没有最优,只有更优吧),真心感谢你的细心讲解。。
残月照我心 2013-01-08
  • 打赏
  • 举报
回复
引用 7 楼 5653325 的回复:
权限验证那块,你可以写一个独立的页面出来,然后每个需要验证权限的页面不要在继承默认的System.Web.UI.Page,而是继承你写的那个权限验证页面(比如BasePage,BasePage是个类文件,继承System.Web.UI.Page)。这样每次用户访问功能页面的时候都会先执行BasePage里面的权限验证了。
+++++1
Assassin_ 2013-01-08
  • 打赏
  • 举报
回复
权限问题。 首先你需要一个全局判断登陆状态和权限的地方.比如:基类,filter. 等等 权限对应关系可以像二楼所说,写入一个xml配置 任何页面都必须要对角色权限,登陆状态进行审核 。 审核失败 跳出.
踏平扶桑 2013-01-08
  • 打赏
  • 举报
回复
权限验证那块,你可以写一个独立的页面出来,然后每个需要验证权限的页面不要在继承默认的System.Web.UI.Page,而是继承你写的那个权限验证页面(比如BasePage,BasePage是个类文件,继承System.Web.UI.Page)。这样每次用户访问功能页面的时候都会先执行BasePage里面的权限验证了。
peng2739956 2013-01-08
  • 打赏
  • 举报
回复
1L 说的很有道理,咱在说也是差不太多的意思 项目只要够灵活实现功能就成,至于效率其它的问题 根据实际考虑
小刘哈哈 2013-01-08
  • 打赏
  • 举报
回复
我表示看了一半 但对于管理员和普通用户所涉及到的权限 我的做法和LZ比起来就简单多了 用户都在一张表用一个字段来辨别管理员还是普通用户 、一张权限表 根据用户表中字段来判断登陆的是管理员还是普通用户 来显示不同的数据集
快乐的小二兔 2013-01-08
  • 打赏
  • 举报
回复
设计师考虑的问题只有一个。这个东西逻辑上说的过去。整体逻辑跟业务需求差不多就完事
NqIceCoffee 2013-01-08
  • 打赏
  • 举报
回复
佩服楼上2位 这么长的文字都看完,并且理解,我表示么看完
xuan.ye 2013-01-08
  • 打赏
  • 举报
回复
跟1#的想法是一样的。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧