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