2013-03-15 15 views
5

Desidero implementare l'autenticazione e l'autorizzazione nello stack Flatiron (utilizzando Flatiron, Ricco e Riposo). Voglio richiedere che un utente abbia i permessi necessari, quando provi a cambiare una risorsa. Nel file Readme riposante, c'è un note about authorization:Autenticazione e autorizzazione con Flatiron's Resourceful & Restful

Ci sono diversi modi per garantire la sicurezza e l'autorizzazione per metodi di risorse che accede a vista con riposante. Il modello consigliato per l'autorizzazione consiste nell'utilizzare l'abilità di risorse per gli hook e after. In questi hook, è possibile aggiungere ulteriore business logic per limitare l'accesso ai metodi della risorsa.

E 'Non consigliato di inserire la logica di autorizzazione nel instradamento livello, come in un mondo ideale il router sarà un'interfaccia riflesso della risorsa. In teoria, la sicurezza del router stesso dovrebbe essere un po 'irrilevante in quanto la risorsa potrebbe avere più interfacce riflesse che richiedevano tutte la stessa logica aziendale.

TL; DR; Per sicurezza e autorizzazione, è necessario utilizzare gli hook resourceful before e after.

Quindi l'autorizzazione può essere gestita dal sistema di aggancio di Resourceful.

Il mio problema reale è il processo di autenticazione all'inizio di ogni richiesta HTTP.

Diciamo che ho una risorsa Post, una User e una risorsa Session. L'API REST viene definita utilizzando Restful. La mia preoccupazione principale per questa domanda è garantire che un utente abbia una sessione durante la creazione di un post. Altri metodi come save, update o altre risorse come la creazione di un utente dovrebbero funzionare in modo analogo.

File app.js:

var flatiron = require('flatiron'); 
var app = flatiron.app; 

app.resources = require('./resources.js'); 

app.use(flatiron.plugins.http); 
app.use(restful); 
app.start(8080, function(){ 
    console.log('http server started on port 8080'); 
}); 

File resources.js:

var resourceful = require('resourceful'); 

var resources = exports; 

resources.User = resourceful.define('user', function() { 
    this.restful = true; 
    this.string('name'); 
    this.string('password'); 
}); 

resources.Session = resourceful.define('session', function() { 
    // note: this is not restful 
    this.use('memory'); 
    this.string('session_id'); 
}); 

resources.Post = resourceful.define('post', function() { 
    this.restful = true; 
    this.use('memory'); 
    this.string('title'); 
    this.string('content'); 
}); 

resources.Post.before('create', function authorization(post, callback) { 
    // What should happen here? 
    // How do I ensure, a user has a session id? 

    callback(); 
}); 

C'è anche un runnable version of the code (grazie @generalhenry).

Supponiamo quindi che un utente che sta tentando di creare un post abbia già ricevuto un ID di sessione, che viene inviato con ogni richiesta effettuata da un'intestazione del cookie. Come posso accedere a quel cookie nel gancio precedente (ad esempio la richiamata authorization)?

L'esempio può essere avviato con node app.js e richieste HTTP può essere effettuato utilizzando curl.

+2

Ho realizzato una versione runnable http://runnable.com/UUvAOjW8r6IwAAuN – generalhenry

+0

@generalhenry Grazie! Quindi giochiamo con questo. – pvorb

risposta

4

Tenere presente che queste linee guida sono per il processo di autorizzazione. Se è necessario utilizzare sessionId, è possibile accedervi in ​​entrambi i modi: req.sessionID, req.cookies["connect.sid"].

Controllando le richieste in questo modo sarete sicuri che ogni utente abbia un ID di sessione valido.

app.use(flatiron.plugins.http, { 
    before: [ 
    connect.favicon(), 
    connect.cookieParser('catpsy speeds'), 
    function(req, res) { 
     if (req.originalUrl === undefined) { 
     req.originalUrl = req.url; 
     } 
     res.emit('next'); 
    }, 
    connect.session({secret : 'secter'}), 
    function(req, res) { 
     console.log('Authenticating...'); 
     console.dir(req.session); 
     //any other validation logic 
     if (req.url !== '/login' && typeof req.session.user == 'undefined') { 
     res.redirect('/login'); 
     } else { 
     res.emit('next'); 
     } 
    } 
    ] 
}); 

Ecco project example utilizzando questo approccio.

+1

Grazie per questo esempio. È molto utile Non sono al lavoro, quindi non posso provarlo immediatamente, ma sembra promettente, anche se richiede 'connect' che non sto attualmente utilizzando. Ma penso di poter calcolare ciò che fa. A proposito, ho migliorato il rientro, quindi è più leggibile e non penso che 'val === undefined' sia una buona pratica, quindi l'ho cambiato in' typeof val == 'undefined''. – pvorb

+0

Non ne sono sicuro. Scopri le best practice per il progetto jquery su http://contribute.jquery.org/style-guide/js/?rdfrom=http%3A%2F%2Fdocs.jquery.com%2Fmw%2Findex.php%3Ftitle%3DJQuery_Core_Style_Guidelines%26redirect % 3Dno point 4 e 5. –

+0

Continuo a pensare che 'typeof val == 'undefined'' sia migliore, ma ok. – pvorb

Problemi correlati