Rails 5: кэшируйте информацию о роли пользователя при входе в систему и удаляйте ее при выходе из системы

#ruby-on-rails #ruby #caching

#ruby-on-rails #ruby #кэширование

Вопрос:

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

В моих моделях / role.rb у меня есть это:

 class Role < ApplicationRecord
  belongs_to :user, optional: true
  accepts_nested_attributes_for :user

class << self
    def all_cached
    Rails.cache.fetch("roles") { Role.where(user_id: current_user) }
    end
end

private

def flush_cache
    Rails.cache.delete('roles')
end
  

В моих контроллерах / roles_controller.rb у меня есть это:

 def roles
  @roles = Role.all_cached
end
  

В моих контроллерах / sessions_controller.br У меня есть это:

 class SessionsController < ApplicationController
 def new
  render :layout => "empty"
 end

 def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user amp;amp; user.authenticate(params[:session][:password])
    log_in user
    params[:session][:remember_me] == '1' ? remember(user) : forget(user)
    redirect_back_or user
  else
    flash.now[:error] = 'Invalid email/password combination!'
    render 'new', :layout => "empty"
  end
 end

 def destroy
  log_out if logged_in?
    redirect_to login_path
  end
end
  

Как мне установить, что роль current_user кэшируется при входе в систему и удаляется при выходе из системы?Я хочу кэшировать ее один раз за весь сеанс пользователя, чтобы в любое время получить информацию для проверки ролей и разрешений пользователей. Я не хочу хранить эту информацию в сеансе, так как в ней довольно много информации не уверен, безопасно ли это.

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

1. Я не уверен, имеет ли это смысл. Что произойдет, если одновременно подключено несколько пользователей?

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

3. Интересно, почему вы хотите кэшировать роль пользователя. Текущий пользователь в любом случае загружается из базы данных при каждом запросе, и я предполагаю, что чтение этого простого запроса из кэша (например, memcached или redis) не должно быть намного быстрее, чем чтение роли из базы данных напрямую, когда это необходимо.

4. @spickermann Я подумал, что если роль кэшируется, для проверки роли потребуется меньше запросов во всем приложении. Вероятно, я слишком много думаю 🙂 У меня есть рабочее решение, которое проверяет роль пользователя для каждого раздела приложения. Как вы думаете, я должен выполнять политики с помощью Pundit и все?

5. Является ли этот запрос серьезным узким местом в производительности вашего приложения? Если это так, вам нужно выяснить, почему. Если нет, не пытайтесь оптимизировать этот простой запрос. Преждевременная оптимизация — корень всего зла (Дональд Кнут)