2017-08-17 8 views
0

Express用の単純な認証ミドルウェアを作成しようとしています。 requiresAuthenticationを使用している場合、はundefinedに設定されています。Express - カスタム認証ミドルウェアが `req.session`を破棄します

マイコード:

user.ts

import { Request, Response } from 'express' 

export enum UserRole { 
    None = -1, 
    Normal = 0, 
    Judge = 1, 
    Admin = 2 
} 

export class User { 
    public login: string 
    public logged: boolean = false 
    public name: string 
    public passwordHash: string 
    public role: UserRole = UserRole.None 
} 

function addUser(req: Request) { 
    if (typeof req.session.user === 'undefined') { 
     req.session.user = new User() 
    } 
} 

export function middleware(req: Request, res: Response, next) { 
    addUser(req) 
    next() 
} 

export function requiresAuthentication(roles: Array<UserRole>) { 
    return (req: Request, res: Response, next) => { 
     if (req.session.user.logged === true) { 
      if (roles.indexOf(req.session.user.role) !== -1) { 
       next(); 
       return; 
      } 
     } 

     res.status(401).render('authentication_required') 
    } 
} 

app.ts

import * as express from 'express' 
import * as bodyParser from 'body-parser' 
import * as cluster from 'cluster' 
import { cpus } from 'os' 
import * as path from 'path' 
import * as i18n from 'i18n' 
import * as session from 'express-session' 
import * as user from './user' 
import * as helmet from 'helmet' 

const config = { 
    debug: true, 
    port: 8080, 
    session: { 
     secret: process.env.SESSION_SECRET || "SECRET_BELCANTO" 
    } 
} 

if (cluster.isMaster && !config.debug) { 
    for (let i = 0; i < cpus.length; i++) { 
     cluster.fork() 
    } 

    cluster.on('exit', (worker) => { 
     cluster.fork() 
    }) 
} else { 
    if (config.debug) { 
     console.log('Debug mode') 
    } 

    let app = express() 

    app.use(helmet()) 
    app.use(bodyParser.urlencoded({ extended: true })) 
    app.use(bodyParser.json()) 

    app.use(session({ 
     secret: config.session.secret 
    })) 

    i18n.configure({ 
     directory: path.join(__dirname, 'locales'), 
     locales: [ 
      'en', 
      'pl' 
     ] 
    }) 

    app.use(i18n.init) 

    app.use('/public', express.static(path.join(__dirname, 'public'))) 
    app.set('view engine', 'pug') 
    app.set('views', path.join(__dirname, 'views')) 
    app.use(user.middleware) 

    app.get('/', user.requiresAuthentication([user.UserRole.None]), (req, res) => { 
     res.render('index', { user: req.session.user }) 
    }) 


    console.log(`App listening on ${config.port}`) 
    app.listen(config.port) 
    console.log('App shutdown') 
} 

ワット何が起こりますかlocalhostを開こうとし編:問題が解決しないaddUserreq.session.save((err) => {})を追加8080

TypeError: /home/kamil/Pulpit/belcanto/app/views/layout.pug:13 
    11|   script(src='/public/js/semantic.min.js') 
    12| 
    > 13|   unless user.logged 
    14|    #loginModal.ui.tiny.modal 
    15|     .header= __("Login") 
    16|     .content 

Cannot read property 'logged' of undefined 
    at eval (eval at wrap (/home/kamil/Pulpit/belcanto/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:24:11) 
    at template (eval at wrap (/home/kamil/Pulpit/belcanto/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:173:4) 
    at Object.exports.renderFile (/home/kamil/Pulpit/belcanto/node_modules/pug/lib/index.js:428:38) 
    at Object.exports.renderFile (/home/kamil/Pulpit/belcanto/node_modules/pug/lib/index.js:418:21) 
    at View.exports.__express [as engine] (/home/kamil/Pulpit/belcanto/node_modules/pug/lib/index.js:465:11) 
    at View.render (/home/kamil/Pulpit/belcanto/node_modules/express/lib/view.js:127:8) 
    at tryRender (/home/kamil/Pulpit/belcanto/node_modules/express/lib/application.js:640:10) 
    at Function.render (/home/kamil/Pulpit/belcanto/node_modules/express/lib/application.js:592:3) 
    at ServerResponse.render (/home/kamil/Pulpit/belcanto/node_modules/express/lib/response.js:971:7) 
    at /home/kamil/Pulpit/belcanto/app/user.js:35:25 

--EDIT--

答えて

1

私の推測では、authentication_required.puglayout.pugに依存しますが、あなたはここにuserを渡していないということです。

res.status(401).render('authentication_required') 

それは間違って行くことに始まるスタックトレースを示しています

Cannot read property 'logged' of undefined 
    ... 
    at /home/kamil/Pulpit/belcanto/app/user.js:35:25 
+0

ええ、私は逃しました'authentication_required'は' user'変数を使う 'layout'に基づいているという事実です。ありがとう! –

関連する問題