日期:2014-05-18  浏览次数:20683 次

最近在设计论坛程序,在用户-角色-功能设计上有点困惑,望达人进来指点一下:)
论坛是这样划分的,用户划分基本确定,包括:普通会员、版主、总版主、坛主
但在角色和功能上有点困惑
首先功能包括:浏览、发布、修改、删除、屏弊文章、精华文章、置顶文章、总置顶文章、论坛置顶文章
如果单是这样的话,角色倒是容易划分,给每个用户按功能划分即可
例如普通会员的角色有:浏览、发布功能;版主有浏览、发布、修改功能……

但问题是现在除了功能点外还有版块啊?例如浏览权限,用户在一些特殊的版块不可以浏览;再例如修改删除权限:
1.普通会员只可以修改、删除个人的文章;
2.版主除了可以修改删除个人文章外,还可以修改、删除其所在版块的文章;
3.总版主除了修改删除个人文章外,还可以修改、删除其下所有版块的文章;

我初步是这样想的,在创建新版块时,使其与功能点合并做为功能关联到角色中,如新建一版块AA,这样再新建一组功能点:AA浏览、AA发布、AA修改、AA删除、AA屏弊文章、AA精华文章、AA置顶文章、AA总置顶文章、AA论坛置顶文章
想想又不太合适,版块是变动的,我不能每加一个版块就给用户重新添加一个角色

还有,其实版块还有属性的,例如:普通版块、正规版块、认证版块
普通版块:所有会员、访客都可浏览
正规版块:只有登录后方可浏览
认证版块:只有版主以上级别可浏览
晕了,这样浏览又与不同属性的权块挂钩了,我该怎样设置这个角色?

大家进来聊一聊了,各抒己见吧:)

------解决方案--------------------
把所有的权限都列出来,权限的数量应该是定死的吧 然后一层层的设置
一开始全设置为false;
然后,比方登陆了就把正规版块设置为true,管理员再把其他的设置true,不过又很多都是在上一个为true的基础上的,还是用表的连接吧
------解决方案--------------------
我想大家都不太在论坛上讨论具体的设计问题吧, 这不是个轻松简单的过程...

本来觉得挺简单的, 楼主一说弄得巨复杂
------解决方案--------------------
顺便说下, 我目前也正在做个论坛系统, 是毕业设计...

我是参考JForum, BBSCS来做, 采用Spring2 + Hibernate3 + Struts2架构

有空多交流交流...
------解决方案--------------------
首先用户组有个级别字段,数值型的,确定是普通用户还是版主之类的.此外用户组里有功能字段,规定哪些功能可用. 这是一级策略.

此外版面里有一个针对各用户组的记录,记录里有功能字段.同样规定哪些功能可用及不可用.这又是一级策略.

如果只有用户策略就用用户策略,两个策略都有的话就看你自己的偏好进行取舍了.依次上溯.

具体可以参考DVBBS
------解决方案--------------------
但问题是现在除了功能点外还有版块啊?例如浏览权限,用户在一些特殊的版块不可以浏览;再例如修改删除权限:
1.普通会员只可以修改、删除个人的文章;
2.版主除了可以修改删除个人文章外,还可以修改、删除其所在版块的文章;
3.总版主除了修改删除个人文章外,还可以修改、删除其下所有版块的文章

-----------------------------------

这样细节的权限问题可以在页面内用if/else来处理~

例如当前用户是普通用户,
你在列出该用户浏览的文章,遇到“删除”这一操作字段时,
先判断这篇文章是不是该用户的,如果是就给他列出“删除”选项,
如果不是他的,“删除”这一选项就不列出来,因此该用户也就不能删除别人的文章
~~~~~
其他角色都可以类似实现这些功能~

这种设计思想虽然不够好,因为这样设计把一些逻辑放到了表现层,
这是MVC不提倡的,但实现起来还是没问题的~

------解决方案--------------------
用一个授权序列标记角色的权利吧。
比如把每一种权限当作一位,有为1、没有为0.
然后,把他们排序,这样就得到一个1和0的序列。
每一个角色都有一个这样的序列。某一为1,这表明他有这一位对应的权限,否则没有。
在用的时候要判断他是否有权限,只需要读取这个序列的指定的一位就可以了。这样便于管理,在数据库里面也很好存储。
------解决方案--------------------
呵呵,你想在技术上提高其实也不难~

其实web应用程序本身就提供了安全机制:
在web.xml你可以通过配置
<security-constraint>
<login-config>
<security-role>
来实现安全管理
在你的页面中,用
<logic:present>
<logic:notPresent>
标记来动态显示或隐藏你的组件(链接、按钮、菜单等等)
因为这两个标签中有个role属性可个跟你的角色关联起来~
这种方法的具体实现你可以参考Struts的相关资料~

------解决方案--------------------
系统的安全访问控制一般是通过用户认证和用户权限管理来实现。权限管理可简单表述为:判断“Who对What(Which)进行How的操作”的逻辑表达式是否为真。访问控制 (Access Control)是通过某种途径显式地准许或限制访问能力及范围的一种方法。通过访问控制服务,可以限制对关键资源的访问,防止非法用户的侵入或者因合法用户的不慎操作所造成的破坏。各类应用系统的整个体系结构上要设计一个安全可靠、配置灵活、易扩展的安全控制模块,它主要有两部分内容:用户认证和用户权限管理。目前大致有三种安全模型:访问矩阵、基于角色的访问控制(RBAC-Role based access control)模型和多级模型。其中基于角色的访问控制模型由于其较传统的访问控制控制加了一层角色增加了灵活性,因此得到了日益广泛的应用。RBAC是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是:一是减小授权管理的复杂性,降低管理开销;二是灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。
------解决方案--------------------
4.2.1 同一用户在不同版面的角色激活问题
由于一个用户可能有很多不同的角色,如果要考虑所有的角色都被激活,这对判断该用户所拥有哪些权限的时候造成了很多的麻烦。例如用户User1在A区内是站长,在B区内是会员,在C区内是过客的情况,如果此时该用户需要对B区内的某个资源进行删除操作,在判断用户是否拥有该权限时,只需要激活用户在B区面的角色,而没有必要激活其他的角色。如果激活其他角色,只会使逻辑更加复杂,即使不考虑实现的复杂度,系统性能也会因此而下降。根据这个具体的业务需求,可以根据RBAC模型中的最小权限原则,只对用户分配必需的权限,即在同一时刻只激活必需的最少的角色。所谓最小权限原则是指:用户所拥有的权力不能超过他执行工作时所需的权限。实现最小权限原则,需分清用户的工作内容,确定执行该项工作的最小权限集,然后将用户限制在这些权限范围之内。在RBAC中,可以根据组织内的规章制度、职员的分工等设计拥有不同权限的角色,只有角色需要执行的操作才授权给角色。当一个主体准备访问某资源时,如果该操作不在主体当前被激活角色的授权操作之内,该访问将被拒绝。