我试图阻止用户访问不属于他/她的个人资料。我的 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