2013-03-15 16 views
5

Flatironスタックで認証と認可を実装したい(Flatiron、Resourceful、Restfulを使用)。私は、リソースを変更しようとするときに、ユーザーに必要な権限があることを要求したい。 RESTfulなReadmeファイルでは、note about authorizationがあります:Flatironの認証と認可リソースが豊富で安心して

安らかにさらさ アクセスするリソースメソッドのセキュリティと許可を提供するために、いくつかの方法があります。推奨される 承認パターンは、beforeafterフックのために冗長な機能を使用することです。これらのフックでは、ビジネスロジック を追加して、リソースのメソッドへのアクセスを制限することができます。

ないは理想の世界のように、ルータは、リソースの反映インタフェース なり、ルーティング 層に承認ロジックを配置することをお勧めします。理論的には、ルータ自体のセキュリティは とは多少関係がありません。なぜなら、リソースには同じビジネスロジックを必要とする 反射インターフェイスが複数ある可能性があるからです。

TL; DR;セキュリティと承認のために、手の込んだ、 beforeafterフックを使用する必要があります。

したがって、認可は、リソースフルのフックシステムで処理できます。

私の実際の問題は、すべてのHTTPリクエストの開始時の認証プロセスです。

私はリソースがPostUser、リソースがSessionであるとします。 REST APIは、Restfulを使用して定義されています。この質問に対する私の主な関心事は、投稿を作成するときにセッションがあることを確認することです。 save,updateなどの他の方法や、ユーザーを作成するなどの他の方法についても、同様に動作するはずです。

ファイル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'); 
}); 

ファイル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(); 
}); 

runnable version of the code(感謝@generalhenry)もあります。

投稿を作成しようとしているユーザーがすでにセッションIDを与えられていると仮定し、Cookieヘッダーによってリクエストが送信されるたびに送信されます。前のフックでそのCookieにアクセスするにはどうすればよいですか(つまり、authorizationコールバック)?

例はnode app.jsで開始でき、HTTP要求はcurlを使用して行うことができます。

+2

私は実行可能なバージョンを作ったhttp://runnable.com/UUvAOjW8r6IwAAuN – generalhenry

+0

@generalhenryありがとう!だからこれで遊ぼう。 – pvorb

答えて

4

これらのガイドラインは承認手続きのためのものです。 sessionIdを使用する必要がある場合は、req.sessionIDreq.cookies["connect.sid"]のいずれかの方法でアクセスできます。

このようにリクエストをチェックすると、すべてのユーザーに有効なセッションIDが割り当てられます。ここで

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'); 
     } 
    } 
    ] 
}); 

は、このアプローチを使用してproject exampleです。

+1

ありがとうございます。非常に役に立ちます。私は仕事中ではないのですぐに試すことはできませんが、現在は使用していない 'connect'が必要ですが、有望です。しかし、私はそれが何をしているのかを考えることができると思う。ところで、私はインデントを改善しました。読みやすいし、 'val === undefined'が良い習慣だとは思わないので、' typeof val == 'undefined'に変更しました。 – pvorb

+0

私はそれについては分かりません。 jqueryプロジェクトのベストプラクティスは、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 and 5。 –

+0

私はまだ 'typeof val == 'undefined''は良いと思っていますが、大丈夫です。 – pvorb

関連する問題