我正在使用rails with devise进行用户身份验证。我能够创建新的用户帐户并能够登录。但是,一旦我使用帐户登录,我只需更改用户URL即可登录其他帐户。
例如:Supose我成功登录用户1,然后我被重定向到http://www.example.com/users/1。现在,如果我将网址更改为http://www.example.com/users/2,那么我可以查看用户2的帐户详细信息,依此类推。如何禁止登录用户访问其他帐户详细信息?
使用rails 3.2.13并设计2.2.3。
答案 0 :(得分:0)
Devise通常不会自己处理授权,只进行身份验证。也就是说,它可能要求某些用户登录才能访问资源,但不会检查资源是否属于特定用户(这是故意的 - 这是用户很复杂并且取决于您的应用程序可以访问资源。这是一个超出身份验证工具范围的问题)。
您需要实现某种授权系统 - 我强烈推荐CanCan gem用于此目的 - 它可以轻松地与Devise集成,并且可以轻松配置应用程序所需的任何授权逻辑。有一个不错的RailsCast on CanCan(不足为奇,因为RailsCasts和CanCan都是同一个人)。
答案 1 :(得分:0)
Devise只处理身份验证,而不是授权。它确保有一个current_user,但不确定该用户是否应查看特定资源。
像CanCan这样的东西将是一个很好的全方位授权解决方案。您可以在Ruby Toolbox找到更多信息。
但是对于快速而又脏的东西,你可以在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或类似的东西,使其更容易。
答案 2 :(得分:0)
假设您有类似profile_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