我可以将RefineryCMS与Cancan或类似产品一起使用吗?

时间:2011-08-24 12:18:23

标签: ruby-on-rails-3 refinerycms

我正在考虑将RefineryCMS用于大型网络应用程序,其中包括新闻通讯,博客,论坛,教程等。创建我所知道的RefineryCMS会很棒。

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

如果我的用户是“会员”,我想让他们能够访问博客和论坛,但如果我有“高级”用户,他们应该可以阅读新闻简报,博客,论坛和教程。 “admin”用户应该能够管理并查看网站中的所有内容。

这种细粒度控制是否属于RefineryCMS的范围,我应该考虑从头开始创建这个网站吗?

1 个答案:

答案 0 :(得分:10)

是的,您可以通过在适当的refinerycms控制器中添加before_filter来添加细粒度控制。在那个before_filter中你可以使用CanCan,但是refinerycms已经有了一个你可以轻松利用的角色表。

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

使用您选择的控制台或其他界面,添加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有点困难,因为当它发生更改时,您需要重新覆盖并重新合并代码与最新版本的控制器。

Re:“admin”用户,refinerycms已经开始利用title =“超级用户”的角色,并要求至少有1个用户拥有该角色。它预先配置了一些授权逻辑,用于超级用户可以做的事情,那些没有该角色的人不能。