2011-04-12 17 views
30

Tôi có rất nhiều người dùng cảm ơn và tôi muốn cấm một vài người tạo vấn đề. Devise có hỗ trợ này được xây dựng không?Rails + Devise - Có cách nào để BAN người dùng không thể đăng nhập hoặc đặt lại mật khẩu của họ không?

Cảm ơn

+0

Bản sao có thể có của [Cách tốt nhất để cấm/chặn người dùng với Devise for Rails là gì?] (https://stackoverflow.com/questions/3894919/what-is-the -bệnh-đường-tới-cấm-chặn-người dùng-với-phát-cho-đường ray) – Wit

+0

cũng xem [Cách thực hiện: -Soft-delete-a-user-khi-người dùng-xóa-tài khoản] (https://github.com/plataformatec/devise/wiki/How-to:-Soft-delete-a -user-when-user-deletes-account) – mb21

Trả lời

26

Tôi vừa mới triển khai dự án này trong dự án của mình. Những gì tôi đã làm là tương tự như Kleber trên, tôi định nghĩa này trong ứng dụng của tôi/controllers/sessions_controller.rb (trọng lập mưu) ...

class SessionsController < Devise::SessionsController 

protected 

    def after_sign_in_path_for(resource) 
    if resource.is_a?(User) && resource.banned? 
     sign_out resource 
     flash[:error] = "This account has been suspended for violation of...." 
     root_path 
    else 
     super 
    end 
    end 

end 

Và sau đó tôi đã thêm một cột boolean để người gọi là 'cấm', vì vậy người kiểm duyệt kiểm tra hộp kiểm khi chỉnh sửa người dùng trong chương trình phụ trợ và boolean sẽ trả về true.

Nhưng có một lỗ hổng ... nếu người dùng đã đăng nhập và sau đó bị cấm, họ vẫn có quyền truy cập để thực hiện các công cụ trên trang web (nhận xét, v.v.) ít nhất cho đến khi phiên của họ hết hạn hoặc họ đã đăng xuất. Vì vậy, tôi đã thực hiện điều này trong ứng dụng/controllers/application_controller.rb ...

class ApplicationController < ActionController::Base 
    before_filter :banned? 

    def banned? 
    if current_user.present? && current_user.banned? 
     sign_out current_user 
     flash[:error] = "This account has been suspended...." 
     root_path 
    end 
    end 
end 

Điều đó sẽ tự động đăng xuất nếu phát hiện lệnh cấm. Dù sao, không chắc chắn toàn bộ điều này là "tốt nhất" cách để yếu tố toàn bộ điều như tôi mới hơn để Rails, nhưng toàn bộ điều làm việc cho tôi và hy vọng nó sẽ ít nhất là cung cấp cho bạn một khởi đầu tốt.

+1

+1 đã hoạt động rất tốt! Tôi không nghĩ rằng việc ghi đè after_sign_in_path_for là cần thiết. Việc thực hiện before_filter trong bộ điều khiển ứng dụng là tất cả những gì cần thiết nhưng after_sign_in_path_for có thể hữu ích đối với một số. Cảm ơn. –

+0

Quan sát tốt, không nghĩ về điều đó, ý tưởng tái cấu trúc tốt đẹp và tôi có thể thực hiện điều đó.Tuy nhiên nếu bạn đang ở trong một tình huống mà bạn không cần phải kiểm tra một người dùng bị cấm tất cả thời gian và chỉ khi đăng nhập, tôi sẽ chọn ghi đè đăng nhập Devise. Nhưng một số tùy chọn ở đây để bao gồm các tình huống khác nhau. – Shannon

+0

Điều này không phù hợp với tôi trong Rails 3, nhưng câu trả lời của @Frank đã làm – Dinedal

-3

Bạn có thể thêm trường có tên "bị cấm" vào bảng Người dùng của mình.

và sau đó, trên điều khiển của bạn, bạn có thể có một cái gì đó như thế này:

class UsersController < ApplicationController 
before_filter :deny_banned 

protected 
def deny_banned 
    if current_user.banned? 
    redirect_to root_path, :notice => "You are banned from this site." 
    end 
end 

end 

Đây không phải là hoàn chỉnh nhưng tôi hy vọng nó sẽ giúp bạn bằng cách nào đó.

+3

Điều này sẽ không thực sự đăng xuất người dùng, điều này có thể dẫn đến các vấn đề lớn. – saadlulu

77

Từ doku devise cho authenticatable.rb:

Trước khi chứng thực người dùng và trong từng yêu cầu, Vạch kiểm tra xem mô hình của bạn đang hoạt động bằng cách gọi model.active_for_authentication ?. Phương pháp này được ghi đè bởi các module khác. Ví dụ: ghi đè có thể xác nhận .active_for_authentication? chỉ trả lại đúng nếu mô hình của bạn được xác nhận.

Bạn ghi đè phương pháp này cho mình, nhưng nếu bạn làm thế, bạn đừng quên gọi siêu:

def active_for_authentication? 
    super && special_condition_is_valid? 
end 

Vì vậy, khi bạn có một lá cờ blocked trong cơ sở dữ liệu sử dụng, phương pháp trong sử dụng mô hình trông giống như thế này:

def active_for_authentication? 
    super && !self.blocked 
end 
+2

Vâng, tôi nghĩ phương pháp này là phương pháp tốt nhất để có chiến lược "bị chặn", cảm ơn Frank! – Kulgar

+2

Để tùy chỉnh thông báo lỗi được hiển thị cho người dùng với phương pháp này, hãy chỉnh sửa 'config/locales/devise.en.yml' và chỉnh sửa giá trị trong vi> devise> failure> không hoạt động – tirdadc

+0

Nếu bạn không muốn sử dụng' không hoạt động 'thông báo lỗi, bạn có thể thêm một tùy chỉnh bằng cách ghi đè' inactive_message' cũng như được thấy [ở đây] (https://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb#L50). – brendanwb

Các vấn đề liên quan