使用 cancan 和 devise 授权 Rails 中未登录的用户行为

2024-04-10

Post: hidden: boolean

我希望登录用户可以看到所有帖子,而未登录用户只能访问隐藏字段为 false 的帖子。 所以我在cancan的能力模型中这样写:

if user_signed_in?
    can :read, Post
else 
    can :read, Post, :hidden => false
end

但模型中不允许访问助手 user_signed_in 。 正如这个问题中所述:Rails 3 设计,模型中无法访问 current_user ? https://stackoverflow.com/questions/3742785/rails-3-devise-current-user-is-not-accessible-in-a-model#3742981。虽然我们可以使用一些技巧来访问帮助程序,但这样做是不合适的

那么,如何才能正确授权未登录的用户呢?或者只是使用“包含”来使用这个助手?

或者我应该把它放在身份验证部分?但如何呢?


您需要做的就是:

def initialize(user)
  user ||= User.new # guest user (not logged in)

  can :read, Post, :hidden => false

  if User.exists?(user)
    can :read, Post
  end
end

通过设计,current_userhelper 方法在登录时返回当前用户,但在未登录时返回 nil。它在控制器和视图中可用。默认情况下,CanCan 对返回的内容进行所有授权检查current_user method.

现在每当can?从视图或控制器调用方法,返回current_user将被传递到一个新实例Ability作为局部变量user.

要检查用户是否已登录,我选择使用User.exists?()。这是一个类方法ActiveRecord::Base这将检查是否user对象持久化在数据库中。任何其他方式也同样有效。例如,这会同样有效甚至更好:

if user.encrypted_password
  can :read, Post
end

这将检查默认设备密码字段是否存在user实例。如果您没有做任何太疯狂的事情,则只有在用户登录时才会返回一个值。如果第二个选项适合您的情况,它可能会更好,因为您甚至不必查询数据库。

