基于信誉实施权限[关闭]

Posted

技术标签:

【中文标题】基于信誉实施权限[关闭]【英文标题】:Implementing permissions based on reputation [closed] 【发布时间】:2011-08-25 16:52:12 【问题描述】:

我正在创建一个网站,其中包含每个用户或用户组的项目、用户和权限。这是一个社区协作工具,我有 4 种不同的权限:

创建者 - 进行更改、接受更改、更改权限 接受更改 进行更改 查看

如何在数据库中为用户组实现这种权限系统?

编辑:组/权限由信誉定义,例如在 *** 上。

编辑2-更详细:每个文件都需要有权限,项目需要新建文件的默认权限,我还需要设置mysql数据库权限。

【问题讨论】:

一定要用php吗?我知道 Django 有很好的开箱即用权限支持。我猜想任何给定的 MVC(或类似)框架都可能为您提供类似的权限。 Django 也很容易上手和学习。 @wilbee01 如果他正在做网站开发,那么 Django 将无法工作,因为那是 Python,他需要 PHP 或 ASP.net 来进行 Web 开发。 不,我不能,很遗憾:( 你可能会觉得这个话题很有趣:***.com/questions/5875646/database-schema-for-acl/… 【参考方案1】:

我会创建两个表;用户和排名。

User
-----
id
username
rankID


Ranks
------
id
makeChanges
acceptChanges
changePermissions
view

然后只需在 Ranks 表中创建您想要的各种排名,并设置用户的 rankID 以匹配您想要的相应排名。确保在 Ranks 表中将每个字段的值设置为 0 或 1; 0 表示没有该能力,1 表示有该选项。

编辑 如果您打算在没有数据库的情况下执行此操作,那么您可以使用 PHP5 中的类甚至实例来执行此操作。例如,假设您为原始帖子中的每一项内容都设置了名称:

Creator - make changes, accept changes, change permissions
Reviewer - Accept changes
Editor - Make changes
Regular - View

然后您可以执行以下操作。 (数据库方式显然会更好,但这只是一个例子。)

class Regular

    public function View()
    
        //Do the view stuff in here
    


class Editor extends Regular implements Edit




class Reviewer extends Regular implements Review




interface Review

    public function AcceptChanges()
    
        //Do the accept changes here
    


interface Edit

    public function MakeChanges()
    
        //Do the make changes stuff here
    



class Creator extends Regular implements Edit, Review

    public function ChangePermissions()
    
        //Do the change permissions stuff here
    

【讨论】:

不过,我遇到的问题是用户组(版主、受信任等,例如 Stack Overflow)。 @minitech 你是什么意思?您将创建一个名为 Moderators 的等级,然后将每个人的等级 ID 设置为该特定等级。接下来只需执行 SQL 查询以获取该组中的所有用户。 @Flipper 前瞻性思维,每次需要新类型的权限时,您都必须添加一个新的 DB 列。 @dqhendricks 是的,你会的,但确实没有其他方法会如此有效。 @Flipper 对于任何代码片段来说都是一个非常大胆的声明。【参考方案2】:
user_table
id, etc

permission table
id, user_id, permission_type

使用这种结构,每个用户都可以拥有与其帐户相关联的多种权限类型,每个权限类型对应于他们可以访问的每组功能。您永远不需要更改表结构来添加新类型的权限。

为了更进一步,您可以将每种类型的权限设置为二进制数。这样,您可以使用按位运算符使一组权限由一个整数表示。

例如,如果你有常量

PERMISSION_CHANGE_PERMISSIONS = bindec('001') = 1
PERMISSION_MAKE_CHANGES = bindec('010') = 2
PERMISSION_ACCEPT_CHANGES = bindec('100') = 4

您可以使用按位运算符“|”将这些值组合成一个整数

(PERMISSION_CHANGE_PERMISSIONS | PERMISSION_MAKE_CHANGES) = bindec('011') = 3 = $users_combined_permissions

然后要检查他们是否有特定的权限,请使用按位运算符“&”

($users_combined_permissions & PERMISSION_MAKE_CHANGES) = true

如果您这样做了,那么每组权限只需要一个 db 记录。

【讨论】:

这是一种有趣的方法,但我认为这种方法只适用于需要复杂且具有许多不同权限的系统。 @Flipper 我猜。然而,考虑未来永远不会有坏处。让您的代码变得敏捷可以节省大量时间和日后的麻烦。 我最终还是选择了这个。谢谢大家。 @dqhendricks,我喜欢我的系统的这个想法;但我有一个问题,如果我有多个部分系统怎么办。例如,我想授予用户“XYZ”只有PERMISSION_CHANGE_PERMISSIONS 到“新闻”部分,我还想授予“XYZ”PERMISSION_MAKE_CHANGESPERMISSION_CHANGE_PERMISSIONSPERMISSION_ACCEPT_CHANGES 到博客部分?如何区分部分?我的第一个想法是在权限表中添加一个带有部分名称的新列,但我想知道是否有更好的方法来实现这个巧妙的想法? @Mike 好吧,您可以使用命名约定并将其全部保存在同一列中,例如 NEWS_PERMISSION_CHANGE_PERMISSIONS 和 BLOG_PERMISSION_CHANGE_PERMISSIONS。两列同样可行。【参考方案3】:

我过去曾为此使用过Zend_Acl。我可以推荐它。一个久经考验的库,非常容易实现并且可以独立使用。如果您以后要添加不同的权限方案,此选项将很好地扩展。

【讨论】:

以上是关于基于信誉实施权限[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

基于 Spring 安全权限的 api 访问

基于RBAC权限控制模型的管理系统的设计与实现

基于RBAC权限控制模型的管理系统的设计与实现

如何实现基于组和角色的权限系统?

基于Android 6.0 的蓝牙开发-- 开启,关闭,搜索,连接

ERP实施顾问工作中应努力做到哪些?