2015-12-10 45 views
0

你好人的我在節點j新我創建了一個演示應用程序的多個用戶有一定的權限。我的問題是,當一個用戶在系統中登錄時它的工作正常,但是當其他用戶在同一臺​​服務器上與另一臺計算機登錄系統時,它會覆蓋第一個用戶權限我不知道如何解決這個問題,我搜索谷歌和stackoverflow以及但沒有得到任何東西,請幫助我。下面 是我的代碼爲登錄和會話管理節點js會話覆蓋我的第一個會話

var express = require('express'); 
    var cookieParser = require('cookie-parser'); 
    var session = require('express-session'); 
    //app setup 
    var app = express(); 
    //cookie parser 
    app.use(cookieParser()); 
    //session 
    app.use(session({secret: '1234567890QWERTY',cookieName: 'session' })); 
     app.post('/users/loginAuthentication', function(req, res) { 
       var query = req.body; 
       var conditions = {email: query.username, password: query.password.toString(), is_delete: false, status: true}; 
       userModel.findOne(conditions, function(err, admins) { 
        if (err) { 
         console.log(err.message); 
        } else { 
         if (!admins) { 
          res.end('{"success" : "not login", "status" : 400, "Auth" : "Failed"}'); 
         } else { 
          req.session.admin = admins; 
          app.locals.checkAuth = req.session.admin.user_roles; 
          app.locals.USERNAME = req.session.admin.user_name; 
          res.end('{"success" : "Updated Successfully", "status" : 200, "Auth" : "Success"}'); 
         } 
        } 
       }); 
      }); 

准許我做這樣的事情在我玉文件

if (checkAuth == 'ADMIN') 
      li 
       a(href='/data') 
       i.fa.fa-plus-square-o.fa-fw 
       | table data 

回答

2

時出現的問題,因爲你是app.locals內存儲的數據,即在應用程序的整個生命週期中持續存在。

在這些線路請看:

app.locals.checkAuth = req.session.admin.user_roles; 
app.locals.USERNAME = req.session.admin.user_name; 

屬性 「checkAuth」 和 「USERNAME」 將在那裏,直到你停止你的應用程序(按Ctrl + C爲例)。

爲了解決這個問題,你應該在res.locals而不是app.locals中存儲這些屬性;

下一個問題是如何通過它們來查看翡翠?你可以試試下面的腳本(未測試!):

app.use(function(req, res, next){ 
    var render = res.render; 
    var resLocals = res.locals; 
    res.render = function(view, locals, cb){ 
    locals.checkAuth = resLocals.checkAuth; 
    locals.USERNAME = resLocals.USERNAME; 
    render.call(res, view, locals, cb); 
    } 
    next(); 
}); 

以上塊的工作作爲一個經常ExpressJS中間件從res.locals到app.locals執行模板引擎行爲之前複製數據。

*增加:

會話數據應在控制器來處理,請求 - 響應週期內。在現實世界中,你應該做這樣的事情:

// homeController.js 

function index(req, res){ 

    var data = { 
    checkAuth: req.session.user_roles; 
    USERNAME: req.session.user_name;  
    } 

    res.render('yourJadeTemplateFile', data); 
} 
+0

讓我試試這個代碼 –

+0

我用你的代碼仍然會重寫數據:( –

+0

你能與我分享你的最新的代碼 –