半相关提示,查看角色处理宝石,例如Rolify https://github.com/EppO/rolify。与 CanCan 结合使用效果非常好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 cancan 和 devise 授权 Rails 中未登录的用户行为 的相关文章

  • 将 Stripe webhook 与 Rails 结合使用

    我已经按照 Ryan Bates 的 Railscast http railscasts com episodes 288 billing with stripe 成功构建了一个 Rails 应用程序 但是 在 Railscast 中他没有
  • 让网站登录也能在 WordPress 上使用

    我使用 PHP 和 MySQL 开发了一个网站 该网站已经有登录和注册表单 myweb com 我已经在这个网址添加了 wordpressmyweb com blog 我想禁用 WordPress 上的登录和注册页面并强制用户使用我的 基本
  • 使用 webpacker 部署到 heroku 后,资产不存在于资产管道中

    我正在使用 Rails 5 2 3 我可以在本地下载 pdf 但Heroku它通过错误 500 错误是 ActionView Template Error 资源 pdf css 不存在于资源管道中 这是我的 Heroku 日志 2019 0
  • Rails 3.2.6 中的延迟加载

    我在网上找到了一些资源 而不是在做类似的事情时 cars Car where colour gt black 查询不会执行 直到您执行以下操作 cars each c puts c name 但是 在我的 Rails 3 2 6 项目中 当
  • Rails 加载完成后运行代码?

    我有一个定期任务需要每分钟执行一次 使用delayed job 我希望 Rails 在加载完成后立即自动将其排队 如果系统中尚不存在此类任务 对于我来说 在整个 Rails 引导流程结束时运行一些代码的好地方是什么 有人建议 config
  • 从 Restful 身份验证迁移到 Devise

    许多 Rails 2 3 应用程序正在使用 Restful Authentication 但该插件似乎与 Rails 3 存在一些问题 在升级到 Rails 3 时 我一直在使用 Devise 有什么办法可以顺利地从 Restful Aut
  • 使用 cURL 设计身份验证

    如何使用 Devise 从终端使用 cURL 验证我的 Ruby on Rails 应用程序 我想 curl user email password http domain bla api auth sign in 并正在回应 您要查找的页
  • 为 Rails 3 应用程序制作自定义插件/gem/引擎

    我正在遵循指南http edgeguides rubyonrails org plugins html http edgeguides rubyonrails org plugins html而且它似乎有点过时了 您能看一下并告诉我哪些部分
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 集成共享同一个 MySQL 数据存储的 Django 和 Rails 应用程序的最佳方式是什么?

    我将在网络上与 Python 开发人员合作 应用 我将用 Ruby 构建其中的一部分 而他正在 将使用 Django 构建它的另一部分 我不太了解 姜戈 我集成这两部分的计划是简单地映射某个 URL Python 的路径前缀 例如 以 se
  • Rails 形式的当前日期

    我正在学习 Rails 并在书外进行一些探索 并随着知识的增长创建一个具有附加功能的简单应用程序 我正在编写一个简单的博客应用程序 我在表单中添加了一个名为 日期 的字段 我不希望这是一个字段 我希望它从服务器获取日期并将其自动放入数据库中
  • 运行玩笑测试时,Firebase 在signInAnonymously() 上抛出“auth/network-request-failed”

    我正在使用 firebase 为我的应用程序 使用 create react app 构建 编写一些测试 并且我正在尝试匿名登录我的测试数据库 但认证失败 然而 所有其他 Firebase 操作 CRUD 都工作得很好 我还可以从在浏览器中
  • NoMethodError:未定义方法“needs_migration?”对于 ActiveRecord::Migrator:Class

    我收到以下错误消息 不知道如何解决它 有人可以帮忙吗 NoMethodError 未定义方法 needs migration 为了 ActiveRecord 迁移器 类 这是 config ru 代码 require config envi
  • 迁移范围的独特性

    我一直在尝试找到一种方法来实现这一目标 但我找不到任何尝试 即使如此 我想也许我的方法是完全错误的 也就是说 我应该做什么移民如果我希望两个字段的组合是唯一的 请注意 我不希望它们成为索引 而只是数据库字段 例如 对于下面的迁移 我可以单独
  • Fixture_file_upload 有 {file} 不存在错误

    下面是我的上传文件的测试代码 describe file process do before each do debugger file fixture file upload test csv text csv end it should
  • Pyramid 中基于动态用户的授权

    我正在跟进Pyramid 文档中的安全指南 http docs pylonsproject org projects pyramid 1 1 narr security html以及 wiki 教程添加授权 http docs pylons
  • 如何显示 pg-search 多重搜索结果的摘录

    我已经在 Heroku 上的 Rails 应用程序中设置了 pg search query fast PgSearch multisearch query gt
  • 修改rails ActiveAdmin gem中的BaseController

    我在 Rails 应用程序中使用 ActiveAdmin gem 如果我想添加一个适用于所有 activeadmin gem 的新的 before 过滤器 我该怎么做 我想我可以修改 ActiveAdmin 中的 BaseControlle
  • 在单选按钮选择上提交 Rails 表单

    我有以下 Rails 表单 有效 但我想删除 Submit tag 并在选择单选按钮后立即提交表单 我怎么做 p nbsp nbsp p p p 所以我找到了精确的解决方案 感谢输入人员 它帮助我重新定义了我的谷歌搜索
  • 类型错误: jasmine.getEnv().currentSpec 为 null

    当我尝试运行我的茉莉花规格时 我得到 TypeError jasmine getEnv currentSpec is null in http localhost 8888 JASMINE ROOT jasmine js line 498

