【发布时间】:2015-03-13 01:53:23
【问题描述】:
我正在编写一个插件来在外部应用程序中显示 vBulletin 4 论坛的最新线程/帖子。两个系统都在同一个域上运行,因此我能够在外部应用程序中获取用户的 vB 会话。因为 vB 论坛有一些具有特殊权限的论坛(例如员工的内部论坛),所以我只想显示至少允许用户阅读的线程。
我发现可以这样做:
$notAccessableForums = array();
foreach($vbulletin->forumcache as $forumId => $forumInfo) {
// User need at least view-access
$userCanViewForum = $vbulletin->userinfo['forumpermissions'][$forumId] & $vbulletin->bf_ugp_forumpermissions['canview'];
if(!$userCanViewForum) {
$notAccessableForums[] = $forumInfo['forumid'];
}
}
$notAccessableForums 将是当前用户无法访问的所有 forumId 的数组。这可以很容易地用于在 SELECT 语句中为线程排除它们,例如
$query = 'SELECT title [...]
FROM thread
WHERE forumid NOT IN(' . implode(',', $notAccessableForums) . ');';
这些解决方案的问题是论坛列表和用户的论坛权限需要 vB 核心。由于以下原因,我不想包含核心:
- 它使我的插件不灵活,因为它需要访问 vB 板的文件
- 当我在我的网站中包含 vB-Core 时,它会变慢,因为上面已经有一个 CMS,而且 vBulletin-Core 真的很大,会导致性能不佳
- 我希望我的插件是独立的(尽可能)
我查看了vB源代码,发现论坛权限被序列化存储在datastore表中(这也是一个非常大的数组,因为还有很多其他信息我没有存储需要像统计数据,关系等)。但我不知道如何在论坛上获得用户特定的权限。
换句话说:我需要存储在 vB var $vbulletin->userinfo['forumpermissions'][$forumId] 中的位域,以便我可以在我的班级中将 $vbulletin->bf_ugp_forumpermissions['canview'] 定义为常量,并从数据库中获取所有论坛的列表以检查其中哪些是当前用户无法查看。
【问题讨论】:
标签: php permissions user-permissions vbulletin bit-fields