目前,我们正在为用户和角色使用两个单独的表。
我使用专家进行授权,并设计用于身份验证的。
在许多地方,我使用current_user.roles
来获取用户的角色。主要是内部专家政策文件。
我想在用户登录时将用户角色存储在会话中。这样,我就不会每次查询db来获取角色。
任何快速的解决方案都会受到极大的赞赏。
发布于 2017-07-15 11:11:10
由于专家没有任何选项可以传递session
或其他参数,除了current_user
和检查entity
之外,您可以使用Rails.cache
:
# app/models/user.rb
class User < ActiveRecord::Base
# ...
def cached_roles
Rails.cache.fetch "user.#{self.id}.roles" do
roles.pluck(:name)
end
end
def clear_cached_roles
Rails.cache.delete "user.#{self.id}.roles"
end
end
# app/policies/post_policy.rb
class PostPolicy < ApplicationPolicy
# ...
def admin?
user.cached_roles.include? 'admin'
end
def reader?
user.cached_roles.include? 'reader'
end
end
要使Devise缓存当前角色,需要覆盖Devise的session_controller
# app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
def create
super
current_user.cached_roles
end
def destroy
current_user.clear_cached_roles
super
end
end
我创建了这个演示rails应用程序,您可以使用它:查看Rails.cache
在解决方案分支或拉请求中的解决方案变体。
有关更多细节,请参见这些文件:
app/controllers/users/sessions_controller.rb
spec/controllers/posts_controller_spec.rb
app/policies/post_policy.rb
app/models/user.rb
README.md
https://stackoverflow.com/questions/45113760
复制相似问题