0

我正在使用带有设计的导轨进行用户身份验证。我能够创建新的用户帐户并能够登录。但是,一旦我使用帐户登录,我也可以通过更改用户 url 登录到其他帐户。

例如:假设我以用户 1 的身份成功登录,然后我被重定向到http://www.example.com/users/1。现在,如果我将 url 更改为http://www.example.com/users/2,那么我可以查看用户 2 的帐户详细信息等等。如何禁止已登录的用户访问其他帐户详细信息?

使用 rails 3.2.13 并设计 2.2.3。

4

3 回答 3

0

假设您有类似 profiles_controller 的东西,它索引用户配置文件中的信息,您可以执行以下操作:

class ProfilesController < ApplicationController
before_filter :authenticate_user! # Provided by Devise
before_filter :find_user      
before_filter :ensure_proper_user

def index
....stuff
end

private
def find_user
   @user = User.find_by_profile_name(params[:profile_name])
end

def ensure_proper_user
  if current_user != @user
    flash[:error] = "You do not have premission to do that."
    redirect_to root_path
  end
end
于 2013-07-20T17:30:41.920 回答
0

Devise 通常不自己处理授权,只处理身份验证。也就是说,它可能要求某些用户登录才能访问资源,但不检查资源是否属于该特定用户(这是故意的 - 哪些用户可以访问哪些资源很复杂,并且取决于您的应用程序。这是身份验证工具范围之外的问题)。

您需要实现某种授权系统——为此我强烈推荐CanCan gem——它可以轻松地与 Devise 集成,并且很容易配置为您的应用程序需要的任何授权逻辑。CanCan 上有一个不错的RailsCast(不足为奇,因为 RailsCast 和 CanCan 都是由同一个人开发的)。

于 2013-04-28T18:25:26.273 回答
0

设计只处理身份验证,而不是授权。它确保存在 current_user,但不确保该用户是否应该查看特定资源。

像 CanCan 这样的东西将是一个很好的全方位授权解决方案。您可以在Ruby 工具箱中找到更多信息。

但是对于一些快速而肮脏的事情,你可以在你的 users_controller 中做这样的事情:

before_filter :get_user, :user_views_only_own_records

def get_user
  @user = User.find_by_id(params[:id])
  head :404 if @user.nil?
end

def user_views_only_own_records
  if @user.id != current_user.id
    head :403 # or whatever you want to do when someone tries to peek at another user
  end
end

但是在某些时候,您会希望允许管理员查看任何用户或其他类似情况,并且一旦您开始为不同角色定义不同的访问级别,您将需要 CanCan 或类似的东西来使其更容易。

于 2013-04-28T18:37:46.000 回答