繁体   English   中英

Devise 和 Rails:如何保护登录 URL

[英]Devise and Rails: How to secure login URL

我正在尝试找出一种使用 Devise 保护登录 URL 的方法。 我想更改用户/登录的默认路由。 我不希望有人偶然发现 URL 并获得对应用程序的访问权限。

更改 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'} 

“但我还没有让它工作”

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

我会在这里质疑你的逻辑 - 使用不同的 url 只是默默无闻的安全 即使您让您的用户使用/gobeligook登录,对于任何专门的攻击者来说,例如通过嗅探流量来弄清楚这一点也非常简单。

但是,您可能出于各种原因想要更改路径- 但不要自欺欺人地认为这样做会增加任何真正的安全优势。

此外,您还需要将身份验证的关注点分开 - Devise 所做的事情和授权。 身份验证正在验证用户是他/她声称的身份。 授权就是谁可以做什么。

如果您想将您的网站锁定给经过审查的用户,这是一个授权问题,并且有几种方法可以根据您的要求解决它:

禁用注册

最基本的方法是禁用注册,只允许管理员创建用户。 它相对安全,但对于管理员和非常严厉的人来说真的很乏味。 在这种情况下,除非用户通过身份验证,否则您的身份验证将只是锁定除登录之外的所有内容。

这就是before_action :authenticate_user! 进来。

仅限邀请

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

围墙花园方法

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

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

class Approval
  belongs_to :user, 
  belongs_to :vetting_user, class_name: '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

为简洁起见,这不包括像控制器这样的东西,在那里同行或管理员审查用户 - 但那是简单的部分。

尽管我会认真考虑使用像 Pundit 这样专门构建的身份验证库,而不是使用自己的身份验证库。

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

这完全取决于您,您列出的方式是正确的,请参阅设计维基:How-To:-Change-the-default-sign_in-and-sign_out-routes

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

# 应用控制器

before_action :authenticate_user!

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

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

这两件事不要在此混淆。

  1. 验证

Devise 是一个基于 Warden 的灵活的 Rails 认证解决方案

  1. 授权

Pundit 提供了一组帮助程序,可指导您利用常规 Ruby 类和面向对象的设计模式来构建简单、健壮且可扩展的授权系统。

设计将帮助您进行user authentication ,如果您想根据某些标准authorization用户,那么您应该使用Pundit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM