2014-08-29 3 views
0

У меня есть несколько файлов на веб-сервере, на которые я хочу ограничить доступ. например www.example.com/privatefiles/secret.txtКак ограничить доступ к URL-адресам файлов

я попытался это:

routes.rb:

get '/privatefiles/:file.:ext' => 'file_handler#authenticate' 
#....... 

file_handler_controller.rb:

class FileHandlerController < ApplicationController 
    def authenticate 
     if(session[:user_id] == ADMIN) 
      sendfile 
     else 
      redirect_to '/NO' 
     end 
    end 
end 

я найти это ведет себя правильно, когда я вставляю URL-адрес файла, который не имеет, но когда существует файл, маршрут игнорируется d и браузер будет просто идти прямо в файл, и никогда не достигает даже контроллер

+1

В чтобы ограничить доступ к файлам, я обычно предпочитаю размещать их вне моего веб-корня и получать доступ к нему через специальный обработчик, в котором вы также можете выполнять другие проверки, а не только обычную аутентификацию пользователя (например: log загрузка, ограничение количества доступа, ...) –

ответ

0

Попробуйте сделать это

в маршрутах:

get '/privatefiles/:file.:ext' => 'file_handler#fetch_file' 

в контроллере:

class FileHandlerController < ApplicationController 

    before_filter :authenticate 

    def fetch_file 
    # send/ show file code here 
    sendfile 
    end 

    private 

    def authenticate 
    unless (session[:user_id] == ADMIN) 
     redirect_to root_path, :notice => 'Doing something nasty, huh?' 
    end 
    end 
end 
+0

все еще обходит контроллер. Возможная ошибка в рельсах? – runub

+0

Нет, проблема здесь: '(session [: user_id] == ADMIN)' как вы проверяете это условие? – Surya

Смежные вопросы