使用 cancancan 的 3 种角色的授权问题
Authorization issue with 3 types of roles using cancancan
我有用户table(由设计创建),我添加了一个角色列,可以是:admin、manager 和agent。在 user.rb 中,我放了一个像这样的 ENUM:
class User < ApplicationRecord
enum role: { admin: 0, manager: 1, agent: 2 }
end
我正在使用 cancancan 并想做两件事:
1 - 如何根据注册用户的角色显示菜单或不同的按钮?在视图中我是这样写的:
<% if current.present? && current_user.admin? %>
<%= link_to 'Purchases (Admin access)', admin_purchases_path, class: 'nav-link mr-5 ' %>
<% end %>
2 - 如何根据用户的角色显示特定的页面?在我的 User.rb 我把这个:
def admin?
self.role == 'admin'
end
我正在 ability.rb:
上试用
user ||= User.new # guest user (not logged in)
if admin?
can :manage, :all
else
can :read, :all
end
在控制器上,我输入:
load_and_authorize_resource
但是我收到一个错误:
NoMethodError in Home#index
undefined method `admin?' for nil:NilClass
<% if current_user.admin? %> <<< On this line here
您可以使用安全导航运算符来避免 nil 错误:
<% if current_user&.admin? %>
然而它仍然有点反模式。使用像 CanCanCan 这样的授权库的全部意义在于整合授权逻辑,而不是将其分散到整个控制器和视图中。
您的视图应该改为询问 CanCanCan 用户是否有权执行 link 所做的任何事情:
<% if can? :administrate, :purchases %>
<%= link_to 'Purchases (Admin access)', admin_purchases_path, class: 'nav-link mr-5 ' %>
<% end %>
它不必知道用户是否是管理员或允许管理员管理购买。这就是 CanCanCans 的工作。
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
can :administrate, :all
else
can :read, :all
end
In my User.rb I put this ..
该代码完全多余。 enum role: { admin: 0, manager: 1, agent: 2 }
已经创建了集成方法 admin?
、manager?
和 agent?
.
您 ability.rb
的问题在于您在呼叫 if admin?
时并未实际指定收件人。你应该打电话给 if user.admin?
.
我有用户table(由设计创建),我添加了一个角色列,可以是:admin、manager 和agent。在 user.rb 中,我放了一个像这样的 ENUM:
class User < ApplicationRecord
enum role: { admin: 0, manager: 1, agent: 2 }
end
我正在使用 cancancan 并想做两件事:
1 - 如何根据注册用户的角色显示菜单或不同的按钮?在视图中我是这样写的:
<% if current.present? && current_user.admin? %>
<%= link_to 'Purchases (Admin access)', admin_purchases_path, class: 'nav-link mr-5 ' %>
<% end %>
2 - 如何根据用户的角色显示特定的页面?在我的 User.rb 我把这个:
def admin?
self.role == 'admin'
end
我正在 ability.rb:
上试用 user ||= User.new # guest user (not logged in)
if admin?
can :manage, :all
else
can :read, :all
end
在控制器上,我输入:
load_and_authorize_resource
但是我收到一个错误:
NoMethodError in Home#index
undefined method `admin?' for nil:NilClass
<% if current_user.admin? %> <<< On this line here
您可以使用安全导航运算符来避免 nil 错误:
<% if current_user&.admin? %>
然而它仍然有点反模式。使用像 CanCanCan 这样的授权库的全部意义在于整合授权逻辑,而不是将其分散到整个控制器和视图中。
您的视图应该改为询问 CanCanCan 用户是否有权执行 link 所做的任何事情:
<% if can? :administrate, :purchases %>
<%= link_to 'Purchases (Admin access)', admin_purchases_path, class: 'nav-link mr-5 ' %>
<% end %>
它不必知道用户是否是管理员或允许管理员管理购买。这就是 CanCanCans 的工作。
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
can :administrate, :all
else
can :read, :all
end
In my User.rb I put this ..
该代码完全多余。 enum role: { admin: 0, manager: 1, agent: 2 }
已经创建了集成方法 admin?
、manager?
和 agent?
.
您 ability.rb
的问题在于您在呼叫 if admin?
时并未实际指定收件人。你应该打电话给 if user.admin?
.