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
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
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 đã 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. –
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
Đ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
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 đó.
Đ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
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
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
Để 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
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
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
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