2013-01-18 15 views
7

Czy istnieje sposób kontrolowania, kiedy sesja rozpoczyna się od oprogramowania pośredniego sesji klienta?Sesja kontrolowania Rozpocznij od wyrażenia i połącz oprogramowanie pośrednie

Na przykład, jeśli mam wyraźnej app config:

var app = express(); 
app.configure(function(){ 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser('secret')); 
    app.use(express.session({ store:sessionStore, ... })); 
}); 

Następnie na każdy żądania, jeśli nie jest podana cookie sesji, sesja jest uruchomiony. Co się stanie, jeśli chcę rozpocząć sesję tylko wtedy, gdy użytkownik zostanie uwierzytelniony?

Załóżmy na przykład, że mam dwie trasy /protected i /login.

  • Jeśli ktoś uderza /protected bez pliku cookie sesji, middleware będzie NIE rozpocząć nową sesję. (req.session jest null)
  • Jeśli ktoś uderza /protected z pliku cookie sesji, middleware będzie KONTROLA, aby zobaczyć, czy jest aktywna sesja dopasowywania do cookie i ustaw req.session, ale nie rozpocząć nową sesję. (req.session może mieć wartość lub być null)
  • Jeśli ktoś uderza /login z poprawnymi params, potem sesja rozpoczęła wyraźnie i plik cookie jest ustawiony tylko wtedy.

Jedynym sposobem, aby rozpocząć sesję powinny być wyraźnie:

app.post('/login', function(req, res, next) { 
    // connect to database and validate user... 
    db.authenticate(req.body.user, req.body.pass, function(allow) { 
    if (allow) { 
     // START SESSION HERE 
     // this will send set the cookie 
    } 
    }); 
} 

Czy istnieje sposób osiągnięcia tego z istniejącym połączyć middleware sesji?

Odpowiedz

0

Nawet jeśli sesja jest uruchamiana za każdym razem, tak naprawdę nie ma to znaczenia, ponieważ będzie pusta. Jeśli próbujesz użyć go do uwierzytelnienia dostępu (co wydaje się być), najprostszym rozwiązaniem jest ustawienie atrybutu w twojej sesji (takiego jak req.session.authenticated = true;) i sprawdź to. W ten sposób technicznie zawsze odwiedzający ma sesję, jednak sesja zostanie wykorzystana tylko wtedy, gdy właściwość req.session.authenticated == true. Być może nie jest to dokładnie to, czego szukasz, ale jest to najprostszy sposób, aby to zrobić.

+1

Jeśli używasz magazynu sesji bazy danych zaplecza, a następnie * co * anonimowy użytkownik będzie tworzyć sesje przechowywane w bazie danych. – ralouphie

+0

Rozumiem, że jednak nie powinieneś tak czy inaczej przechowywać danych sesji na zawsze. Po wygaśnięciu danych sesji należy je usunąć, a jeśli anonimowy użytkownik odwiedza tylko kilka stron w witrynie, powinien zostać usunięty raczej szybko po ich opuszczeniu. Poza tym sesje dla anonimowych użytkowników będą zasadniczo pustymi obiektami (popraw mnie, jeśli się mylę), a zatem nie powinny być wielkim obciążeniem pamięci. –

+0

Sposób działania oprogramowania pośredniego sesji spowoduje utworzenie sesji dla każdego użytkownika bez niego (bez pliku cookie). Oznacza to, że baza danych będzie miała wpis dla każdego żądania, które nie wysyła pliku cookie.W systemie, nad którym pracuję, jest to niedopuszczalne. – ralouphie

2

Co chcesz zrobić, to usunąć tę linię:

app.use(express.session({ store:sessionStore, ... })) 

Teraz sesje są domyślnie wyłączone i to do ciebie, aby zdecydować, które kontroler zamierza ich użyć:

var useSessions = express.session({ store:sessionStore, ... }); 

var preCb = function (req, res, next) { 
    // authenticate and stuff 
    // .... 
    if (authenticated === true) { 
    next(); 
    } 
}; 

app.post('/login', useSessions, function(req, res, next) { ... }); 
app.post('/protected', preCb, useSessions, function(req, res, next) { ... }); 
Powiązane problemy