首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何定制设计,以便在会话中存储用户角色信息?

如何定制设计,以便在会话中存储用户角色信息?
EN

Stack Overflow用户
提问于 2017-07-15 02:05:26
回答 1查看 587关注 0票数 1

目前,我们正在为用户和角色使用两个单独的表。

我使用专家进行授权,并设计用于身份验证的

在许多地方,我使用current_user.roles来获取用户的角色。主要是内部专家政策文件。

我想在用户登录时将用户角色存储在会话中。这样,我就不会每次查询db来获取角色。

任何快速的解决方案都会受到极大的赞赏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-15 11:11:10

由于专家没有任何选项可以传递session或其他参数,除了current_user和检查entity之外,您可以使用Rails.cache

代码语言:javascript
运行
复制
# 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

代码语言:javascript
运行
复制
# 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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45113760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档