先体验一下在未登录的情况下,点击“发表主题”:跳转到登录页面,登录成功后,跳转到“发表新主题”页面。
这是很多Web应用中常见的“权限拦截”。JForum是如何实现的呢?
在JForum中有Group和Role的概念。每个用户(包括未登录的匿名游客)都至少属于一个组。每个组都有一套权限(Permissions),或者称之为角色(Roles)。虽然组与组之间可以有父子关系,但仅仅是名义上的,子组不能继承父组的权限。
JForum预定义了多个权限:
- 是否为管理员? 如果选“是”的话,则属于该组的所有用户均可访问管理员控制台。
- 是否限制分类? 假设系统中有A、B和C三个分类讨论区,如果选了A和C的话,则属于该组的所有用户只能访问A和C讨论区。
- 是否允许匿名发帖。
- 等等。
先看看和权限有关的几个数据库表的定义:
CREATE TABLE jforum_groups (
group_id INT NOT NULL auto_increment,
group_name varchar(40) NOT NULL default '',
group_description varchar(255) default NULL,
parent_id INT default '0',
PRIMARY KEY (group_id)
) TYPE=InnoDB;
默认情况下,系统有两个组:General,Administration。
CREATE TABLE jforum_roles (
role_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
group_id INT default '0',
name varchar(255) NOT NULL,
INDEX idx_group (group_id),
INDEX idx_name (name)
) TYPE=InnoDB;
name,即权限名称,例如:perm_administration、perm_anonymous_post、等等。一个group_id对应多个name。
CREATE TABLE jforum_role_values (
role_id INT NOT NULL,
role_value VARCHAR(255),
INDEX idx_role(role_id)
) TYPE=InnoDB;
role_value字段的意义最复杂,最不容易理解。对于perm_administration,是否为管理员,只有两种情况,要么是要么否,role_value值可能是0或者根本就不在jforum_role_values表中。对于perm_anonymous_post,匿名发帖,其值是针对系统中的forum而言的,role_value值是forum的ID,或者是0,即所有forum。对此,作者又做了特殊处理,凡是role_value值为0的,均不保存在jforum_role_values表中。关于role_value的取值规则在permissions.xml中有定义。
和权限相关的Java类:
public class RoleValue implements Serializable
{
private int roleId;
private String value;
}
该类和表jforum_role_values相对应。
public class Role implements Serializable
{
private int id;
private String name;
private RoleValueCollection roleValues = new RoleValueCollection();
}
RoleValueCollection继承了LinkedHashSet,该集合类用于存放分区(category)或版块(forum)的ID,其值不允许重复,所以选择了java.util.Set的子类。
另外,RoleCollection继承了LinkedHashMap,以权限名作key,以Role对象作value。
group_id为1,即General组对应的RoleCollection对象的字符串值示意如下:
[name=perm_anonymous_post, values=([2, 0])]
[name=perm_attachments_download, values=([0])]
[name=perm_attachments_enabled, values=([0, 1])]
[name=perm_category, values=([1, 2, 0])]
[name=perm_forum, values=([1, 2, 0])]
[name=perm_html_disabled, values=([1, 2, 0])]
[name=perm_karma_enabled, values=([0])]
[name=perm_moderation_forums, values=([0])]
[name=perm_moderation_log, values=([0])]
[name=perm_read_only_forums, values=([1, 2, 0])]
[name=perm_reply_only, values=([1, 2, 0])]
[name=perm_reply_without_moderation, values=([1, 0])]
[name=perm_vote, values=([0])]
其中,values的中的1、2均表示分区(category)或版块(forum)的ID。
可以猜测一下每个Role值所代表的含义:
[name=perm_attachments_enabled, values=([0, 1])]
ID为1的版块允许匿名发帖,0是特殊值,不考虑。
[name=perm_vote, values=([0])]
由于允许投票权限是个布尔值,其值只能选择“是”或“否”。对布尔型权限,只要有记录出现在表jforum_role_values中,不管其值是什么,都表示“是”。此时General组的权限为允许投票。
不再多举例了。很绕啊:)
未登录时点击“发表主题”,进入PostAction的insert()方法。检查到该forum不允许匿名发帖后,先设置重定向URL:
JForumExecutionContext.setRedirect(redirect);,之后将Freemarker模板指向登录页面。
全局servlet JForum类的handleFinally方法,只有检测到重定向URL不为空,就执行重定向操作:
private void handleFinally(Writer out, JForumContext forumContext, ResponseContext response) throws IOException
{
try {
if (out != null) { out.close(); }
}
catch (Exception e) {
// catch close error
}
String redirectTo = JForumExecutionContext.getRedirectTo();
JForumExecutionContext.finish();
if (redirectTo != null) {
if (forumContext != null && forumContext.isEncodingDisabled()) {
response.sendRedirect(redirectTo);
}
else {
response.sendRedirect(response.encodeRedirectURL(redirectTo));
}
}
}
这就出现了开篇描述的情景。
分享到:
相关推荐
JForum是著名的开源论坛,支持多达数十种的多国语言,其中包括简体中文(。JForumJForum功能强大,界面美观,代码结构清晰
jforum3源代码数据库
jforum漏洞利用源代码
jforum配置安装介绍+源代码 jforum配置安装介绍+源代码
jforum的源代码和类包,很方便集成和学习。同时里面有一个物理结构图,能方便的清晰的了解jforum的整体设计,对想研究和使用开源论坛的开发者非常好哦。
jforum开源论坛 官方源代码(2.1.9)
jforum 2.1.9源码 内附安装开发文档
jforum-2.1.8版本完整源代码(1),因为完整版本超过15mb,因此分成两部分下载。
内涵jforum2.1.9源码,并且使用sql server 2008数据库,已配置完成,可以直接部署使用和学习
jforum 完整源代码,从svn上 导出 没有任何修改
jforum-2.1.8版本完整源代码(2) 请找到(1)部分一起解压。
它提供了抽象的接口、高效的论坛引擎以及易于使用的管理界面,同时具有完全的权限控制、多语言支持(包括中文)、高性能、可自定义的用户接口、安全、支持多数据库等等特性。 JForum 采用 FreeMarker 作为
jforum-2.1.8-编译代码.zip
JForum 开源代码,是很好的freeMaker学习素材。
对于我们已有的WEB应用中的用户,若该用户已经登陆,并通过 联结迁移到JForum页面时,JForum要能够识别该用户已经登陆(不需要二次登陆)才不会让用户感到别扭(对用户来说,就好像使用的是同一个系统似的)。...
Jforum的配置、初始化流程 处理请求流程(mvc) 数据库访问实现 文件监控、缓存实现 、权限控制PPt简介
jforum3.0所需要的jar包
JForum3 jforum java 开源论坛 论坛
JForum 是采用Java开发的功能强大且稳定...JForum 采用 FreeMarker 作为页面模板引擎,支持包括中文在内的二十几种语言。 JForum 最大的优点是采用 BSD 开源协议,你可以最大限度的进行任何修改和扩展,包括商业用途。
JForum 是采用Java开发的功能强大且稳定的...JForum 采用 FreeMarker 作为页面模板引擎,支持包括中文在内的二十几种语言。JForum 最大的优点是采用 BSD 开源协议,你可以最大限度的进行任何修改和扩展,包括商业用途。