2013-04-07 34 views
32

Tôi đang sử dụng thiết lập và tạo trường Người dùng được gọi là: hoạt động đúng hoặc sai. Tôi phải tự làm cho người dùng hoạt động (đúng) trước khi người dùng được phép đăng nhập. Ít nhất đó là mục đích. Tôi đã thử điều này ...Kiểm tra xem người dùng có hoạt động không trước khi cho phép người dùng đăng nhập bằng cách đặt ra (đường ray)

class SessionsController < Devise::SessionsController 
    # POST /resource/sign_in 
    def create 
    "resource/signin CREATE" 
    self.resource = warden.authenticate!(auth_options) 
    unless resource.active? 
     sign_out 
     redirect_to :sorry_not_active_url 
     return 
    end 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
end 

Tuy nhiên, điều này không bắt được những nơi người dùng có thể đăng nhập, ví dụ: khi người dùng thay đổi mật khẩu, trang web sẽ tự động đăng nhập tự động sau đó. Tuy nhiên, nếu người dùng không hoạt động, tôi không muốn họ được phép đăng nhập, mà đúng hơn là được chuyển hướng đến sorry_not_active_url.

Cách nào tốt nhất để ngăn người dùng đăng nhập nếu người dùng không hoạt động?

Cảm ơn bạn.

Trả lời

73

Thêm hai phương pháp để mô hình người dùng của bạn, đưa ra nên chọn chúng tự động - bạn không cần phải mở rộng Devise::SessionsController

def active_for_authentication? 
    super && self.your_method_for_checking_active # i.e. super && self.is_active 
end 

def inactive_message 
    "Sorry, this account has been deactivated." 
end 
+0

Điều tuyệt vời này! có cách nào để kiểm tra các trạng thái khác nhau, như, đang hoạt động, không hoạt động, đang chờ xử lý, bị từ chối bằng cách tạo trường có 4 giá trị khác nhau và phân phối thông điệp khác nhau cho mỗi trạng thái không? – user2012677

+1

sau khi suy nghĩ về nó, tôi giả sử tôi có thể làm cho def tham chiếu inactive_message một lĩnh vực, và lĩnh vực này có thể có một tin nhắn tùy chỉnh cho mỗi người dùng. Điều này có vẻ đúng không? – user2012677

+0

Nghe có vẻ như nó sẽ hoạt động – house9

3

lập mưu (Nếu bạn có đưa ra 3.2+) bây giờ hỗ trợ block tham số trong (phiên) tạo

# assuming this is your session controller 

class SessionsController < Devise::SessionsController 

def create 
    super do |resource| 
    unless resource.active? 
     sign_out 
     # you can set flash message as well. 
     redirect_to :sorry_not_active_url 
     return 
    end 
    end 
end 
+0

Hi Viren, bạn có thể liệt kê một vài lợi ích để thực hiện nó theo cách này trái với việc thực hiện trong câu trả lời được chấp nhận? Tôi đang tìm cách để thực hiện điều này bây giờ bản thân mình và tự hỏi thực hành tốt nhất hiện nay là gì. Cảm ơn. – Marklar

+1

@Marklar Điều này có thể có lợi khi bạn hỗ trợ nhiều chiến lược xác thực và cần phải tắt quy trình xác thực thông thường, nhưng không phải cho tất cả. Trong khi trường hợp sử dụng của OP là để kiểm tra xem người dùng có đang hoạt động hay không, tôi cần phải vô hiệu hóa việc tạo phiên thông thường nếu người dùng đã xác thực thông qua phương thức khác (OAuth) chẳng hạn. Cách tiếp cận dựa trên mô hình sử dụng 'active_for_authentication?' Sẽ khó khăn hơn. – sp89

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