2011-03-02 61 views
4

我成功地使用Devise和CanCan创建了登录系统,我有3种类型的用户。管理员,内部和全球用户。我创建了控制器和索引操作:Admin,Cpanel,Report和State,并且我想限制某些用户对此控制器的访问。设置CanCan ability.rs模型

管理员用户应该有privilegies访问:报告(全部),国家(读),管理(全部)

全球用户应该有privilegies访问:报告(只读),国家(读),交友(全部)

内部用户应该有privilegies访问:报告(全部),国家(读)

我试着用下面的代码来做到这一点ability.rs

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 

    if user.role? :admin 
     can :manage, [Report, Admin] 
     can :read, State 
    elsif user.role? :global_user 
     can :read, [Report, State] 
     can :manage, Cpanel 
    elsif user.role? :internal_user 
     can :manage, Report 
     can :read, State  
    end 
    end 
end 

这时我只有在这个控制器的索引动作,当我登录到内部用户的应用程序,我可以访问/ admin作为例子,这不是我想要的行为。我想限制对所有控制器的访问,而不是在capability.rb类中列出的控制器。

Source code is here

回答

8

如果我打算阻止访问整个控制器,那么我会先创建一个过滤器,将用户重定向到拒绝访问页面(如果他没有管理员角色)。可能看起来像:

def check_permissions 
raise CanCan::AccessDenied unless @current_user.role?(:admin) 
end 

如果我只是想阻止访问更新和创造,例如,我会做:

def update 
    raise CanCan::AccessDenied unless can?(:update,Thing) 
    ... 
end 

def create 
    raise CanCan::AccessDenied unless can?(:create,Thing) 
    ... 
end 

你可以在你的应用程序控制器处理CanCan::AccessDenied例外:

rescue_from CanCan::AccessDenied do |exception| 
    flash[:error] = exception.message 
    redirect_to no_access_path 
    end 

我有惨惨一些不错的职位,并制定herehere

UPDATE 我用这个方法在我的应用程序控制器设置我的当前用户变量:

# Make the current user object available to views 
    #---------------------------------------------------------------------------- 
    def get_user 
    @current_user = session[:current_user] 
    end 
+0

为什么我会得到未定义的方法“角色?”为零:NilClass? – dormitkon 2011-03-02 12:41:57

+0

而我在用户模型方法角色? – dormitkon 2011-03-02 12:53:30

+0

这意味着你正在调用角色?方法在零。如果你使用了我的代码,那么你的@current_user对象是零。您需要确保设置。看到我上面的编辑我如何做到这一点 – Tony 2011-03-02 16:30:56

2

您需要添加检查的康康舞授权的控制器。

这可能只是添加一行像

authorize! :read, @state 

你的状态控制器索引操作,同样对于所有其他指数的行动。

编辑: 对不起,在状态控制器索引操作,你可能没有@状态,所以上述不适用。也许像

authorize! :read, State 

还有一个load_and_authorize方法,你可以用它来授权多个操作的控制器,合并和减少你的代码。该load_and_authorize版本很可能类似于

load_and_authorize_resource:状态

,它应该是在你的行动。

您可能需要查看此railscast on cancan authorization以获取完整的基本设置(在rails2中)。

我怀疑要清除其他问题,我们可能需要看到更多的代码。尝试发布一些您的控制器代码。

我还没有在rails3中使用过这个,但我认为它大部分仍然或多或少相似。

+0

我无法访问/状态,也无法访问有权限的用户。 – dormitkon 2011-03-02 01:11:48

+0

@Mladjan Antic:查看我的编辑。 – 2011-03-02 01:29:35

+0

我在管理员控制器中添加了“授权!:索引,管理员”,索引操作。 现在,当我想访问/管理loged作为一个全球性的用户,我得到NameError在AdminController#指数 未初始化的常量AdminController ::管理 整个应用程序是在这里: http://cl.ly/2E292R2m2B0X141q3C0S – dormitkon 2011-03-02 01:38:08

0

我解决了这个问题,

def check_permissions 
raise CanCan::AccessDenied unless current_user.role?(:admin) 
end 

但是,请注意,我必须改变@current_usercurrent_user(不含@)

谢谢Tony