Cancancan禁止设计sign_up动作

时间:2016-07-24 19:51:41

标签: ruby-on-rails devise cancancan

我正在尝试使用cancancan禁止访问非成员的注册页面。只有成员才能创建新成员。我是通过ability.rb定义的,但我不知道如何禁止sign_up操作。这是我到目前为止所尝试的:

if user.has_role? :admin
else
  can :sign_in, User
  cannot :sign_up, User
  cannot :sign_up, Registration
  cannot :create, User
  cannot :create, Registration
end

但是我仍然能够在没有登录的情况下看到注册页面。我应该以其他方式实现这一目标吗?或者我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

正如@infiniteRefactor所指出的,CanCanCan根据角色限制访问。另一方面,用户是否登录是状态问题(无论角色如何,用户都可以登录或注销)。幸运的是,你已经在使用Devise了。

您可以使用Devise中的user_signed_in?辅助方法获得所需内容。

您可以通过将以下代码添加到您要隐藏的任何视图中来隐藏您的注册视图:

<% if !(user_signed_in?) %>
    <%= redirect_to new_user_registration_path %>
<% else %>
    <!-- The rest of the view's code goes here -->
<% end %>

然后,为了防止用户未登录时的实际操作,请确保您使用的是:

before_action :authenticate_user!

在您的控制器中。

答案 1 :(得分:0)

因此,您尝试使用Devise的注册页面,并仅限制对成员的访问权限。

设计只开箱验证。它不了解cancancan能力或您可能已经介绍的任何其他用户逻辑。因此,你想要的东西不会开箱即用。

您需要公开控制器并覆盖注册控制器。你可以使用

rails generate devise:controllers users

如果您的设计用户架构为users。有关实际的命令参考,请参阅设计文档。然后您可以自定义注册控制器。

我更喜欢在这里做的是使用能力和身份验证检查作为控制器操作。

class Devise::RegistrationsController < DeviseController
    ...
    before_action :authenticate_user!
    load_and_authorize_resource

但是你可以做任何你想做的事。这是您希望限制访问的部分。您可以与rolify或应用程序的任何其他组件相关联。

这基本上就是你所要求的。但是,我建议采取这种方式。

我对我正在进行的项目有过类似的经历。我试图建立一个基于管理员的添加用户页面,并尝试使用设计注册页面作为基础并修改它们。

然而,我所经历的是,当您开始更改页面的实际动态时,自定义这些控制器和视图(尤其是控制器)变得很麻烦。您可能会发现自己越来越深入地确保整个身份验证模型运行没有任何问题。

相反,我所做的是介绍我自己的控制器。由于设计公开了身份验证模型和方法,因此很容易执行标准任务,例如添加,删除和更新用户。您的控制器将非常简单,实际上使用cancancan可能足以使用load_and_authorize_resource自动处理资源操作来编写骨架控制器(没有方法体)。

您可以使用此控制器复制设计和使用的视图。通过这种方式,您可以使用设计提供类似的前端体验。

这种方法最重要的优点是你不要扩展设计并让它作为一个组件工作。因此,任何在您的项目或设计中发生变化的事情都不会对您产生太大影响。