Ruby on rails 使用cancan和Desive授权rails中未登录的用户行为

Ruby on rails 使用cancan和Desive授权rails中未登录的用户行为,ruby-on-rails,authentication,devise,authorization,cancan,Ruby On Rails,Authentication,Devise,Authorization,Cancan,我希望登录用户可以看到所有帖子,而未登录用户只能访问隐藏字段为false的帖子。 所以我在cancan的能力模型中这样写: Post: hidden: boolean 但在模型中不允许访问已登录的助手用户。 如本问题所述:。虽然我们可以使用一些技巧来访问帮助程序,但这样做是不合适的 那么,如何正确授权未登录的用户?或者只使用Include来使用这个助手 或者我应该把它放在认证部分?但是怎么做呢?您需要做的就是: if user_signed_in? can :read, Post el

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

Post: hidden: boolean
但在模型中不允许访问已登录的助手用户。 如本问题所述:。虽然我们可以使用一些技巧来访问帮助程序,但这样做是不合适的

那么,如何正确授权未登录的用户?或者只使用Include来使用这个助手


或者我应该把它放在认证部分?但是怎么做呢?

您需要做的就是:

if user_signed_in?
    can :read, Post
else 
    can :read, Post, :hidden => false
end
使用designe时,current_user helper方法在登录时返回当前用户,但在未登录时返回nil。它在控制器和视图中可用。默认情况下,CanCan根据当前用户方法的返回进行所有授权检查

现在什么时候可以?方法,则当前用户的返回将作为局部变量用户传递给新的Capability实例

要检查用户是否已登录,我选择使用user.exists?。它是ActiveRecord::Base的类方法,将检查该用户对象是否在数据库中持久化。不过,任何其他方法都同样有效。例如,这将同样有效或更好:

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


半相关提示,查看处理gem之类的角色。当与CanCan一起使用时,它非常棒。

您需要做的就是:

if user_signed_in?
    can :read, Post
else 
    can :read, Post, :hidden => false
end
使用designe时,current_user helper方法在登录时返回当前用户,但在未登录时返回nil。它在控制器和视图中可用。默认情况下,CanCan根据当前用户方法的返回进行所有授权检查

现在什么时候可以?方法,则当前用户的返回将作为局部变量用户传递给新的Capability实例

要检查用户是否已登录,我选择使用user.exists?。它是ActiveRecord::Base的类方法,将检查该用户对象是否在数据库中持久化。不过,任何其他方法都同样有效。例如,这将同样有效或更好:

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


半相关提示,查看处理gem之类的角色。当与CanCan一起使用时,它非常棒。

因此,我必须删除行:user | |=user.new guest user未登录CanCan?这总是由defaultWell编写的……我认为前一个答案可能更有效?!user | |=user.new,我觉得这只意味着CanCan将处理没有角色的用户和没有同时登录的用户。例如,我们可以像其他can:read、:all一样放置最后一行,这样所有人都可以阅读,无论他们是否登录。所有条件之外的任何can方法的功能,如can:read、Post、:hidden=>false,在我的示例中,将对所有访问者可用。else can:read,:all并没有那么好,因为它只适用于不满足任何其他条件的用户,而不是适用于所有用户。看到区别了吗?我最后的评论措辞不好,我的意思是你提出了一个很好的观点。user | |=user.new实际上是非常必要的。例如,从我的回答来看,我判断用户是否登录的第二种方法会为未登录的用户抛出一个NilClass::NoMethod错误,但不会将其输出。谢谢!问题解决了所以,我必须删除行:user | |=user.new guest user未登录cancan?这总是由defaultWell编写的…我认为前一个答案可能会更好?!user | |=user.new,我觉得这只意味着CanCan将处理没有角色的用户和没有同时登录的用户。例如,我们可以像其他can:read、:all一样放置最后一行,这样所有人都可以阅读,无论他们是否登录。所有条件之外的任何can方法的功能,如can:read、Post、:hidden=>false,在我的示例中,将对所有访问者可用。else can:read,:all并没有那么好,因为它只适用于不满足任何其他条件的用户,而不是适用于所有用户。看到区别了吗?我最后的评论措辞不好,我的意思是你提出了一个很好的观点。user | |=user.new实际上是非常必要的。例如,从我的回答来看,我判断用户是否登录的第二种方法将对非日志抛出NilClass::NoMethod错误
d-in用户不需要它。谢谢!问题解决