理解并使用 JSPWiki 中的权限控制

来源:互联网 发布:js如何定义二维数组 编辑:程序博客网 时间:2024/05/21 06:55

 

一. 权限系统介绍

JSPWiki(http://www.jspwiki.org/) 是一款简单易用的基于 JSP + Servelt + JavaBean 的不依赖于其它 J2EE 框架的 Wiki 系统, 它本身的存储基于文件系统, 只需要 Tomcat 即可运行, 代码也比较便于读懂并加以改进. 虽然说是简单易用, 但是因为其后台管理系统的功能不够强大, 所以在公司内部使用时仍旧遇到了一些权限控制的问题. 本文将基于JSPWiki v2.4.71 来讨论 JSPWiki的权限管理.

 

二. 权限系统使用

如上所示, Admin 的账户可以通过两个途径来建立:
方式1: 建立一个名为 Admin 的 Group, 在这个版本中是保存在文件 WEB-INF/groupdatabase.xml 文件中, 可以手工改动它来设置第一个管理员, 但是改动后必须重新加载 wiki web 应用才可生效;
方式2: 在 Web 容器中设置为 Admin 的 Role, 并加入用户. 例如对 Tomcat 来说就是在 conf/tomcat-users.xml 文件中添加管理员账户, 例如如下所示:

<?xml version='1.0' encoding='utf-8'?><tomcat-users><rolerolename="Admin"/><userusername="jackyliu" password="jackyliu" roles="Admin"/></tomcat-users>
这个文件中就设置了一个名为 jackyliu 的管理员, 它也在 JSPWik 中具有管理权限. 当然, 你应该把这两行加入原来的文件内容, 保持原来的文件内容不变, 然后需要重启 Tomcat 才能生效.

1. 全局的权限控制
首先 JSPWiki 通过 JAAS 配置了全局的权限(默认的权限), 它的配置文件在 WEB-INFO/jspwiki.policy 中. 其文件内容如下所示:

 

需要提一下的是末尾的管理员设置部分, "JSPWiki" 指的是 WEB-INF/jspwiki.properties 文件中定义的'jspwiki.applicationName' 属性值, 如果这个值没有设置对, 那么是不能进行管理权限的.

默认的设置对匿名用户是可以浏览, 编辑和创建新页面的, 如果想对此有所限制的话, 就得将 "edit" 和 "createPages" 权限去掉, 将文件开头部分的内容变成如下所示:
grant signedBy "jspwiki",
principal com.ecyrd.jspwiki.auth.authorize.Role "Anonymous" {
permission com.ecyrd.jspwiki.auth.permissions.PagePermission "*:*", "view";
permission com.ecyrd.jspwiki.auth.permissions.PagePermission "*:*", "edit";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "createPages";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "editPreferences";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "editProfile";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "login";
};

如果想限制的更严格, 必须登录才能浏览, 那就得去掉 "view" 权限变成所示:
grant signedBy "jspwiki",
principal com.ecyrd.jspwiki.auth.authorize.Role "Anonymous" {
permission com.ecyrd.jspwiki.auth.permissions.PagePermission "*:*", "view";
permission com.ecyrd.jspwiki.auth.permissions.PagePermission "*:*", "edit";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "createPages";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "editPreferences";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "editProfile";
permission com.ecyrd.jspwiki.auth.permissions.WikiPermission "*", "login";
};
但是这时候不要关闭了 login 权限, 否则你的网站就成了永远无法浏览的网站了.
改动完毕后必须重启 Web 应用(reload或者重启服务器)才可以生效.


2. 页面级别的权限控制
页面级别的权限控制要比全局控制的优先级高, 所对应的权限是 PagePermission. 当然管理员是具有所有权限的, 不受此设置的影响. 它的处理在 Element com.ecyrd.jspwiki.parser.JSPWikiMarkupParser.handleAccessRule(String ruleLine) 中进行. 具体的方式是在页面的源代码(在浏览器中访问 Wiki 网站后点击"Edit Page"即是页面的源代码)中加入如下语句:
[{ALLOW 权限 角色}]
[{DENY 权限 角色}]
权限包括 PagePermission 中的任一名称,例如: comment, delete, edit, modify, rename, upload, view; 角色可以包括多个人, 按照下列规则进行判断:

Principal com.ecyrd.jspwiki.auth.AuthorizationManager.resolvePrincipal(String name)

Given a supplied string representing a Principal's name from an Acl, this method resolves the correct type of Principal (role, group, or user). This method is guaranteed to always return a Principal. The algorithm is straightforward:

If the name matches one of the built-in com.ecyrd.jspwiki.auth.authorize.Role names, return that built-in Role
If the name matches one supplied by the current com.ecyrd.jspwiki.auth.Authorizer, return that Role
If the name matches a group managed by the current com.ecyrd.jspwiki.auth.authorize.GroupManager, return that Group
Otherwise, assume that the name represents a user principal. Using the current com.ecyrd.jspwiki.auth.user.UserDatabase, find the first user who matches the supplied name by calling com.ecyrd.jspwiki.auth.user.UserDatabase.find(String).
Finally, if a user cannot be found, manufacture and return a generic com.ecyrd.jspwiki.auth.acl.UnresolvedPrincipal
Parameters:
name the name of the Principal to resolve
Returns:
the fully-resolved Principal


首先检查是不是内置的Role, 例如: All Anonymous Asserted Authenticated Admin;
接着检查是不是已认证的用户, 然后返回已认证用户的 Role;
接下来检查是不是一个组(Group)名称, 如果是的话返回 Group;
否则就检查是不是一个用户名, 如果都不是, 就返回无法解析的角色.


加入权限控制以后, 如果用户的权限不够, 就会重定向到出错页面告诉它权限不够.

简单的例子:
[{ALLOW edit jackyliu,eric}]
[{ALLOW view All}]
表示只有 jackyliu, eric 和 管理员才能修改当前页面, 但是所有人都可以浏览.

[{ALLOW edit GroupBeijing}]
则表示只有 GroupBeijing 的成员才能修改和浏览当前页面(当然管理员必须事先创建了名为 edit GroupBeijing 的组并设置了其中的成员).
[{ALLOW view GroupBeijing}] 则表示只有 GroupBeijing 的人才可以查看此页面.

这样一来, 我们就可以对单个的页面指定是某个组还是单个用户可以对它拥有操作的权限了, 推荐基于组来进行页面权限的管理.

 

原创粉丝点击