我想做一个简单的登录,注销,另外,不同的用户有不同的用户角色。 Restful身份验证似乎很有效,而cancan对于控制用户能力也非常好。但问题是我怎样才能让这两个一起工作。我看了轨道广播,我是否如何检测用户的能力?我是否需要在用户表中添加“能力”列?谢谢你。
http://railscasts.com/episodes/67-restful-authentication
http://railscasts.com/episodes/192-authorization-with-cancan
答案 0 :(得分:1)
查看CanCan GitHub页面:http://github.com/ryanb/cancan
在查看和RailsCast的基础上,我注意到两件事:
使用restful_authentication,只需使用User
模型执行正常操作。
添加CanCan最自然的方法是在名为User
或role
的{{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