2015-11-19 69 views
0

我正在使用Dana Mulder的教程编写一个简单的消息应用程序https://medium.com/@danamulder/tutorial-create-a-simple-messaging-system-on-rails-d9b94b0fbca1#.xjhgikji4 但是,在能够获得工作系统后,我意识到任何用户都可以通过浏览网址来查看其他用户消息。如何解决Rails授权不足的问题?

例如,用户可以迭代此URL中的号码http://localhost:3000/conversations/3/messages并查看所有其他消息不在其中的地方。我试图添加一些保护,但没有运气。有人会知道如何解决这个应用程序的授权不足问题吗?谢谢!。

这里是我的conversations_controller.rb

class ConversationsController < ApplicationController 
    before_action :confirm_logged_in 
    layout 'authenticated' 

    def index 
    @users = User.all 
    @conversations = Conversation.all 
    end 

    def create 
    if Conversation.between(params[:sender_id],params[:recipient_id]).present? 
     @conversation = Conversation.between(params[:sender_id], params[:recipient_id]).first 
    else 
     @conversation = Conversation.create!(conversation_params) 
    end 
    redirect_to conversation_messages_path(@conversation) 
    end 

    private 
    def conversation_params 
    params.permit(:sender_id, :recipient_id) 
    end 
end 

这里是messages_controller.rb

class MessagesController < ApplicationController 

    layout 'authenticated' 
    before_action do 
    @conversation = Conversation.find(params[:conversation_id]) 
    end 

    def index 
    @messages = @conversation.messages 
    if @messages.length > 10 
     @over_ten = true 
     @messages = @messages[-10..-1] 
    end 
    if params[:m] 
     @over_ten = false 
     @messages = @conversation.messages 
    end 
    if @messages.last 
     if @messages.last.user_id != current_user.id 
     @messages.last.read = true; 
     end 
    end 

    @message = @conversation.messages.new 
    end 

    def new 
    @message = @conversation.messages.new 
    end 

    def create 
    @message = @conversation.messages.new(message_params) 
    if @message.save 
     redirect_to conversation_messages_path(@conversation) 
    end 
    end 

    private 
    def message_params 
    params.require(:message).permit(:body, :user_id) 
    end 
end 

回答

1

我认为在你的模型设计,用户有多少转化current_user的对象代表当前登录用户。您可以限制通过此查询属于他的交谈中得知,他可以查看到只有对话:

@conversation = Conversation.where("(sender_id = ? OR recipient_id =?) AND id = ?", current_user.id, current_user.id, params[:conversation_id]).first 

,而不是,这将让他走进PARAM conversation_id任何Conversation

+0

Thanks @Long Nguyen,是的,我正在使用current_user。我试图通过添加代码并删除现有代码来更改消息控制器,但我收到以下错误消息:未定义的方法消息为# Zero

+1

@零更新。请再试一次。由于'where'返回ActiveRecord关系而不是对象(一个发现记录的数组),在这个查询中,我们知道它最多只会返回一条记录,因此我们将调用'.first'来获取唯一的记录。 –

+0

非常感谢!这是完美的。 – Zero