2010-01-25 1 views
2

Я использую плагин авторизации CanCan (http://github.com/ryanb/cancan) для моего приложения, и он отлично работает до сих пор. У меня было установлено следующее:Rails CanCan Auth Problem

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 и имеет некоторые идеи о том, как наилучшим образом подойти к такому типу ситуации.

Спасибо, ребята, каждый бит помогает мне узнать больше о рельсах и развитии в целом!

ответ

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

+0

Если этого достаточно для вас, вы должны пометить свой вопрос как ответ, используя ссылку слева от моего сообщения. –

0

Я не знаю, все ли вы ищете ответ на этот вопрос, но это не слишком сложно. Все, что вам нужно - это условие, которое является ложным для гостя. В вашем блоке else поставьте что-то вроде можно: показать, контроллер сделать | контроллер | 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?)