Как выполнить проверку подлинности безопасности на сервере Rails

#ruby-on-rails #authentication #webserver

#ruby-on-rails #аутентификация #веб-сервер

Вопрос:

Я хотел бы использовать веб-сервер, основанный на Rails. Но я понятия не имею о том, как проверить идентификацию пользователя.

Например, пользователь с именем Guest мог выполнять только такие действия, как GET и UPDATE, для определенных таблиц, в то время как другой пользователь с именем Admin мог выполнять все возможные действия, такие как POST .

Я новичок в этой области, но я слышал, что некоторые технические средства, такие как внедрение SQL, могут угрожать безопасности веб-сервера.

Итак, не могли бы вы рассказать мне, как проверить аутентификацию и как зашифровать пароль, введенный пользователем?

Комментарии:

1. вы могли бы попробовать драгоценные камни ACL, такие как devise и declarative_authentication

2. Devise на самом деле не является ACL, это обычная аутентификация.

Ответ №1:

Кажется, вам нужны аутентификация и авторизация.

Для проверки подлинности:
https://github.com/plataformatec/devise
https://github.com/vpereira/authlogic
https://github.com/thoughtbot/clearance

Для авторизации:
https://github.com/be9/acl9
https://github.com/ryanb/cancan

Ответ №2:

Это, строго говоря, из моего личного опыта. Я перепробовал все предлагаемые способы аутентификации и авторизации, упомянутые выше, но я всегда приходил к выводу, что просто написать это самостоятельно не более и не менее сложно, особенно когда ваши требования очень просты. Рассмотрим это:

 class ApplicationController < ActionController::Base
  before_filter :authentication

  def authentication
    redirect_to '/authentication_form' unless session[:logged_in]
  end

  def authentication_form
    ... render the form
  end

  def login
    if params[:username] == 'adam' amp;amp; params[:password] == 'eva'
      session[:logged_in] = true
      redirect_to '/restricted_area'
    else
      render :action => 'authentication_form'
    end
  end
end

class RestrictedController < ApplicationController
  def index
    ... this action is now restricted
  end
end
  

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

 if User.find_by_name_and_password(params[:username], params[:password])
  session[:logged_in] = true
...
  

Для авторизации вам нужно будет сохранить идентификатор пользователя в хэше сеанса, который позволяет вам ограничивать доступ изнутри каждого действия (при условии, что контроллер является производным от ApplicationController)

Я надеюсь, это поможет.

Комментарии:

1. Привет, mosch, иметь подобный код довольно просто. Но мне интересно, безопасно ли это, нужна ли нам еще какая-то дополнительная работа при проверке учетных данных? Я думаю, мне лучше проверить стандартную.

2. Я бы посоветовал не хранить обычный пароль в базе данных. Например, Digest::SHA1.hexdigest(password) выполняет эту работу отлично. Кроме того, я не рекомендую использовать стандартные решения для аутентификации. Я полагаю, это сильно зависит от вашего сценария. Если вы решите использовать gem для аутентификации, вам следует взглянуть на devise, который даже предоставляет действия и представления.