node-casbin / express-authz

express-authz is an authorization middleware for Express.js based on Casbin
https://casbin.org
Apache License 2.0
62 stars 9 forks source link

Enforcer problem #4

Closed bobpaul2612 closed 5 years ago

bobpaul2612 commented 5 years ago

Hi

i have a problem about express-authz

when i use like the simple example

const enforcer = await Enforcer.newEnforcer('keymatch_model.conf', 'keymatch_policy.csv');

the system will return

0|CIA  | 2019-01-29 13:59 +08:00: You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
0|CIA  | 2019-01-29 13:59 +08:00: TypeError: Enforcer.newEnforcer is not a function
0|CIA  | 2019-01-29 13:59 +08:00:     at app.use.authz (/home/ntcucia/CIA_DB/app.js:103:37)
0|CIA  | 2019-01-29 13:59 +08:00:     at /home/ntcucia/CIA_DB/node_modules/casbin-express-authz/authz.js:22:28
0|CIA  | 2019-01-29 13:59 +08:00:     at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
0|CIA  | 2019-01-29 13:59 +08:00:     at trim_prefix (/home/node_modules/express/lib/router/index.js:317:13)
0|CIA  | 2019-01-29 13:59 +08:00:     at /home/node_modules/express/lib/router/index.js:284:7
0|CIA  | 2019-01-29 13:59 +08:00:     at Function.process_params (/home/node_modules/express/lib/router/index.js:335:12)
0|CIA  | 2019-01-29 13:59 +08:00:     at next (/home/node_modules/express/lib/router/index.js:275:10)
0|CIA  | 2019-01-29 13:59 +08:00:     at app.use (/home/app.js:96:5)
0|CIA  | 2019-01-29 13:59 +08:00:     at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
0|CIA  | 2019-01-29 13:59 +08:00:     at trim_prefix (/home/node_modules/express/lib/router/index.js:317:13)
0|CIA  | 2019-01-29 13:59 +08:00:     at /home/node_modules/express/lib/router/index.js:284:7
0|CIA  | 2019-01-29 13:59 +08:00:     at Function.process_params (/home/node_modules/express/lib/router/index.js:335:12)
0|CIA  | 2019-01-29 13:59 +08:00:     at next (/home/node_modules/express/lib/router/index.js:275:10)
0|CIA  | 2019-01-29 13:59 +08:00:     at SessionStrategy.strategy.pass (/home/node_modules/passport/lib/middleware/authenticate.js:338:9)
0|CIA  | 2019-01-29 13:59 +08:00:     at SessionStrategy.authenticate (/home/node_modules/passport/lib/strategies/session.js:75:10)
0|CIA  | 2019-01-29 13:59 +08:00:     at attempt (/home/node_modules/passport/lib/middleware/authenticate.js:361:16)

however if i change the code to

const enforcer = await new Enforcer('keymatch_model.conf', 'keymatch_policy.csv');

the system will return

{"500":"Invalid enforcer"}

