2013-04-28 73 views
0

我正在使用设备用于用户认证的轨。我可以创建新的用户帐户并能够登录。但是,一旦我使用帐户登录,则可以通过更改用户url来登录其他帐户。与设计轨 - 登录后能够访问其他帐户

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

使用rails 3.2.13和devise 2.2.3。

回答

0

设计通常不会自己处理授权,只有验证。也就是说,它可以要求一些用户登录才能访问资源,但不检查资源属于特定用户(这是故意的 - 哪些资源是可以访问由用户是复杂的,取决于在您的应用程序。这是一个验证工具的范围之外的问题)。

您需要实施某种授权系统 - 我强烈建议使用CanCan gem - 它可以与Devise轻松集成,并且很容易配置您的应用需要的任何授权逻辑。有一个体面的RailsCast on CanCan(不令人惊讶,因为RailsCasts和CanCan都是由同一个人)。

+0

谢谢你的澄清。我一定会考虑CanCan。 – sthustfo 2013-04-29 11:38:28

+0

如果有任何使用CanCan的实时应用程序,请让我知道吗?我想我需要了解各种角色的概念?对于例如:在我的应用程序,我应该如何创建“管理员” previliges /角色的用户,而不是“正常”角色的用户。 – sthustfo 2013-04-30 06:38:15

0

设计只处理认证,而不是授权。它确保有一个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或类似的东西使它更容易。

+0

感谢您的澄清。我接受@MrTheWalrus的回答只是因为他早于你回答。 – sthustfo 2013-04-29 11:39:46

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 
相关问题