在RoR上进行身份验证的任何懒惰方式?

时间:2010-07-08 15:55:09

标签: ruby-on-rails authentication

我想做一个简单的登录,注销,另外,不同的用户有不同的用户角色。 Restful身份验证似乎很有效,而cancan对于控制用户能力也非常好。但问题是我怎样才能让这两个一起工作。我看了轨道广播,我是否如何检测用户的能力?我是否需要在用户表中添加“能力”列?谢谢你。

http://railscasts.com/episodes/67-restful-authentication

http://railscasts.com/episodes/192-authorization-with-cancan

2 个答案:

答案 0 :(得分:1)

查看CanCan GitHub页面:http://github.com/ryanb/cancan

在查看和RailsCast的基础上,我注意到两件事:

  1. 您将Ability定义为单独的模型。似乎没有任何必要的数据库列。
  2. 你不可能被迫担任角色,你可以自由地这样做。
  3. 使用restful_authentication,只需使用User模型执行正常操作。

    添加CanCan最自然的方法是在名为Userrole的{​​{1}}模型中添加额外的列,然后根据需要定义方法。我个人可能会在数据库中存储某种数字系统,例如“0”表示管理员,“1”表示高级用户,“2”表示低级用户,等等。

    以下是一些可能性:

    ability

    # Returns true if User is an admin
    def admin?
      self.role == 0
    end
    

    然后在您的# Returns true if User is admin and role?(:admin) is called, etc. def role?(to_match) { 0 => :admin, 1 => :super_user, 2 => :user, 3 => :commenter, }[self.role] == to_match end Ability方法中,您可以使用某种条件设置功能,例如Railscast /自述文件中的这些代码段:

    initialize

    或者:

    if user.role? :admin
      can :manage, :all
    elsif user.role? :super_user
      ...
    end
    

答案 1 :(得分:0)

我写了一个与CanCan一起使用的简单解决方案,只需将一个role_id:integer列添加到User模型中:

# puts this in /lib/
module RolePlay
  module PluginMethods
    def has_roleplay(roles = {})
      @@roles = roles
      @@roles_ids = roles.invert

      def roles
        @@roles
      end

      def find_by_role(role_name, *args)
        find(:all, :conditions => { :role_id => @@roles[role_name]}, *args)
      end

      define_method 'role?' do |r|
        r == @@roles_ids[role_id]
      end

      define_method :role do
        @@roles_ids[role_id]
      end
    end
  end
end

然后在config / initializers / roleplay.rb

中包含此行
ActiveRecord::Base.extend RolePlay::PluginMethods

最后在您的用户模型中使用它:

class User < ActiveRecord::Base
  # ...
  has_roleplay(:admin => 0, :teacher => 1, :student => 2)
  # ...
end

现在你的模型将有2种新方法:

@user.role?(:admin) # true if user has admin role
@user.role # returns role name for the user