使用 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 中未登录的用户行为 的相关文章

  • postgres 数组字段上的 ActiveAdmin 过滤器

    我在 ActiveAdmin 中添加了以下过滤器 filter roles as select collection Model ROLES multiple true 但是当我选择过滤器值来搜索角色时 它给了我以下错误 PG Invali
  • 更快地将数据库从一个heroku应用程序传输到另一个应用程序

    有没有更快的方法将我的生产数据库传输到测试应用程序 目前我正在做一个heroku db pull然后到我的本地机器heroku db push app testapp但这变得越来越耗时 我有一些种子数据 但它并不像简单地使用我的真实数据进行
  • 如何通过Grape API获取路由

    我使用 gem grape 作为 api 我尝试通过命令获取 api urlrake grape routes namespace grape do desc routes task routes gt environment do API
  • Rails 5 - 在 gem 上充当 Taggable - 简单表单集合选择已定义的标签列表

    我正在尝试学习如何将 Acts as Taggable On gem 与 Rails 5 一起使用 我使用简单的表格作为表格 我认为部分问题是由于提案和 randd fields 之间的模型没有关联而产生的 我有名为 Proposal 和
  • 为 Ruby On Rails 环境创建 Docker 映像时出错(从 Dockerfile)

    估计是环境问题 当我手动执行此操作 没有 Dockerfile 时 它可以工作 这是我的 Dockerfile FROM ubuntu 14 04 RUN apt get update RUN apt get upgrade assume
  • Rails/heroku 从 gem 迁移到 toolbelt

    我曾经在一个项目中使用过 heroku gem 既然工具带已经出来了 我想换一个 我从 Gemfile 中删除了 gem 并通过 gem uninstall heroku 卸载了它 我使用heroku网站上的pkg安装了heroku工具带
  • powershell:使用参数启动程序的脚本?

    当我运行下面的 Powershell 脚本时 我收到以下错误 如何通过 powershell 带参数运行程序 该脚本将是组策略登录 Invoke Expression 找不到位置参数 接受参数 TBHSERVER NETLOGON BGIn
  • 动态分配背景图片scss/sass

    我想要做的是有一个表单 您可以在其中上传图片 然后当您查看该对象时 图片会在特定 div 中居中 垂直和水平向上倾斜 其大小未知等 除非有办法使用 image tag 帮助器将其垂直居中 否则我希望能够使用该图像作为背景图像 在我的 css
  • 从 swagger UI 将 Jwt 令牌作为不记名令牌传递到标头中不起作用

    我正在生成 jwt 令牌 Web api 核心应用程序 在应用程序中 我使用 swagger 并应用了不记名令牌身份验证 但是当我尝试从 swagger UI 传递不记名令牌时 我收到 401 错误 请有人帮助我解决这个问题 service
  • OpenID 和 OAuth 之间有什么区别?

    我真的想了解 OpenID 和 OAuth 之间的区别 也许它们是两个完全不同的东西 OpenID http openid net 是关于身份验证 即证明您是谁 OAuth http oauth net 是关于授权的 即授予对功能 数据 等
  • 使用 OWIN 自托管 WebApi 进行声明身份验证

    我使用以下配置自托管 WebApi Visual Studio 2012 NET 4 0 public void Configuration IAppBuilder appBuilder var config new HttpConfigu
  • Rails API 设计无需禁用 CSRF 保护

    早在 2011 年 2 月 Rails 就改为需要 CSRF 令牌all non GET http weblog rubyonrails org 2011 2 8 csrf protection bypass in ruby on rail
  • 建立了无需 SSL 即可进行安全注册和身份验证的 javascript 解决方案

    有没有无需 SSL 即可实现安全用户注册和身份验证的解决方案 安全 我的意思是免受被动窃听 不是来自中间人 http en wikipedia org wiki Man in the middle attack 我知道只有带有签名证书的 S
  • 默认更新嵌套属性

    我尝试更新 iProduction 这是生产中的嵌套表单 但此行出现参数错误 参数数量错误 0 代表 1 生产 update iproducts attributes cow id cow 我的创作动作制作 def create produ
  • docker登录 - 存储凭据时出错 - 写入权限错误

    我正在运行一个docker login命令作为 Bamboo 构建作业的一部分 命令文本通过以下方式获得aws ecr get login调用并在子 shell 中执行 该命令失败并显示Error saving credentials er
  • 我如何通过 Spring Security 创建 oauth 2 用户名密码流

    我正在尝试在 Spring Security 上实现 oauth2 用户名密码流程 但我找不到任何文档和示例代码 我正在检查 Sparklr 和 tonr insode oauth2 样本 我怎样才能实现它 oauth2 2 条腿 我如何禁
  • Rails - 使用 %W

    我有以下效果很好的 def steps w hello billing confirmation end steps first 但我想这样做 def step title w Upload a photo Billing Info Con
  • Flash观看后不清晰

    这是我的创建动作 它创建一个新的 Message 实例 并通过模型验证进行检查 然后有一个简单的 if else 循环 如果模型验证已完成 则发送消息 如果要发送另一个视图 则渲染 新 视图 如果模型验证未得到满足 它只会再次呈现 新 视图
  • Rails validates_与模型的错误消息相关

    我在模型中使用 validates linked 来使用其他模型的验证代码 问题是验证失败的消息是 is invalid 我想将模型验证失败的实际描述错误冒泡到顶部 我发现这个问题 验证与模型的错误消息关联 https stackoverf
  • 在 Rails 中,我可以通过委托方法订购查询吗?

    我在通过委托方法订购查询时遇到困难 我的任务是帮助将一个相当大的 Rails 3 应用程序升级到 Rails 4 我在索引操作中遇到了这个查询 我知道这些对象的命名是可怕且令人困惑的 measurements controller rb d

随机推荐

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

    我正在做多个 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