2010-01-25 114 views
2

我为我的应用程序使用了CanCan授权插件(http://github.com/ryanb/cancan),至今为止效果很好。我把它设置如下:Rails CanCan身份验证问题

class Ability 
    include CanCan::Ability 

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

    if user.role == "admin" 
     can :manage, :all 
    else 
     can :read, :all 


    end 
    end 
end 

这使我可以指定一些用户管理员,只有他们可以访问写功能。现在我想再走一步,使其完全没有登录(current_user/user_session不存在)的人无法访问站点的某些控制器。我知道它应该是某种elsif,用户的代码中间部分和其他人的最后部分。但是,我还没有找到最好的方法来设置这个。是否有人熟悉CanCan并对如何最好地处理这种类型的情况有一些想法。

谢谢你们,每一点都可以帮助我更全面地了解rails和开发!

回答

4

我对CanCan不太熟悉,但是这种逻辑属于特定的控制器。这是我如何做的摘录。我相信你明白了,可以将它抽象到CanCan上。

class ItemsController < ApplicationController 
    before_filter :login_required 
    # or if you only want to restrict it to some actions etc 
    # before_filter :login_required, :except => [:show] 
    # or 
    # before_filter :login_required, :only => [:edit] 
end 

class ApplicationController < ActionController::Base 
    protected 
    def login_required 
     access_denied! unless current_user.logged_in? 
    end 
end 

CanCan是授权不认证。有一个区别;)

+0

好的,非常感谢你,我想我是在想这个问题。我仍然可以使用CanCan来处理更复杂的管理逻辑,然后仅使用您为页面编写的内容,而不管是否有人登录。非常感谢! – user258480 2010-01-25 17:02:53

+0

如果这个答案对你来说足够了,你应该用你的问题标记为我的帖子左侧的链接。 – 2010-01-25 19:07:23

0

我不知道你是否仍在寻找这个答案,但它并不难。所有你需要的是一个客人用户的错误条件。在你的其他块中,放上类似 可以:show,Controller do | controller | user.id.present? 结束

如果用户的客人,这将是假的,因为它没有被保存,因此没有访问。 如果它是一个登录用户,它将是真实的,所以他们将获得访问权限。

0

也许你可以这样做:

def initialize(user) 
    if user.role?("admin") 
     can :manage, :all 
    elsif user.role?("sales member") 
     can :manage, Request 
    elsif user.role?("sales admin") 
     can :manage, Request 
     can :manage, SpecialOffer 
    else 
     cannot :manage, :all 
    end 
    end 

而不是放:所有的,只是把模型(如请求,SpecialOffer)的名称。

How to implement the dynamic authorization with CanCan?