限制用户仅使用Devise访问其配置文件

时间:2012-06-24 09:55:27

标签: ruby-on-rails-3 authentication devise authorization

我目前已经设置了我的应用,以便在成功登录后,用户会将用户重定向到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)

3 个答案:

答案 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)

总的来说,我认为有两种方法可以解决这类问题:

  1. 滚动您自己的代码并在您的控制器中(或可能在您的模型类中)执行检查,
  2. 使用为您强制执行规则的gem。
  3. 如果您想要自己角色,最简单的方法就是简单地在您的控制器中放置支票,确保在他们试图查看不属于他们的配置文件时将其重定向。使用前置过滤器执行此操作的一种方法是,尽管您希望根据对您的应用有意义的行为进行调整。

      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是一个包含当前登录用户的帮助程序。