2

我目前已经设置了我的应用程序,以便在成功登录应用程序时将用户重定向到他们的个人资料,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)
4

3 回答 3

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] 是一个字符串。

于 2013-11-27T04:28:46.407 回答
2

一般来说,我会说有两种方法可以解决这类问题:

  1. 滚动您自己的代码并在您的控制器(或可能在您的模型类)中实施检查,以及
  2. 使用为您强制执行规则的 gem。

如果您想自己扮演角色,最简单的方法是简单地将检查放入您的控制器中,以确保他们在尝试查看不属于他们的配置文件时被重定向。使用 before 过滤器执行此操作的一种方法是,尽管您希望将其调整为对您的应用有意义的行为。

  before_filter :validate_user
  def validate_user
    redirect_to home_path unless current_user and current_user.id == params[:id]
  end

如果您想使用 gem,那么我会推荐您提到的 cancan 或另一个名为 Acts as Tenant 的 gem。我见过它用于类似的事情。但是,如果您只想锁定用户配置文件,则向控制器添加代码可能会很好。

于 2012-06-24T10:06:16.803 回答
1

瞧:

  before_filter :user_authorization

  private

     def user_authorization
        redirect_to(root_url) unless current_user.id == params[:id]
     end

current_user 是一个包含当前登录用户的助手。

于 2012-06-24T10:08:25.580 回答