【问题标题】:User Authorization with CanCan: NoMethodError使用 CanCan 进行用户授权:NoMethodError
【发布时间】:2012-07-02 17:10:59
【问题描述】:

我在我的应用程序中使用 CanCan 进行授权。我目前将所有每个用户的信息都存储在 /users/2 或 users/3 或 /users/4 等等。

我的问题是,当用户登录时,他们只需修改 URL 即可查看其他用户的敏感内容。如何使用 CanCan 防止用户(例如 users/2)看到(users/3)?

当我将“load_and_authorize_resource”添加到我的用户控制器时,我收到以下错误:

NoMethodError in UsersController#show

undefined method `user_id' for #<User:0x007fee61e90b90>

型号

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
      can :access, :rails_admin
      can :dashboard 
    else
      can :manage, User, :user_id => user.id
    end

控制器

  class ApplicationController < ActionController::Base
      protect_from_forgery

      rescue_from CanCan::AccessDenied do |exception|
        redirect_to root_path, :alert => exception.message
      end


class UsersController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource

   def show
    @user = User.find(params[:id])
    @date = params[:month] ? Date.parse("#{params[:month]}-01") : Date.today
    @occasions = @user.occasions.page(params[:page]).per(5)
  end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 authorization cancan


    【解决方案1】:

    您是否尝试将load_and_authorize_resource 放在UsersController 的顶部?

    【讨论】:

    • 想通了..只需将“can :manage, User, :user_id == user”改为小写 u “can :manage, user, :user_id == user”
    【解决方案2】:

    我认为你应该使用

    can :manage, User, :id => user.id
    

    所以当用户的 id 与当前用户的 Id 相同时,他们可以管理用户的记录 - 那就是他们自己? User 类没有 user_id,这就是它一开始不起作用的原因。

    【讨论】:

    • 我同意这个答案。这也是我注意到的第一件事。
    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多