我正试图找出一种使用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'}
"但我还没有把它付诸实践"
我使用简单的设备安装,没有专家或任何其他类型的授权。另一个想法是实现一个角色并将当前用户添加到该角色。因此,默认情况下阻止对应用程序的访问。但这需要我在注册时将每个新的合法用户添加到该角色。不是真的想这样做。
答案 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]
这两件事情不要混淆。
答案 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这样的专用验证库,而不是自己编写。