37

私の最初の EmberJS アプリに取り組んでいます。アプリ全体では、ユーザーがログインする必要があります。私は、ユーザーが現在 (ページが最初に読み込まれたとき) および将来 (ユーザーがログアウトしたとき) にログインすることを強制する最良の方法に頭を悩ませようとしています。更新はありません)。

ユーザー認証フックを処理しました-現在、ユーザーの承認とユーザー「セッション」の作成(sessionStorageを使用)を処理する接続するember-dataモデルと関連ストアがあります。

どうすればよいかわからないのは、ルートルートでの最初の遷移を含め、ルート間を遷移するときにユーザーが認証されるようにすることです。このロジックをどこに配置しますか? 認証ステートマネージャーがある場合、それをルートにフックするにはどうすればよいですか? ルートルートの外側に認証ルートを設定する必要がありますか?

注: この質問の表現が不十分な場合や、より良い説明が必要な場合はお知らせください。喜んでお知らせします。

編集: おそらく面倒な実装ではありますが、もう少しエンバー風だと思うことをしました。現在のユーザーの認証キーと現在の状態を格納する auth statemanager があります。

何かが認証を必要とするときはいつでも、authmanager にそれを要求し、コールバック関数を渡して認証キーで実行します。ユーザーがログインしていない場合は、ログイン フォームを表示し、ユーザーがログインするまでコールバック関数を保留します。

これは、私が使用しているコードの一部を選択したものです。片付けが必要で、いくつかのものを残しました。http://gist.github.com/3741751

4

4 に答える 4

8

初期状態遷移の前にチェックを実行する必要がある場合は、Ember.Applicationクラスに と呼ばれる特別な関数がありdeferReadiness()ます。ソースコードからのコメント:

デフォルトでは、ブラウザーがDOMContentReadyイベントを発行すると、ルーターは現在の URL をアプリケーション状態に変換しようとし始めます。ルーティングを延期する必要がある場合は、アプリケーションのdeferReadiness()メソッドを呼び出すことができます。ルーティングを開始できるようになったら、advanceReadiness()メソッドを呼び出します。

執筆時点では、この関数はember-latestでのみ利用可能であることに注意してください

于 2012-10-08T14:15:26.053 に答える
3

ルート遷移間の認証の再チェックに関しては、次のenterおよびexitメソッドにフックを追加できEmber.Routeます。

var redirectToLogin = function(router){
    // Do your login check here.
    if (!App.loggedIn) {
        Ember.run.next(this, function(){
            if (router.currentState.name != "login") {
                router.transitionTo('root.login');
            }
        })
    }
};

// Define the routes.
App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        enter: redirectToLogin,
        login: Ember.Route.Extend({
            route: 'login',
            exit: redirectToLogin,
            connectOutlets: function(router){
                router.get('applicationController').connectOutlet('login');
            }
        }),
        ....
    })
});

このようなソリューションの問題は、Ember が実際に新しいルートに移行する (したがって、すべてのデータなどをロードする) 後、ログイン ルートに戻ることです。そのため、これ以上見られたくないアプリの一部が公開される可能性があります。ただし、実際には、そのデータはすべてメモリにロードされ、JavaScript コンソールを介してアクセスできるため、これはまともなソリューションだと思います。

また、Ember.Route.extend は新しいオブジェクトを返すため、独自のラッパーを作成してアプリ全体で再利用できることも覚えておいてください。

App.AuthenticatedRoute = Ember.Route.extend({
    enter: redirectToLogin
});
App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        index: App.AuthenticatedRoute.extend({
            ...
        })
    })
});

上記のソリューションを使用すると、認証するルートを正確に選ぶことができます。「ログイン画面に遷移しているかどうかを確認する」のチェックを外すこともできますredirectToLogin

于 2013-01-08T08:06:47.453 に答える
2

Ember.Session https://github.com/andrewreedy/ember-sessionというセッションと認証を管理するための非常にシンプルなパッケージをまとめました

于 2014-02-14T18:09:39.257 に答える
1

こちらもご覧ください: http://www.embercasts.com/

認証に関するスクリーンキャストが 2 つあります。

ありがとう。

于 2013-07-29T19:37:23.003 に答える