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

Ruby on rails 设计和Rails:如何保护登录URL,ruby-on-rails,authentication,devise,Ruby On Rails,Authentication,Devise,我正在试图找到一种使用Desive保护登录URL的方法。我想更改用户/登录的默认路由。我不希望有人无意中发现这个URL并访问这个应用程序 在routes.rb文件中更改以下内容应该可以提供我正在寻找的解决方案。然而,我不确定这是否是最好的途径 devise_scope :user do get "/login" => "devise/sessions#new" end 或 使用以下方法可能更容易 devise_for :users, :path => '', :path_nam

我正在试图找到一种使用Desive保护登录URL的方法。我想更改用户/登录的默认路由。我不希望有人无意中发现这个URL并访问这个应用程序

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

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

使用以下方法可能更容易

devise_for :users, :path => '', :path_names => {:sign_in => 'login', :sign_out => 'logout'} 
“但我还没有让它发挥作用”


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

在过滤器之前添加
:验证用户应强制任何人完成登录过程。这就是使用Desive和/或任何其他此类宝石的全部目的。

一切由您决定,您列出的方法是正确的,请参阅

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

#应用程序控制器

before_action :authenticate_user!
#然后你可以在你的其他控制器中跳过这个动作过滤器

skip_before_action :require_login, only: [:new, :create]
这是两件事,不要混淆

  • 认证
  • Desive是一种基于Warden的灵活的Rails身份验证解决方案

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


    将帮助您进行
    用户身份验证
    ,如果您想基于某些标准对用户进行
    授权
    ,那么您应该使用我想在这里质疑您的逻辑-使用不同的url很简单。即使您让您的用户使用
    /gobeligook
    登录,对于任何专门的攻击者来说,例如通过嗅探流量来发现这一点都是微不足道的

    然而,您可能想这样做,但不要欺骗自己,这样做会增加任何真正的安全好处

    此外,您还需要将身份验证(Desive的功能和授权)的关注点分开。身份验证是验证用户是否是他/她声称的用户。授权是指谁可以做什么

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

    禁用注册 最基本的方法是只允许管理员创建用户。它相对安全,但对管理员来说真的很乏味,而且相当苛刻。在这种情况下,您的身份验证将只是锁定除了登录之外的所有内容,除非用户经过身份验证

    这就是操作之前的
    :验证用户进来了

    仅限邀请 您可以使用类似于模块的功能通过电子邮件邀请用户,然后覆盖注册方法以需要邀请令牌

    围墙式花园法 您可能希望用户能够注册,但实际上,只有经过管理员或同行审查后,才允许他们访问任何内容

    这是一个基本的草图,说明了如何设置类似的内容:

    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,而不是翻滚自己。

    我很高兴你掌握了我的逻辑。这正是我想要的,因为我不确定我的方法是否可靠。我相信使用“邀请”方式将是我的应用程序的首选方法。我还将探讨“围墙花园”方法。对于我正在进行的另一个项目来说,这可能是一个更好的选择。我感谢你的反馈。
    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