У вас есть нулевой объект, когда вы этого не ожидали - PullRequest
0 голосов
/ 26 ноября 2010

Меня интересует тема безопасности Rails и использования Безопасность на Rails . Я нахожусь на Реализации RBAC / страница 142 /, и я не могу пройти мимо ошибки в предмете. Вот код:

module RoleBasedControllerAuthorization

  def self.included(base)
    base.extend(AuthorizationClassMethods)
  end

  def authorization_filter
    user = User.find(:first, 
      :conditions => ["id = ?", session[:user_id]])

    action_name = request.parameters[:action].to_sym
    action_roles = self.class.access_list[action_name]

    if action_roles.nil?
      logger.error "You must provide a roles declaration\
        or add skip_before_filter :authorization_filter to\
        the beginning of #{self}."
      redirect_to :controller => 'root', :action => 'index'
      return false
    elsif action_roles.include? user.role.name.to_sym
      return true
    else
      logger.info "#{user.user_name} (role: #{user.role.name}) attempted to access\
        #{self.class}##{action_name} without the proper permissions."
      flash[:notice] = "Not authorized!"
      redirect_to :controller => 'root', :action => 'index'
      return false
    end
  end      
end    

module AuthorizationClassMethods
  def self.extended(base)
    class << base
      @access_list = {}
      attr_reader :access_list 
    end
  end

  def roles(*roles)
    @roles = roles 
  end

  def method_added(method)
    logger.debug "#{caller[0].inspect}"
    logger.debug "#{method.inspect}"
    @access_list[method] = @roles  
  end
end

And @access_list [method] = строка @roles, выдающая следующее исключение:

ActionController::RoutingError (You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]=):
  app/security/role_based_controller_authorization.rb:66:in `method_added'
  app/controllers/application_controller.rb:5:in `<class:ApplicationController>'
  app/controllers/application_controller.rb:1:in `<top (required)>'
  app/controllers/home_controller.rb:1:in `<top (required)>'

Я использую Rails 3.0.3 и Ruby 1.9.2. Я храню сессию в базе данных. Наконец, спасибо за каждый совет.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2010

Я не уверен, что это проблема, но это выглядит подозрительно:

class << base
  @access_list = {}
  attr_reader :access_list 
end

Не должно @access_list быть переменной класса @@access_list?

0 голосов
/ 26 ноября 2010

Вы определяете @access_list как переменную экземпляра класса, но вы обращаетесь к нему как к экземпляру instance_variable экземпляру класса. Следующее, вероятно, должно работать:

module AuthorizationClassMethods
  def access_list
    @access_list ||={}
  end

  def method_added(method)
    logger.debug "#{caller[0].inspect}"
    logger.debug "#{method.inspect}"
    access_list[method] = @roles  
  end
end

Если вам нужна авторизация, вы можете проверить Канкан, автор Райан Бейтс

https://github.com/ryanb/cancan

0 голосов
/ 26 ноября 2010

Похоже, вы не можете получить доступ к @access_list в method_added.Я бы попробовал

class << base
  attr_accessor :access_list 
  @access_list = {}
end

Может не решить вашу конкретную проблему, но в противном случае вы не сможете вызвать @access_list[method] = @roles, если ваш атрибут access_list доступен только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...