如何安全地为我的Rails网站添加管理员访问权限?

4
我认为答案是管理员登录并检查用户是否有管理员标志,但我也考虑了其他相关问题。
在非管理员用户表中是否应该有一个管理员标志(attr_protected),还是应该有一个管理员用户表?
我应该为管理员用户创建一个单独的Rails应用程序吗?这可能过度了,因为它们都必须访问相同的数据库(更不用说设置可能会很麻烦)。
还有其他建议吗?现在我只需要保护一页或两页内容,所以我甚至考虑使用HTTP基本身份验证或摘要身份验证作为临时措施(受保护的内容实际上并不是非常私密/重要)。但是……我不知道如何为特定操作实现HTTP身份验证,我只看到了如何实现防止目录访问的方法。
任何指导和讨论都很好。我相信其他Stack Overflow用户也会从这个讨论中受益。
谢谢!
3个回答

5

+1 给 ryanb,任何新的 Rails 开发者都应该看他的视频教程。 - klochner

2

我正在使用restful_authentication插件来实现这个目的。它非常简单,可以限制访问任何控制器或任何方法。例如,在控制器中添加此函数:

private
def authorized?
  user.admin?
end

或者

private
def authorized?
  user.admin? if update? || create?
end

我在我的用户模型中定义了admin?方法。我还创建了update?和create?方法来检查调用了哪个操作。在restful_authentication中,每次访问控制器时都会运行authorized?方法。

我会将所有内容放在一个应用程序和一个表中(不要创建用户和管理员表)。您可以通过允许仅为现有管理员用户设置此值来在用户控制器中保护管理员标志。


2
我认为这取决于管理类型。
如果管理员对站点的视图与普通用户相同,但具有额外的特权,则应使用管理员标志(或随着需求的扩展,采用完整的角色表)。在这种情况下,每个人都看到相同的内容,但管理员可以访问各种操作(删除?编辑?禁止?等),而普通用户则不能。
如果管理员所需的视图与正常站点大不相同,则建议使用完全独立的Rails应用程序来访问相同的数据库。例如,如果您的“管理员”实际上是帮助台员工,他们将回答电话或处理计费问题,他们可能对数据库有完全不同的视图(以及编辑数据的方式),这些视图在常规应用程序中不可用。
拥有多个站点的缺点是可能会导致模型(验证、关联等)失去同步。拥有单个站点的缺点是您可能会在先前易于理解的站点部分插入各种丑陋的“if-admin”代码。哪个问题更容易处理取决于您的要求。

如果您将所有管理相关的内容放入管理名称空间中,您就不需要在代码中添加任何“if-admin”,并且您可以获得一个模型集、一个应用程序(服务器上使用的资源更少)等。 - klew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接