随机推荐

  • 来自多个多元回归输出的汇总数据框

    我正在做多个 OLS 回归 我使用了以下 lm 函数 GroupNetReturnsStockPickers lt read csv GroupNetReturnsStockPickers csv header TRUE sep dec M
  • IIS 上的 Glimpse.axd 403ing

    当我发布到 IIS 7 5 后尝试访问 Glimpse axd 时 我现在收到 403 Forbidden 响应 IIS 中是否有设置禁止访问 axd 文件 或者这完全是另外一回事 这通常是由于 Glimpse 的 web config 部
  • FastAPI 上的事件处理程序

    我正在研究最适合我的目的的网络框架 我们将开发多个微服务 并且需要在一些微服务上调度事件 这些事件可以在其他微服务上监听 使用 FastAPI 是否有支持 如果没有 有没有办法监听数据库事件操作 我看到了 app on event shut
  • 在多个 Excel 实例之一中查找工作簿

    我在 Outlook VBA 中有一个宏 用于从打开的 Excel 工作簿 Workbook1 中获取数据 我参考工作簿如下 Dim objApp As Excel Application Set objApp GetObject Exce
  • Django 管理内联表单,具有只读旧值并允许添加新的内联值

    我正在尝试解决这个问题 但由于某种原因 到目前为止每次尝试都失败了 我有两个简单的模型 问题和答案 class Question models Model phoneID models CharField max length 255 ed
  • 在文本框中,保护第一个单词,但允许添加/编辑这些单词之后的文本

    因此 我有一个 C 文本框 使用 NET 表单 我将在其中接受用户字符串作为某些输入 该字符串的开头已经有文本 参数 无论如何 这些文本都将存在于该字符串的开头 它一定在那里 我希望他们意识到这一点 但无法从文本框中删除这些单词 所以他们不
  • 将 Autofac 与 ASP.Net Core 3.1 通用主机“Worker Service”应用程序结合使用

    在 ASP Net Core 应用程序中 可以使用以下方式轻松配置 Autofac public class Program public static void Main string args ASP NET Core 3 0 The
  • Paper.js:无法设置符号实例的 fillColor

    我是 paper js 的新手 对于这个项目 我需要一个将在许多实例中使用的形状 具有不同的填充颜色 因此显然使用符号更好 而不是使用 Path clone 方法 但是 一旦我将符号实例化为 PlacedSymbol 更改 fillColo
  • 如何使用“input()”在控制台中重复输入选项,直到用户选择退出?

    我向用户提供多个选项以供选择使用input 在Python 3中 我希望一次又一次地显示选项 直到用户选择退出选项来退出 例如 a 5 b 2 inp input Please choose from Options mentioned b
  • 每 100 秒垃圾收集一次

    有没有人遇到过这样的场景 高内存分配负载下的应用程序每 100 秒执行一次第二代收集 我们使用具有 8 16 GB 物理内存的 64 位服务器 应用程序有几 GB 的数据存储在缓存中 并且无法从中清除 因为它实际上已被应用程序使用 此外 它
  • Java 中 File.exists() 的替代方法

    我从没想过这种事会发生在我身上 但我遇到了 Java 中的第一个错误 https bugs java com bugdatabase view bug bug id 5003595 https bugs java com bugdataba
  • 如何获得自定义警报对话框,如图所示?

    i want to build a customized dialog just like the one shown in image 我创建了两个布局 一个用于自定义标题 另一个包含两个编辑文本视图和两个按钮 这里是 xml 自定义标题
  • 如何在Visual Studio中动态创建解决方案的解决方案文件夹?

    我想创建一个新的解决方案文件夹使用 PowerShell 脚本在 Visual Studio 中动态地进行操作 我知道如何在 Visual Studio 中手动为现有解决方案创建解决方案文件夹 但有没有办法可以使用 PowerShell 自
  • JavaScript html 解码

    当我在 asp net 应用程序中通过 ajax 接收 html 文本时 它看起来像 lt span 20style color green font weight bold gt 20Text 20Msg lt span gt javas
  • 准备语句将逗号分隔值传递给存储过程参数

    我无法将查询移动到存储过程中 我需要将逗号分隔的字符串传递给参数yr model no两个人IN条款 我已经阅读了一些线程并决定使用准备语句 原始查询可以很好地获取多行 但是在存储过程中 当我用call load things 128394
  • Rails 中带有回退功能的动态命名空间控制器

    我对新的 Rails 应用程序有一个有点奇怪的要求 我需要构建一个应用程序 其中所有路由都在多个命名空间中定义 让我解释一下 我想要一个应用程序 其中学校科目 数学 英语等 是命名空间 w math english each do subj
  • void 子例程返回什么?

    我刚刚对pluralsight 进行评估 并得到了以下问题 无效子程序返回什么 我的印象是无效子例程没有返回任何内容 但这不是提供的答案之一 多项选择题 Net 在后台返回值类型还是这个问题不正确 我得到的选择是 整数 布尔值 细绳 约会时
  • 任务并行库 - 如何使用 TaskContinuationOptions.OnlyOnCanceled 来触发延续?

    我正在尝试 NET 4 0 中的任务支持 特别是延续支持 我感到困惑的是我不知道如何继续TaskContinuationOptions OnlyOnCanceled标志设置为执行 如果我做一个ThrowIfCancellationReque
  • ElasticSearch 全文搜索

    我尝试在elasticsearch java api 中使用正则表达式运行全文搜索 我的过滤器是这样的 FilterBuilder qFilter FilterBuilders regexpFilter all text 但它只匹配一个单词
  • 使用 cancan 和 devise 授权 Rails 中未登录的用户行为

    Post hidden boolean 我希望登录用户可以看到所有帖子 而未登录用户只能访问隐藏字段为 false 的帖子 所以我在cancan的能力模型中这样写 if user signed in can read Post else c