2015-10-16 34 views
3

同时做管理员工作,我想禁用用户登录 - 有没有办法使用这个设计 - 我不认为这个 适合rolify - 因为这是一个临时的残疾 - 在此先感谢您的帮助, 里克禁用除了管理员在轨道上的红宝石的所有登录

+0

嗨里克,你想保持访问的管理员,或者你想简单地禁用每个用户? – smile2day

+0

保留访问管理员 - 我注意到投票宝石 - 但必须从命令行运行 - 希望像drupal维护模式的东西。 – user2155272

回答

1

后端

如果你想要创建一个“维护”模式,您最好是这样做:

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

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

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

您可以在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 

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

最后,如果你想摆脱任何登录用户,你需要做一些离奇,像复位会话或类似的东西:

+0

谢谢!我会在星期一尝试一下 - 我已经在用户上创建了一个'admin'标志来表明他们是否拥有管理员权限 - 这一切看起来都不错。谢谢! – user2155272

+1

这工作 - 我得到了一个循环依赖关系,虽然为SessionsController user2155272

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 

我不认为这是最好的方法,但应不安装其他宝石工作或重码。

+0

我想保持管理员访问权限 - 会这样做吗? – user2155272

+0

,我可以添加另一个Gem--这是我想添加的功能,而不仅仅是一次性事件。谢谢! – user2155272

+0

这是有帮助的,只是不是我正在寻找..但它给了我的想法。 – user2155272

1

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

def active_for_authentication? 
    super && is_admin? 
end 

def is_admin? 
    # returns true if user is admin 
end 

这是这样做的 “制定办法” :)

+0

我不知道为什么人们建议把这个功能放在用户对象上。我创建了一个维护对象 - 只能由管理员用户编辑 - 在记录检查维护对象的存在性之前 - 如果存在则不允许。 – user2155272