2011-01-06 63 views
2

我刚刚开始Rails 3.我已经在名为“Logs”的表上使用来自Rails 3的脚手架生成了以下代码。限制url操作返回其他用户记录

下面的'index'函数仅提供与current_user.id(来自存储在会话表中的会话)关联的记录。用户记录仅呈现以下的路径登录的用户= 3(见下面的索引码)

本地主机:3000 /原木

问题:作为用户,我可以查看记录这不是通过手动编辑链接以显示任何其他记录我的记录(即用户= 3):

本地主机:5分之3000

“这是由user.id = 2输入” /日志

寻求解决方案:如何防止手动黑客入侵以防止用户查看其他用户记录?

类LogsController < ApplicationController的

的before_filter:login_required

def index 
    @logs = Log.where(:user_id => current_user) 
    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @logs } 
end 

请忽略新的功能是从下面的创建功能缺失。下面的代码是仅仅将演示如何把USER_ID进入“日志”表

def create 
@log = Log.new(params[:log]) 
@log.user_id = current_user.id 
    respond_to do |format| 
    if @log.save 
    format.html { redirect_to(@log)} 
    format.xml { render :xml => @log, :status => :created, :location => @log } 
    else 
    format.html { render :action => "new" } 
    format.xml { render :xml => @log.errors, :status => :unprocessable_entity } 
    end 
end 

回答

4

最简单的解决办法是在表演方法来检查日志,显示真正属于登录用户:

def show 
    @log = Log.find(params[:id]) 
    unless @log.user_id == current_user.id 
    flash[:error] = "unauthorized" 
    redirect_to :index 
    end 
end 

但你很快就会有一些要限制访问更多的东西,所以你应该寻找一个身份验证插件,它允许以声明的方式来定义访问权限。也许这一个:https://github.com/be9/acl9

+0

非常感谢ACL的建议。认证与授权明显不同。仍然处于我的初级阶段,Rails和所有我似乎都在阅读Ruby语法和Rails语法之间模糊的东西。我测试了你的代码,它通过阻止url操作起作用。在操作url时,它只显示用户记录。但是,我注意到闪存错误永远不会发生。 – fresh 2011-01-06 13:04:44