在rails上的ruby中禁用除admin之外的所有登录

时间:2015-10-16 17:29:16

标签: ruby-on-rails devise authorization

在进行管理工作时,我想禁用用户登录 - 是否有一些方法可以使用设计 - 我没有想到这一点 适合rolify - 因为这是暂时的残疾 - 在此先感谢任何帮助, 瑞克

3 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

<强> 1。为您的用户模型创建方法。可能类似于activeable_to_login

<强> 2。将此属性设置为:boolean

第3。使用rails console使用控制台将有效方法设置为truefalse,启用或禁用用户访问您的应用:

user = User.all
   user.each do |u|
     u.active = false # or
     u.able_to_login = false
     u.save
   end

我不认为这是最好的方法,但它应该可以在不安装其他gem或重码的情况下工作。

答案 1 :(得分:1)

在/models/user.rb中添加此方法

def active_for_authentication? 
  super && is_admin?
end

def is_admin?
  # returns true if user is admin
end

这是做到这一点的“设计方式”:)

答案 2 :(得分:1)

返回-完

如果你想创建一个“维护”模式,你最好做这样的事情:

#app/models/user.rb
class User < ActiveRecord::Base
end

#app/models/admin.rb
class Admin < User
   def maintainance!
     self.toggle! :maintainance
   end
end

这需要maintenance表格中的users列,您还必须在type表格中添加users列。

您可以将此保留在User模型中,但是,您需要一些条件来确定用户是否为管理员。既然你没有具体说明你的差异化,那么我们就是这样做的。

-

你可以这样称呼它:

#app/controllers/users_controller.rb
class SettingsController < ApplicationController
   before_action :authenticate_user!
   def maintenance
      current_user.maintenance! #-> toggles so you'll just be able to call this as you need.
   end
end

#config/routes.rb
resources :settings, only: [] do
    put :maintenance #-> url.com/settings/maintenance (considering current_user present)
end

这样,您就可以通过user设置区域设置<维护“模式。如果您没有,您将能够使用上述代码使其正常工作。

<强>前端

随着后端的到位,您将能够管理前端。

为此,您需要帮助程序来确定是否有任何用户设置了“维护”模式......

#app/helpers/application_helper.rb
class ApplicationHelper
   def maintenance_mode?
      Admin.exists? maintenance: true
   end
end

这将允许您使用此帮助程序来确定是否应允许Devise接受登录:

#app/views/devise/sessions/new.html.erb
<% unless maintenance_mode? %>
  ... devise form ...
<% end %>

帮助程序将执行数据库请求,但将其保留在devise区域(IE不是“站点范围”)应该可以正常运行。

#app/controllers/devise/sessions_controller.rb
class SessionsController < Devise::SessionsController
   before_action :check_maintenance

   private

   def check_maintenance 
       redirect_to root_path, notice: "Sorry, maintenance mode is in effect; no logins." if maintenance_mode?
   end
end

这将阻止任何基于控制器的操作被触发。

最后,如果您想要删除任何已登录的用户,您需要做一些古怪的事情,例如重置会话或类似内容: