2012-11-30 25 views
7

Tôi đang thiết lập một auth quản trị cơ bản, khi người dùng đăng nhập, tôi gọi chức năng này trong authcallback:nodejs req.session nhanh không lưu trữ của tôi biến

function checkAdmin (req) { 
    Admin.findOne({ user : req.user.id },function (err, admin, count){ 
    req.session.isAdmin = true; 
    console.log("session : %j",req.session); 
    }) 
} 

Và sau đó tôi làm

res.redirect('/') 

các mã bên trong bộ điều khiển chỉ số:

console.log("session : %j",req.session); 
    res.render('index', { title: 'Accueil',message: req.flash('info') }); 

Và đây là những gì tôi nhận được trong giao diện điều khiển:

session : {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path" 
:"/"},"passport":{"user":"5079832df1e9a6485e000001"},"flash":{},"isAdmin":true} 

session : {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path" 
:"/"},"passport":{"user":"5079832df1e9a6485e000001"},"flash":{}} 

Tôi không hiểu tại sao phiên không lưu trữ giá trị isAdmin.

Tôi đã đọc một số câu hỏi khác nói rằng app.use (app.router) nơi có thể là một nguyên nhân nhưng tôi làm:

app.use(cookieParser) 
app.use(express.session({store: session_store })); 
app.use(passport.initialize()) 
app.use(passport.session()) 


// routes should be at the last 
app.use(app.router) 

Nó phải được loại ngốc Tôi đoán ..

+0

Có lẽ một cái gì đó như thế này có thể giúp: req.session.regenerate https : //github.com/senchalabs/connect/issues/681 – alditis

+1

Vì vậy, nó có nghĩa là mỗi khi tôi muốn thay đổi/thêm một biến trong phiên nI phải sử dụng req.session.regenerate? –

+1

Có lẽ bạn nên thực hiện chuyển hướng bên trong chức năng checkAdmin. –

Trả lời

7

Vâng,

Cuối cùng tôi đã tìm thấy lý do tại sao điều này không hiệu quả. Tôi đã thực hiện res.redirect bên ngoài hàm Admin.findOne của mình. Vì vậy, khách hàng đã được chuyển hướng trước khi biến phiên được đặt.

authCallbackFunction này đang làm việc:

exports.authCallback = function (req, res, next) { 
    //Check if the logged in user is an admin 
    Admin.findOne({ user : req.user.id },function (err, admin, count){ 
    var old = req.session; 
     if(!err && admin) 
     req.session.isAdmin = true; 
     res.redirect('/') 
    }) 
} 

Và khi logout người dùng, đừng quên để tái tạo phiên

// logout 
exports.logout = function (req, res) { 
    req.session.regenerate(function(){ 
    req.logout() 
    res.redirect('/login') 
    }) 

} 
+1

ye này khá khó tiêu hóa khi bạn đến từ thế giới mã hóa "đồng bộ". Chỉ cần xảy ra với tôi là tốt và q/a của bạn ở đây đã giúp tôi khắc phục điều đó. cám ơn. – shaharsol

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