`
jinjiankang
  • 浏览: 112960 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JForum源代码研究—权限拦截与跳转到原请求页面

阅读更多

先体验一下在未登录的情况下,点击“发表主题”:跳转到登录页面,登录成功后,跳转到“发表新主题”页面。

 

这是很多Web应用中常见的“权限拦截”。JForum是如何实现的呢?

 

在JForum中有Group和Role的概念。每个用户(包括未登录的匿名游客)都至少属于一个组。每个组都有一套权限(Permissions),或者称之为角色(Roles)。虽然组与组之间可以有父子关系,但仅仅是名义上的,子组不能继承父组的权限。

 

JForum预定义了多个权限:

  1. 是否为管理员?  如果选“是”的话,则属于该组的所有用户均可访问管理员控制台。
  2. 是否限制分类?  假设系统中有A、B和C三个分类讨论区,如果选了A和C的话,则属于该组的所有用户只能访问A和C讨论区。
  3. 是否允许匿名发帖。
  4. 等等。

先看看和权限有关的几个数据库表的定义:

 

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));
			}
		}
	}
 

这就出现了开篇描述的情景。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    jforum3源代码

    通过研究JForum3的源代码,开发者不仅可以学习到Java Web开发的最佳实践,还能掌握如何构建一个健壮、易扩展的社区平台。无论是对Java框架的深入理解,还是对Web应用开发流程的整体把握,JForum3都是一份宝贵的教育...

    jforum漏洞利用源代码

    《JForum漏洞利用源代码解析》 JForum是一款流行的开源Java论坛系统,它以其功能丰富、社区友好而受到许多用户的青睐。然而,如同任何复杂的软件系统一样,JForum也存在安全漏洞,这些漏洞可能被恶意用户利用,对...

    jforum的源代码和物理结构

    **JForum 源代码与物理结构详解** JForum 是一个功能丰富的开源论坛系统,以其高效、可扩展和用户友好的界面而闻名。这个压缩包包含 JForum 的源代码和类包,对于开发者来说,这是一个宝贵的资源,可以深入理解其...

    jforum3源代码 数据库

    本篇将深入探讨JForum3的源代码和其与数据库的交互,以及如何进行配置。 **一、JForum3源代码结构** JForum3的源代码主要由以下几个部分组成: 1. **Web前端**:基于Servlet和JSP,负责处理HTTP请求,呈现HTML...

    jforum配置安装介绍+源代码

    jforum配置安装介绍+源代码 jforum配置安装介绍+源代码

    jforum开源论坛 官方源代码(2.1.9)

    通过阅读和分析这些源代码,开发者可以了解到JForum的实现细节,学习到如何构建一个大型的Java Web应用,包括会话管理、模板引擎的应用、国际化处理以及缓存策略等。 在实际应用中,JForum不仅适合搭建个人或社区...

    jforum 2.1.9源码

    《JForum 2.1.9源码深度解析与应用指南》 JForum,作为一款开源的、基于Java的网络论坛系统,深受开发者喜爱。2.1.9版本的发布,不仅提供了稳定的功能,还为开发者们带来了丰富的自定义可能性。本文将深入探讨...

    jforum2.1.9代码及SQL SERVER数据库备份

    2. **安全性**:jForum在2.1.9版本中已经对许多安全漏洞进行了修复,包括XSS跨站脚本攻击、CSRF跨站请求伪造等,开发者可以通过源码研究其安全机制。 3. **用户管理**:论坛的用户系统是核心部分,包括注册、登录、...

    Jforum2.19

    通过深入研究Jforum的源代码,开发者可以了解到Java Web应用的开发模式,包括MVC架构、ORM框架的使用(如Hibernate)、国际化处理、权限控制等方面的知识。同时,这也是学习和理解Web论坛系统设计与实现的一个宝贵...

    jforum-2.1.8版本完整源代码(1)

    jforum-2.1.8版本完整源代码(1),因为完整版本超过15mb,因此分成两部分下载。

    jforum-2.1.8-编译代码.zip

    通过阅读和分析这些代码,我们可以了解到JForum是如何处理数据库交互、权限控制和页面渲染的。 在实际编译过程中,开发者通常会用到Ant或Maven这样的构建工具。Ant是Apache提供的一个基于XML的构建工具,用于自动化...

    Jforum相关文档和PPT

    这个压缩包文件包含了关于Jforum的多个重要知识点,包括配置、初始化流程、处理请求的MVC架构、数据库访问实现、文件监控、缓存机制以及权限控制等内容。下面将对这些主题进行详细阐述。 首先,Jforum的配置是论坛...

    jforum说明文档 源码解析 单点登录 jforum缓存

    这涉及到角色(Role)、权限(Permission)和用户组(Group)的概念,通过这些机制,Jforum能确保社区的秩序和安全。 **单点登录(Single Sign-On, SSO)** 单点登录是Jforum的一项高级特性,允许用户在一个应用系统...

    jforum-2.1.8版本完整源代码(2)

    jforum-2.1.8版本完整源代码(2) 请找到(1)部分一起解压。

    java开源论坛jforum

    通过阅读和分析JForum的代码,开发者可以深入了解如何在实际项目中应用MVC模式,学习到如何组织代码以提高可读性和可维护性。同时,由于其简单易学的特点,JForum也适合初学者用来实践和提升编程技能。 总之,...

    JForum_SSO_-_JForum单点登陆原理与配置

    如果匿名用户尝试访问受保护的页面,JForum会引导用户去登录页面,并传递登录成功后的跳转地址。 **JForum SSO实现的关键步骤:** 1. **实现SSO类**:你需要创建一个类来获取来自另一个系统的用户登录信息。这里...

    JForum源代码

    它提供了抽象的接口、高效的论坛引擎以及易于使用的管理界面,同时具有完全的权限控制、多语言支持(包括中文)、高性能、可自定义的用户接口、安全、支持多数据库等等特性。 JForum 采用 FreeMarker 作为

    JForum3 完整项目

    总结来说,JForum3是一个成熟的Java论坛解决方案,它的完整源代码对于Java Web开发者来说是一个宝贵的资源,无论是用于学习、研究还是定制自己的论坛系统,都能从中受益匪浅。通过深入了解JForum3的架构和实现,...

    chx 学习jForum笔记十八 jForum与ms sqlserver

    《jForum与MS SQLServer整合学习笔记》 jForum是一款基于Java的开源论坛系统,它以其高度可定制性、灵活性和强大的功能深受开发者喜爱。在本文中,我们将深入探讨如何将jForum与Microsoft SQL Server(简称MS SQL...

Global site tag (gtag.js) - Google Analytics