设计和Rails:如何保护登录URL

时间:2016-01-20 19:34:32

标签: ruby-on-rails authentication devise

我正试图找出一种使用Devise保护登录网址的方法。我想更改users / sign_in的默认路由。我不希望有人偶然发现该网址并获取对该应用的访问权限。

在routes.rb文件中更改以下内容应该为我提供我正在寻找的解决方案。但是,我不确定这是否是最佳路径。

devise_scope :user do
  get "/login" => "devise/sessions#new"
end

as :user do
  get "/login" => "devise/sessions#new"
end

使用以下内容可能更容易

devise_for :users, :path => '', :path_names => {:sign_in => 'login', :sign_out => 'logout'} 

"但我还没有把它付诸实践"

我使用简单的设备安装,没有专家或任何其他类型的授权。另一个想法是实现一个角色并将当前用户添加到该角色。因此,默认情况下阻止对应用程序的访问。但这需要我在注册时将每个新的合法用户添加到该角色。不是真的想这样做。

3 个答案:

答案 0 :(得分:3)

如果会话未经过身份验证,则向控制器添加before_filter :authenticate_user!会强制任何人完成登录过程。这就是使用Devise和/或任何其他类型的宝石的全部目的。

答案 1 :(得分:2)

一切由您决定,您列出的方式是正确的,请参阅devise-wiki : How-To:-Change-the-default-sign_in-and-sign_out-routes

如果您希望用户对大多数应用程序进行身份验证,请使用

#application controller

before_action :authenticate_user!

#然后你可以在其他控制器中跳过这个before_action过滤器,就像这样

skip_before_action :require_login, only: [:new, :create]

这两件事情不要混淆。

  1. 验证
  2.   

    Devise是基于Warden的Rails灵活的身份验证解决方案

    1. 授权
    2.   

      Pundit提供了一组帮助您利用常规帮助的帮助   Ruby类和面向对象的设计模式构建简单,   强大且可扩展的授权系统。

      Devise会在user authentication帮助您,如果您想根据某些条件authorization用户,那么您应该使用Pundit

答案 2 :(得分:2)

我会在这里质疑你的逻辑 - 使用不同的网址只是security by obscurity。即使您的用户使用/gobeligook登录,任何专门的攻击者都可以通过嗅探流量来解决这个问题。

但是您可能希望change the path for various reasons - 但不要愚弄自己,这样做会增加任何真正的安全利益。

此外,您需要将身份验证的问题分开 - 这是Devise所做的和授权。身份验证正在验证用户是否是他/她声称的用户。授权是谁做的事情。

如果您想将您的网站锁定到经过审核的授权问题用户,并且有几种方法可以根据您的要求进行解决:

禁用注册

执行此操作的最基本方法是to disable signups,并且只允许管理员创建用户。它相对安全,但对于管理员来说非常繁琐,而且相当严苛。在这种情况下,除非用户通过身份验证,否则您的身份验证只会锁定除登录之外的所有内容。

那是before_action :authenticate_user!进来的地方。

仅限邀请

您可以使用类似DeviseInvitable模块的内容通过电子邮件邀请用户,然后覆盖注册方法以要求提供邀请令牌。

围墙花园方法

您可能想要的是用户能够注册 - 但他们实际上只有在被管理员或同行审查后才能访问任何内容。

这是如何设置这样的基本草图:

class Approval
  belongs_to :user, 
  belongs_to :vetting_user
end

class User
  # ...
  has_many :approvals, dependent: :destroy
  has_many :granted_approvals, 
    class_name: 'Approval', 
    source: :vetting_user, 
    dependent: :destroy

  def approved?
    approvals.any?
  end
end

class ApplicationController
  before_action :authenticate_user!
  before_action :authorize_user!, unless: :devise_controller?
  def authorize_user!
    redirect_to user_signup_path, unless current_user.approved?
  end
end

对于breivity,这不包括控制器等同事或管理员审查用户的东西 - 但这就是简单的部分。

虽然我会认真考虑使用像Pundit这样的专用验证库,而不是自己编写。