4

我正在考虑将 RefineryCMS 用于大型 Web 应用程序,其中包括新闻通讯、博客、论坛、教程等。创建我知道 RefineryCMS 会擅长的那些东西。

我的问题是 RefineryCMS 可以处理具有不同访问/权限类型的不同类型用户吗?

如果我有一个“会员”用户,我希望他们能够访问博客和论坛,但如果我有一个“高级”用户,他们应该有权阅读新闻通讯、博客、论坛和教程。“管理员”用户应该能够管理和查看站点中的所有内容。

这种类型的细粒度控制是否超出了 RefineryCMS 的范围,我是否应该考虑从头开始创建这个站点?

4

1 回答 1

10

是的,您可以通过将 before_filter 添加到适当的refinerycms 控制器来添加细粒度控制。在那个 before_filter 中你可以使用 CanCan,但是炼油厂已经有一个角色表,你可以很容易地利用它。

例如,这是控制对博客的访问的一种方法。

使用您选择的控制台或其他界面,添加一个 title="member" 的新角色。

添加另一个 title="premium_user"

然后(如果您的身份验证模型称为用户),在控制台中

>member1 = User.find(1)
>member1.roles << Role.where(:title=>"member").first
>member1.save

同样,您可以将“premium_user”角色添加到正确的用户。

创建 MyApp/lib/restrict_blog_to_member_role.rb

module RestrictBlogToMemberRole
  def restrict_blog_to_member_role
    return true unless !(current_user.try(:has_role? "member")
    flash[:notice]="Please become a member with us before accessing the blog."
    redirect_to home_path #or some other destination path that exists
    return false
  end
end

在 MyApp/config/application.rb 中,设置 before_filter 以便在开发模式下的每次调用时重新加载,以防您在服务器运行时更​​改它......

module MyApp
  class Application < Rails::Application
    ....
    config.before_initialize do
      require 'restrict_blog_to_member_role'
    end
    config.to_prepare do
      BlogController.send :include, RestrictBlogToMemberRole
      BlogController.send :before_filter, :restrict_blog_to_member_role
    end
    ....
  end
end

您可以对 PagesController、Admin::BaseController、Admin::RefinerySettingsController、Admin::Blog::PostsController 等其他炼油厂控制器执行相同操作,并添加处理其他角色的方法,例如“premium_user”,具体取决于授权规则你想实施。

或者,您可以使用直接在您的 app/controllers 文件夹中覆盖炼油厂控制器

rake refinery:override controller=blog_controller #for example.

然后您可以合并对 CanCan 之类的调用,或者直接在上面添加之前的过滤器。如果您覆盖,当它发生变化时升级refinerycms 会有点困难,因为当它发生变化时,您有一个额外的步骤,即用最新版本的控制器重新覆盖和重新合并您的代码。

回复:“admin”用户,refinerycms 已经准备使用 title="Superuser" 的角色,并要求至少有 1 个用户拥有该角色。它预先配置了一些授权逻辑,超级用户可以做什么,而没有该角色的人不能。

于 2011-08-24T18:28:40.570 回答