我目前已经设置了我的应用,以便在成功登录后,用户会将用户重定向到localhost:3000/users/id
的个人资料,但如果我是第一个用户id => 1
并输入users/2
我有完全访问此个人资料。我一直试图找到如何使用设计来阻止它。我对rails非常陌生,所以我确定我错过了一些简单的东西,我使用了before_filter :authenticate_user!
,但这显然只是检查用户是否已登录,但不限制对其他用户的访问'个人资料。我已经阅读了CanCan的一些内容,但这对我想要达到的目标来说似乎有些过分。任何指针都非常赞赏。
users_controller.rb
class UsersController < ApplicationController
before_filter :authenticate_user!
before_filter :user_authorization
def index
@users = User.all
end
def show
@user = User.find(current_user[:id])
end
private
def user_authorization
redirect_to(root_url) unless current_user.id == params[:id]
end
end
这是从服务器报告的:
Started GET "/users/2" for 127.0.0.1 at 2012-06-24 13:00:38 +0200
Processing by UsersController#show as HTML
Parameters: {"id"=>"2"}
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
Redirected to http://localhost:3000/
Filter chain halted as :user_authorization rendered or redirected
Completed 302 Found in 20ms (ActiveRecord: 0.8ms)
答案 0 :(得分:3)
在您的控制器中:
class UsersController < ApplicationController
before_filter :validate_user, :only => :show
def show
@user = User.find(params[:id]
end
def validate_user
redirect_to courses_path unless current_user.id.to_s == params[:id]
end
end
注意current_user.id.to_s
,因为current_user.id是一个整数,而params [:id]是一个字符串。
答案 1 :(得分:2)
总的来说,我认为有两种方法可以解决这类问题:
如果您想要自己角色,最简单的方法就是简单地在您的控制器中放置支票,确保在他们试图查看不属于他们的配置文件时将其重定向。使用前置过滤器执行此操作的一种方法是,尽管您希望根据对您的应用有意义的行为进行调整。
before_filter :validate_user
def validate_user
redirect_to home_path unless current_user and current_user.id == params[:id]
end
如果你想使用宝石,那么我会推荐你提到的cancan或者另一种名为Acts as Tenant的宝石。我已经看到它用于类似的事情。但如果您只想锁定用户配置文件,则向控制器添加代码可能正常。
答案 2 :(得分:1)
瞧瞧:
before_filter :user_authorization
private
def user_authorization
redirect_to(root_url) unless current_user.id == params[:id]
end
current_user是一个包含当前登录用户的帮助程序。