i don`t know where i am wrong

please help me

thanks

node is v11.6.0
npm is 6.6.0
express is 4.16.4
snowliy commented 5 years ago

Can you provide your app.js file?

bobpaul2612 commented 5 years ago

var express = require('express'),
    path = require('path'),
    favicon = require('static-favicon'),
    logger = require('morgan'),
    cookieParser = require('cookie-parser'),
    bodyParser = require('body-parser'),
    passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    index = require('./routes/index'),
    login = require('./routes/login'),
    register = require('./routes/register'),
    real_index = require('./routes/real_index'),
    rel = require('./routes/rel'),
    data_statistics = require('./routes/data_statistics'),
    data_query = require('./routes/data_query'),
    data_upload = require('./routes/data_upload'),
    data_download = require('./routes/data_download'),
    table_created = require('./routes/table_created'),
    table_search = require('./routes/table_search'),
    table_delete = require('./routes/table_delete'),
    dbroles = require('./routes/dbroles'),
    con = require('./models/mysql'),
    bcrypt = require('bcrypt'),
    session = require('express-session'),
    MySQLStore = require('express-mysql-session')(session),
    {
        Enforcer
    } = require('casbin'),
    authz = require('casbin-express-authz');

//=================================================================

con.connect(function (err) {
    if (err) {
        console.log('connection db error');
        return;
    }
    console.log('connecting db success');
})

//===============================================

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

//authenticate by passport =================================================
var options = {
    host: 'localhost',
    user: '',
    password: '',
    database: 'session_test'
};

var sessionStore = new MySQLStore(options);

// 目前 session 存在預設的 Memory中 , 將來可視需求將session 存至 MySQL server中.
app.use(session({
    key: 'NTCU CIA SYSTEM KEY',
    secret: "NTCU CIA SYSTEM",
    cookie: {
        maxAge: 60 * 1000 * 30
    }, // 60 * 1000 = 1 分鐘 , 30 min
    store: sessionStore,
    resave: true,
    saveUninitialized: true,
    rolling: true
}));

app.use(passport.initialize());
app.use(passport.session());

//==========================================================================
// casbin-express-authz test ===============================================

// set userinfo
app.use((req, res, next) => {
    // console.log('req.get = ' + req.get('Authorization'));
    const username = req.get('Authorization') || 'alex';
    req.user = {
        username
    };
    next();
});

// use authz middleware
/* jshint ignore:start */
app.use(authz(async () => {
    // load the casbin model and policy from files, database is also supported.
    const enforcer = await Enforcer.newEnforcer('./alex_model.conf', './alex_policy.csv');
    return enforcer;
}));
/* jshint ignore:end */

//response
app.use((req, res, next) => {
    res.status(200).json({
        status: 'OK'
    });
});

//==========================================================================
// bcrypt hash test ========================================================
// app.get('/hash', function (req, res) {
//     plaintext = '1234';
//     bcrypt.hash(plaintext, 10, function (err, hash) {
//         console.log('plaintest is :' + plaintext);
//         console.log(hash);
//         console.log("hash end");
//         bcrypt.compare(plaintext, hash, function (err, res) {
//             console.log("compare result is : " + res);
//         });
//     });
// });

//==========================================================================

// var acl = require('./models/acl_conf.js')(app, express);
// console.log(acl);

//路由 ======================================================================
app.use('/', index);
app.use('/login', login);
app.use('/register', register);
app.use('/real_index', real_index);
app.use('/rel', rel);
app.use('/data_statistics', data_statistics);
app.use('/data_query', data_query);
app.use('/data_upload', data_upload);
app.use('/data_download', data_download);
app.use('/table_created', table_created);
app.use('/table_search', table_search);
app.use('/table_delete', table_delete);
app.use('/dbroles', dbroles);
app.get('/logout', function (req, res) {
    req.logout();
    res.redirect('/');
});
app.get('/showtables', function (req, res) {
    if (req.isAuthenticated() || 1) {
        con.query("USE cia_db");
        var cmd = "show tables";
        con.query(cmd, function (err, result) {
            if (err) throw err;
            var tables_select = new Array();
            var i = 0
            result.forEach(function (table) {
                tables_select[i] = new Array();
                tables_select[i] = "<option>" + table.Tables_in_cia_db + "</option>";
                i++;
            });
            res.json({
                tables_select: tables_select
            });
        });
    } else {
        res.redirect('/login');
    }
});

/// catch 404 and forwarding to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function (err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

module.exports = app;
hsluoyz commented 5 years ago

@bobpaul2612 can you try the latest v1.0.1 release to see if it's fixed? https://www.npmjs.com/package/casbin-express-authz

bobpaul2612 commented 5 years ago

when i write like

const Enforcer = require('casbin')

this problem is slaved.

but if i write like

const  {Enforcer} = require('casbin')

the system will return

0|CIA  | 2019-01-29 21:10 +08:00: You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
0|CIA  | 2019-01-29 21:10 +08:00: TypeError: Enforcer.newEnforcer is not a function
0|CIA  | 2019-01-29 21:10 +08:00:     at app.use.authz (/home/ntcucia/CIA_DB/app.js:103:37)
0|CIA  | 2019-01-29 21:10 +08:00:     at /home/ntcucia/CIA_DB/node_modules/casbin-express-authz/authz.js:20:28
0|CIA  | 2019-01-29 21:10 +08:00:     at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
0|CIA  | 2019-01-29 21:10 +08:00:     at trim_prefix (/home/node_modules/express/lib/router/index.js:317:13)
0|CIA  | 2019-01-29 21:10 +08:00:     at /home/node_modules/express/lib/router/index.js:284:7
0|CIA  | 2019-01-29 21:10 +08:00:     at Function.process_params (/home/node_modules/express/lib/router/index.js:335:12)
0|CIA  | 2019-01-29 21:10 +08:00:     at next (/home/node_modules/express/lib/router/index.js:275:10)
0|CIA  | 2019-01-29 21:10 +08:00:     at app.use (/home/ntcucia/CIA_DB/app.js:96:5)
0|CIA  | 2019-01-29 21:10 +08:00:     at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
0|CIA  | 2019-01-29 21:10 +08:00:     at trim_prefix (/home/node_modules/express/lib/router/index.js:317:13)
0|CIA  | 2019-01-29 21:10 +08:00:     at /home/node_modules/express/lib/router/index.js:284:7
0|CIA  | 2019-01-29 21:10 +08:00:     at Function.process_params (/home/node_modules/express/lib/router/index.js:335:12)
0|CIA  | 2019-01-29 21:10 +08:00:     at next (/home/node_modules/express/lib/router/index.js:275:10)
0|CIA  | 2019-01-29 21:10 +08:00:     at SessionStrategy.strategy.pass (/home/node_modules/passport/lib/middleware/authenticate.js:338:9)
0|CIA  | 2019-01-29 21:10 +08:00:     at SessionStrategy.authenticate (/home/node_modules/passport/lib/strategies/session.js:75:10)
0|CIA  | 2019-01-29 21:10 +08:00:     at attempt (/home/node_modules/passport/lib/middleware/authenticate.js:361:16)

Thank you help me slave this problem.

hsluoyz commented 5 years ago

@bobpaul2612 Your error is:

TypeError: Enforcer.newEnforcer is not a function

This is because we have removed Enforcer.newEnforcer() in Node-Casbin 2.0.0, see: https://github.com/casbin/node-casbin/releases/tag/v2.0.0 , please use the new API.

bobpaul2612 commented 5 years ago

I know it now .

really thank you for your help !!!

hsluoyz commented 5 years ago

@bobpaul2612 if it has been fixed, please close this issue :)