2013-07-29 30 views
19

Có cách nào để nhận khi người dùng đăng xuất khỏi trang web không? Tôi cần phải làm một số dọn dẹp khi họ làm như vậy. Sử dụng tài khoản người dùng meteor.js có sẵn.Chọn đăng xuất người dùng meteor.js

Tôi sẽ thực hiện một số xác thực bằng cách sử dụng nó, vì vậy tôi cần một giải pháp không thể kích hoạt thay mặt cho những người dùng khác ở phía máy khách - tốt nhất là một thứ hoàn toàn phía máy chủ.

+0

Có lẽ đây trả lời câu hỏi của bạn: http://stackoverflow.com/questions/10257958/server-cleanup-after-a-client-disconnects –

+0

Đó là rất gần, nhưng tôi làm muốn chắc chắn rằng nó chỉ khi họ tích cực đăng xuất không may. –

+0

điều này có thể giúp: http://stackoverflow.com/questions/22900405/how-to-redirect-after-user-has-just-logged-in-or-just-logged-out?answertab=votes#tab-top – dm76

Trả lời

7

Sử dụng gói user-status mà tôi đã tạo: https://github.com/mizzao/meteor-user-status. Điều này hoàn toàn phía máy chủ.

Xem các tài liệu để sử dụng, nhưng bạn có thể đính kèm một xử lý sự kiện cho một logout phiên:

UserStatus.events.on "connectionLogout", (fields) -> 
    console.log(fields.userId + " with connection " + fields.connectionId + " logged out") 

Lưu ý rằng người dùng có thể đăng nhập từ nhiều nơi khác nhau cùng một lúc với nhiều phiên. Gói thông minh này phát hiện tất cả chúng cũng như liệu người dùng có trực tuyến hay không. Để biết thêm thông tin hoặc để thực hiện phương pháp của riêng bạn, hãy kiểm tra mã.

Hiện tại, gói không phân biệt giữa cửa sổ trình duyệt đóng và đăng xuất và xử lý chúng giống nhau.

+0

Cảm ơn - Tôi chắc chắn có một cái nhìn! –

+1

nó là một gói phần mềm mát mẻ. Bất kỳ ý tưởng làm thế nào tôi có thể thực hiện kích hoạt sự kiện chỉ vào đăng nhập của người dùng/đăng xuất không bao gồm đóng cửa sổ trình duyệt/cửa sổ? bất kỳ gợi ý/hướng nào sẽ là tuyệt vời. cảm ơn @ andrew-mao –

+0

Làm cách nào để chuyển hướng người dùng đến một số tuyến đường cụ thể khi người dùng tự đăng xuất? – mfq

-2

Bạn có thể sử dụng Meteor.logout sau - http://docs.meteor.com/#meteor_logout

+2

Chỉ có thể được gọi ở phía máy khách theo tài liệu. Và nó ghi lại người dùng trực tiếp, mà tôi không nghĩ là mong muốn trong trường hợp này. –

+2

Thật vậy - Tôi đang cố gắng để phát hiện đăng xuất, không kích hoạt một. –

+0

