2011-04-05 109 views
2

我使用Rail3与Devise宝石。当你需要锁定用户登录时,它做得非常好。Rails:注销事件登录用户

但是它只适用于新的登录尝试。 如果他已经登录 - 它不会立即将他签出。

这里是典型的用例:

鉴于管理员用户 时,他将其锁定特定用户的可疑行为检测与malicious_user.lock('locking-reason')

% can config/initializers/session_store.rb 
AppFoo::Application.config.session_store :cookie_store, :key => '_foo_session' 

回答

1

由于HTTP的无状态性,你不能马上注销用户,因为您需要等待,直到他们向您的服务器发出另一个请求。你可以通过推送服务来解决这个问题,但这可能会过度。

我的解决方案是将该人员添加到黑名单,然后检查他们是否在黑名单上,只要他们尝试访问仅供登录用户使用的部分。这会使他们无法登录,直到您决定他们的活动是否可疑为止。

例子:

用户怀疑难耐活动

管理员希望检查了这一点,所以他们暂时将用户添加到黑名单中。

用户在添加到黑名单时单击当前所在页面的某个区域。

代码检查登录状态和列入黑名单的用户。

由于用户被列入黑名单,他们被告知,他们需要登录访问内容

一旦用户尝试再次登录,你可以告诉他们,他们的帐户已被暂时停用(或者你可以在上一步中做到这一点)。

1

也许最简单的方法是,当你锁定他们,所以将用户重定向到注销操作:

malicious_user.lock('locking-reason') 
redirect_to '/logout' and return 

我不熟悉的设计所以这可能不是最好的解决办法,甚至可能的,但这是我将如何处理这个问题

+0

redirect_to的“/注销”将重定向Admin用户没有恶意。我正在锁定来自管理员的用户 – user80805 2011-04-05 14:23:22

1

使用在ApplicationController中一个的before_filter,将做以下

before_filter :kick_out_blocked_user 


protected 

def kick_out_blocked_user  
    unless current_user.try(:active?) 
     redirect_to destroy_user_session_path   
    end 
end