Devise: rememberable means that last_sign_in_at is not updated by trackable
Mở rộng trên các giải pháp trước đó, vấn đề với họ sẽ là nếu người dùng đăng nhập bình thường, họ sẽ "đăng nhập hai lần". Điều này sẽ đặt last_sign_in_at
thành cùng một giá trị (hoặc gần như giống nhau) là current_sign_in_at
. Trên trang web của tôi, tôi sử dụng last_sign_in_at
để cho người dùng biết điều gì đã xảy ra kể từ lần cuối họ ghé thăm trang web và vì vậy tôi cần nó có phần chính xác. Ngoài ra, nó ghi lại số lần đăng nhập +1.
Ngoài ra, có những người (như bản thân tôi), người rời khỏi cửa sổ trình duyệt mở cửa trong nhiều ngày mà không đóng cửa sổ (và do đó không bao giờ xóa cờ phiên). Đối với mục đích số liệu v.v., nó có thể hữu ích nếu hành vi của người dùng đôi khi làm mới thời gian current_sign_in_at
.
Các biến thể dưới đây sẽ khắc phục những điều này.
class ApplicationController < ActionController::Base
before_filter :update_sign_in_at_periodically
UPDATE_LOGIN_PERIOD = 10.hours
protected
def update_sign_in_at_periodically
if !session[:last_login_update_at] or session[:last_login_update_at] < UPDATE_LOGIN_PERIOD.ago
session[:last_login_update_at] = Time.now
sign_in(current_user, :force => true) if user_signed_in?
end
end
end
Tuy nhiên, khi tôi cố gắng trên, sử dụng lập mưu 3.2.4, tôi có được một đăng nhập mới khi nó tự động đăng nhập bằng cookie (login-count +1 và current_sign_in_at
được thiết lập). Vì vậy, tôi còn lại chỉ với vấn đề muốn theo dõi để cập nhật định kỳ ngay cả đối với người dùng giữ phiên mở.
class ApplicationController < ActionController::Base
before_filter :update_sign_in_at_periodically
UPDATE_LOGIN_PERIOD = 10.hours
protected
def update_sign_in_at_periodically
# use session cookie to avoid hammering the database
if !session[:last_login_update_at] or session[:last_login_update_at] < UPDATE_LOGIN_PERIOD.ago
session[:last_login_update_at] = Time.now
if user_signed_in? and current_user.current_sign_in_at < 1.minute.ago # prevents double logins
sign_in(current_user, :force => true)
end
end
end
end
Nguồn
2016-02-23 17:52:19
khi nào thì before_filter được gọi? Tôi hy vọng không phải trên mỗi yêu cầu, và chỉ trên trước khi xác thực cho lần đầu tiên phiên họp đó? Ngoài ra, câu hỏi ngu ngốc, nhưng nơi nào tôi thêm before_filter? Tôi đã thử thêm nó vào mô hình người dùng Devise và tôi đã nhận được phương thức undefined before_filter. –
Điều đó sẽ được chạy trên mỗi yêu cầu - đó chỉ là một bước gỡ lỗi nhanh/bẩn để xem liệu điều đó có giải quyết được trước khi thực hiện một giải pháp tốt hơn hay không. Bạn có thể thêm nó vào bất kỳ bộ điều khiển nào, ApplicationController nếu bạn muốn nó toàn cục. – RobH
Hi Rob, đây là những gì tôi đã đi cho đến cuối mà a) kiểm tra rằng người dùng đã đăng nhập trước khi buộc một sign_in, và b) đảm bảo rằng phương thức sign_in (buộc) chỉ được thực thi một lần mỗi phiên.(xin lỗi; thay vì ngắt dòng, nhận xét không cho phép ngắt dòng) 'before_filter proc {if user_signed_in? && phiên [: logged_signin]; sign_in (current_user,: force => true); phiên [: logged_signin] = true; end} ' –