这个问题困扰我很久,一直找不到比较好的解决方案,网络上搜索也不晓得该搜什么关键字。
在此我列一些场景
section 1:
数据按照部门管理,各部门只能管理自己的数据。
然后在编辑数据时是通过URL跳转到编辑页 xxxxEditPage.aspx?ID=xxx这种形式。
那么如果用户直接在地址栏 输入以上地址,并且参数ID 输入一个其他的,那么其岂不是可以编辑修改别人的数据。
关于这些 一般可以怎样限制?
(难道还需要在页面再对传过来的ID在做一次判断,是否在该用户可管理的范围内?)
类似删除等等操作。
根据UserID进入的时候进行部门验证,非本部门的你当然不给它进入不就得了,要是限制跟人就非本人的不然进入就可以了
这样也是说 必须在每个需要做处理的页面做判断了。。。
@俺不是肥熊猫: 写个统一的类处理就行了...每一个请求都通过这个类...在这个类做验证就可以了,正常的返回正常数据,不正常的拦截
就是按照你说的“难道”这样进行限制。
B/S软件的一个重大原则就是,凡是终端用户可以修改的,都不能直接信任。
1)給用戶加權限。
2)給ID參數加密/解密處理。
在第一个页面用session保存权限。在第二个页面取出session中保存的权限。判断权限。
首先对于数据的查询可以用GET方式请求服务器端。。而数据操作类的考虑到数据安全性考虑。。。请求方式应该用POST的方式会比较好,这样页面在请求的URL中就不会显示呈现ID=XXX这样的情况,其次关于权限的问题。。首先可以将用户的基础信息以对象的方式存放在Session里,然后再Attribute中做先关的逻辑验证。。类似代码写法如下:
[atrribute="XXX"]
public void funciton(){}
这样的针对atrribute的编程会让代码更OO
事实上 这样子和我所表述中(难道。。。) 所做的做法是差不多的。
也就是在每个页面都做一次判断
然后你所说的
[atrribute="XXX"]
public void funciton(){}
这个是啥。。。 可以列出些更详细点的资料么?
@俺不是肥熊猫: 关于C#的atrribute编程,http://www.cnblogs.com/luckboy/archive/2009/07/18/1526083.html你可以参考看下这个博文。。
@小孔妹妹: 关于权限的OO设计,具体的实现方法先不讨论。。。Session什么的都是寄存用户权限的手段,,你用static变量去存用户权限也没问题。。。重点是你的那个ID传值是什么概念。。我开始的理解是当这个ID是业务数据的ID,而不是用户ID,,从实体角度分析,数据的归属是属于数据实体的属性。。所以当你请求持久层的时候用户信息一般都会作为参数请求,,对于atrribute是控制当前方法是否对用户开放。。。你可以理解为是附加在请求方法上的类。。要先执行这个类才会执行方法,权限的设计大致你要从数据行级和列级的程度,,还有功能点的控制。。。
你可以把用户可管理权限的部门ID存到SESSION或者COOKIE里,而不是直接通过URL传参的方式
编辑页将ID 存到Session有些奇怪。。。
@俺不是肥熊猫: 不是编辑页存,是编辑页去取,你不是有用户表么?用户表里是不是可以建个部门ID的字段呢,用户登录的时候就存这个字段的值存起来,编辑页去取这个值就可以了。
@Alex_QY1987: 抱歉。。。是我理解错了。
我以为你说的是将当前编辑数据的 ID存到 Session中。
非常感谢。