0

我试图阻止用户访问不属于他/她的个人资料。我的 UserProfile 模型链接到我的配置文件模型,并且有一个与 user_id 相关的列。我的想法是使用 cancan 和“如果 user.id 与 user_profile 中关联的 user_id 不匹配”,则拒绝。我已经尝试在这么多不同的组合和排列中做到这一点,如果使用与 UserProfile 相关的 id 字段,我只会得到 cancan 拒绝。

使用下面的代码,我可以访问

http://localhost:3000/users/8/profile and http://localhost:3000/users/6/profile 

因此用户有权查看任何用户的“使用 UserProfile 的 show 方法”。因此结果可以正确获取,但 cancan 不会根据当前 User.id 限制权限

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :registered
      can :show, UserProfile, :user_id => user.id 
    end
  end
end

class UserProfile < ActiveRecord::Base
  attr_accessible :DOB, :user_id, :address_city, :address_country, :address_state, :address_street, :address_zip, :avatar, :first_name, :gender, :last_name, :position, :time_zone, :years_played
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :user_profile, :dependent => :destroy
end

路由文件

get    '/users/:user_id/profile/'  =>   "user_profiles#show", :as => :user_profile

用户配置文件控制器

class UserProfilesController < ApplicationController

 load_and_authorize_resource
 def show

    #@user = User.accessible_by(current_ability) 
    #@user = User.find(params[:user_id])
    #@profile = @user.user_profile


    @profile = UserProfile.where(:user_id => params[:user_id]).first

    respond_to do |format|
      format.html # show.html.erb
      format.json { render :json => @profile }
    end
  end
end
4

0 回答 0