我正在开发一个 Rails Web 应用程序,目前有大约 20 个用户正在使用它。
应用程序的某些部分只能由某些用户访问,因此我们已经有了一个基本的授权框架,我使用acts_as_authenticated 插件实现了它。
用户的权限取决于他们在哪个部门工作,例如管理可以访问应用程序的所有部分,而会计只能访问与会计相关的部分,而销售只能访问与销售相关的部分等。
另一方面,用户会看到指向他们没有足够权限的操作的链接。例如,销售部门的人员在主菜单中看到一个指向财务记录的链接,但当他们单击它时,什么也没有发生。之所以如此,是因为 AFAIK 没有使用acts_as_authenticated 查询用户权限的有效方法。
我想通过两种方式改变它:
我想引入更细粒度的授权。目前,授权是在控制器级别完成的。我想在动作或模型级别执行此操作。例如,我希望销售部门的人员能够创建和更新付款,但不能删除它们。
我希望能够有效地查询用户权限,这样我就可以从界面中删除不必要的(和令人困惑的)链接。
你认为最优雅的实现方式是什么?
不需要特定于 Rails 的答案,我只想知道如何在数据驱动的应用程序中实现这一点。
最后,这是它目前的实现方式:
def authorized?
current_user.role.foo? or current_user.role.bar?
end
这是我最初的想法,我认为这不是解决这个问题的最佳方法:
+------------+------------+---------+ | 部门 | 控制器 | 行动 | +------------+------------+---------+ | 会计| 付款 | 索引 | | 会计| 付款 | 新 | | 会计| 付款 | 创建 | | 会计| 付款 | 编辑 | | 会计| 付款 | 更新 | | 会计| 付款 | 销毁| | 销售 | 付款 | 新 | | 销售 | 付款 | 创建 | | 销售 | 付款 | 编辑 | | 销售 | 付款 | 更新 | +------------+------------+---------+
或者
+------------+----------+--------+--------+------+- --------+--------+ | 部门 | 型号 | 列表 | 创建 | 阅读 | 更新 | 删除 | +------------+----------+--------+--------+------+- --------+--------+ | 会计| 付款 | 真的 | 真的 | 真的 | 真的 | 真的 | | 销售 | 付款 | 错误 | 真的 | 真的 | 真的 | 错误 | +------------+----------+--------+--------+------+- --------+--------+