我不知道如何在我的rails应用程序中处理用户角色以及使用cancancangem



我是rails的新手,我正在尝试构建一个具有三个角色的用户模型的应用程序:管理员、成员和访问者。我已经建立了应用程序,安装了cancancan和设计宝石。然后,我通过迁移将"角色"添加到用户模型中,这为用户提供了"角色";访问者";默认角色:

def change
add_column :users, :role, :integer, default: 0
end
end

然后,我通过定义授权来设置取消能力:


class Ability
include CanCan::Ability
def initialize(user)
alias_action :create, :read, :edit, :update, :destroy, to: :crud  # The first argument to `can` is the action you are giving the user
if user.admin?
can :manage, :all 
elsif user.member?
can :crud, Item, user_id = user.id 
elsif user.visitor?
can :read, all
end  
end
end

我想我可能需要在中定义角色,以便用户稍后能够在整个应用程序中检查他们的授权:

class User < ApplicationRecord 
enum role: [:visitor, :member, :admin] 
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :items
def admin?(user)
if user.role == 2
return true
end
end
def member?(user)
if user == current_user
user.role = 1
return true
end
end   
def visitor?(user)
if user != current_user && user.role != 2
user.role = 0 
return true
end 
end
end

由于我没有配置应用程序让用户选择他们的角色,应该有一个";admin";,我把自己设定为";管理员";通过更改rails控制台中的用户角色(默认情况下为"访问者"(。我在我的控制器中使用了"byebug"来查看我的角色是否已被修改为";admin";;然而,它仍然是";访问者";。然后我以另一个用户的身份退出并输入;成员";角色,但它是";访问者";。我确信我没有在适当的地方定义角色,并且我无法在用户登录时更新它们以获得适当的角色;我期望每个人都可以成为访客,除非他/她注册或登录,并且用户的角色应该改为"访客";成员";授权完成后。因此,在这个阶段,用户的角色、身份验证和cancan之间没有联系。我非常感谢任何帮助我建立这些联系的指示。感谢

enum role: [:visitor, :member, :admin]将已经生成询问方法visitor?member?admin?

所以你真正需要的是:

class User < ApplicationRecord 
enum role: [:visitor, :member, :admin] 
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :items
end

然后,您可以调用user.visitor?来测试用户是否是访问者,或者调用user.role来获取枚举密钥("visitor"(。

由于以下几个原因,您的admin?member?visitor?方法被完全破坏:

  • user.role不返回整数。它将枚举映射作为字符串("访问者"、"成员"、"管理员"(返回,因此整数比较将始终为false,方法将始终返回false。请参阅文档
  • current_user在型号中不可用,因为它们不支持请求。这是一个在控制器和视图中可用的辅助方法。如果您为该代码编写单元测试,您会发现它会引发NoMethodError

还有一些小错误,比如:

can :crud, Item, user_id = user.id

在这里,你实际上是在分配一个局部变量,所以这个代码相当于:

can :crud, Item, user.id

您想要使用冒号:

can :crud, Item, user_id: user.id
# which is short-hand for
can :crud, Item, { :user_id => user.id }

我希望每个人都可以成为访客,除非他/她注册或登录,并且用户的角色应该改为";成员";授权完成后。

这是一个毫无根据的期望。如果你想要这个逻辑,你需要通过回调或自定义Devise控制器来实现它。

Devise实际上并没有访客用户功能——尽管可以添加一个。

最新更新