【问题标题】:Ruby on Rails5/ cancancan/ devise - Implementing access restrictions for different kind of users (i.e. making user A see different pages than user B)Ruby on Rails/ cancancan/ devise - 为不同类型的用户实施访问限制(即让用户 A 看到与用户 B 不同的页面)
【发布时间】:2017-12-12 15:59:43
【问题描述】:

我正在尝试为我的网站设置某些访问限制,这意味着我希望管理员看到与普通用户不同的页面。我使用 devise 进行用户身份验证,使用 cancancan 进行访问限制。不幸的是,我不太清楚如何用 cancancan 实现它。

我通过为用户分配 2 个不同的角色(布尔值)来标记用户 - 管理员和慈善机构。基本上,我希望管理员在登录时登陆页面 A,并且他还应该可以访问页面 B 和 C(以及 rails_admin)。慈善用户应该登陆页面 D,并且应该可以访问页面 E 和 F。

我尝试将以下代码添加到 app/model/ability.rb 但不幸的是没有任何运气:

user ||= User.new # guest user (not logged in)
if user.admin_role?
  can :manage, :page A
  can :manage, :page B
  can :manage, :page C
  can :access, :rails_admin       # only allow admin users to access Rails Admin
end
if user.charity_role?
  can :manage, page D
  can :manage, page E
  can :manage, page F
end

有人知道我应该改变什么吗?还有,我如何确保管理员登录后登陆页面A,慈善机构登陆页面D?

如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 您拥有page X 的位置通常应该是您可以访问(能力)的对象类,所以我对您的期望有点困惑。也许看到这里link。然后呈现给用户的页面由控制器和视图控制。
  • 哦,好吧,这不是定义管理员可以访问哪些页面以及用户可以访问哪些页面的正确位置吗?
  • 顺便感谢您提供的链接。即使没有完全阐明我的问题,阅读也很有帮助

标签: ruby-on-rails devise rails-admin cancancan


【解决方案1】:

您可以在 Rails 视图或 Rails 控制器中最好地控制网页的显示。因此,例如在带有 ERB 的视图中,您可以控制链接的显示以编辑文章对象:

<% if can? :update, @article %>
  <%= link_to "Edit", edit_article_path(@article) %>
<% end %>

这会假设你 app/models/ability.rb 有类似的东西:

can :update, Article       # user can update Articles

或者如果您想显示一个完全不同的视图模板?然后在控制器中执行此操作。一个粗略的(未经测试的)sn-p,可能在articles_controller.rb 的“show”操作中:

if can? :read, @article 
   template = 'articles/show'
else
   template = 'articles/not_allowed'
end
respond_to do |format|
  format.html { render :template => template }
  format.js { render :template => template }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 2015-01-07
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2010-11-01
    相关资源
    最近更新 更多