Meteor.logout có chức năng gọi lại Meteor.logout (function (err) {// do stuff here}}) – MrE

9

Bạn có thể sử dụng Deps.autorun để thiết lập một handler tùy chỉnh quan sát Meteor.userId() thay đổi biến phản ứng.

Meteor.userId() (và Meteor.user()) là các biến phản ứng trả về tương ứng với userId hiện tại đã đăng nhập (null nếu không) và tài liệu người dùng tương ứng (bản ghi) trong bộ sưu tập Meteor.users.

Do đó, người dùng có thể theo dõi việc đăng nhập/đăng xuất khỏi ứng dụng Meteor bằng cách phản ứng với việc sửa đổi các nguồn dữ liệu phản ứng đó.

client/main.js:

var lastUser=null; 

Meteor.startup(function(){ 
    Deps.autorun(function(){ 
     var userId=Meteor.userId(); 
     if(userId){ 
      console.log(userId+" connected"); 
      // do something with Meteor.user() 
     } 
     else if(lastUser){ 
      console.log(lastUser._id+" disconnected"); 
      // can't use Meteor.user() anymore 
      // do something with lastUser (read-only !) 
      Meteor.call("userDisconnected",lastUser._id); 
     } 
     lastUser=Meteor.user(); 
    }); 
}); 

Trong mẫu mã này, tôi đang thiết lập một tập tin nguồn biến cục bộ (lastUser) để theo dõi người sử dụng cuối cùng đã được ghi lại trong ứng dụng. Sau đó, trong Meteor.startup, tôi sử dụng Deps.autorun để thiết lập một ngữ cảnh phản hồi (mã sẽ được thực thi lại bất cứ khi nào một trong các nguồn dữ liệu phản ứng được truy cập được sửa đổi). Ngữ cảnh phản ứng này theo dõi biến thể Meteor.userId() và phản ứng tương ứng.

Trong mã kết nối, bạn không thể sử dụng Meteor.user() nhưng nếu bạn muốn truy cập tài liệu người dùng cuối cùng, bạn có thể sử dụng biến lastUser. Bạn có thể gọi phương thức máy chủ với lastUser._id làm đối số nếu bạn muốn sửa đổi tài liệu sau khi đăng xuất.

máy chủ/server.js

Meteor.methods({ 
    userDisconnected:function(userId){ 
     check(userId,String); 
     var user=Meteor.users.findOne(userId); 
     // do something with user (read-write) 
    } 
}); 

Hãy nhận biết rằng mặc dù khách hàng độc hại có thể gọi phương thức phục vụ này với bất cứ ai userId, vì vậy bạn không nên làm bất cứ điều gì quan trọng trừ khi bạn thiết lập một số mã xác minh.

+0

Hey - trong trường hợp này tôi cần phải tránh các khách hàng độc hại có thể gọi nó, vì nó sẽ có hiệu quả của việc đăng nhập một người chơi ra khỏi trò chơi mà tôi rõ ràng không thể cho phép mọi người làm với nhau. Bất kỳ ý tưởng nào về cách tôi có thể thiết lập mã xác minh và liên kết mã đó với một người dùng cụ thể? –

2

Câu trả lời được cung cấp bởi @saimeunt có vẻ đúng, nhưng nó hơi mịn cho những gì tôi cần.Thay vào đó, tôi đã thực hiện một cách tiếp cận rất đơn giản như sau:

if (Meteor.isClient) { 
    Deps.autorun(function() { 
     if(!Meteor.userId()) 
     { 
      Session.set('store', null); 
     } 
    }); 
} 

Điều này được kích hoạt trong khi tải trang nếu người dùng chưa đăng nhập, điều này có thể không mong muốn. Vì vậy, bạn có thể đi với một cái gì đó như thế này thay vì:

if (Meteor.isClient) { 
    var userWasLoggedIn = false; 
    Deps.autorun(function (c) { 
     if(!Meteor.userId()) 
     { 
      if(userWasLoggedIn) 
      { 
       console.log('Clean up'); 
       Session.set('store', null); 
      } 
     } 
     else 
     { 
      userWasLoggedIn = true; 
     } 
    }); 
} 
+0

Dường như nó sẽ là tốt đẹp để đặt đăng ký deps.autorun bên trong xử lý onLogin, theo cách đó bạn chỉ đăng ký nó khi bạn biết người dùng đã đăng nhập. – Derek

1

Không ai trong số các giải pháp làm việc cho tôi, vì tất cả họ đều bị vấn đề không thể phân biệt giữa logout thủ công bởi người sử dụng so với trang trình duyệt tải lại/gần.

bây giờ tôi đang đi với một hack, nhưng ít nhất nó hoạt động (miễn là bạn không cung cấp bất kỳ phương tiện khác đăng xuất hơn các nút mặc định tài khoản-ui):

Template._loginButtons.events({ 
    'click #login-buttons-logout': function(ev) { 
     console.log("manual log out"); 
     // do stuff 
    } 
}); 
+0

Thực sự thú vị. Bạn có cần 'aldeed: template-extension' hoặc gói tương tự để mở rộng/ghi đè lên chức năng của các mẫu trong gói _accounts_ không? – Diego

+0

Cảm ơn, điều này cũng đã làm những gì tôi cần hoàn hảo! – jremi

6

Chúng tôi có một yêu cầu tương tự, mặc dù không chính xác. Chúng tôi muốn làm sạch một chút về khách hàng khi họ đăng xuất. Chúng tôi đã làm điều đó bằng cách cướp Meteor.logout:

if (Meteor.isClient) { 
    var _logout = Meteor.logout; 
    Meteor.logout = function customLogout() { 
    // Do your thing here 
    _logout.apply(Meteor, arguments); 
    } 
} 
+0

Đây là báo giá đơn giản và hoạt động thực sự tốt. Tôi chỉ muốn chuyển hướng người dùng 'đăng xuất' sang trang chủ và đây là cách tiếp cận dễ dàng + sạch sẽ. – Diego

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