ホームページ バックエンド開発 PHPチュートリアル Laravel (5.1) および Ember.js (1.13.0) に基づくユーザー認証システム

Laravel (5.1) および Ember.js (1.13.0) に基づくユーザー認証システム

Jun 23, 2016 pm 01:28 PM

Laravel 自体は、PHP によって駆動されるマルチページアプリケーションの場合、完全なユーザー認証ソリューションを提供します。Laravel はユーザー認証の問題を完全に解決できます。しかし、SPA では、laravel は API サーバーに縮退し、ページのルーティングとフォームの送信はフロントエンド フレームワークによって完全に制御されます。この時点で、次の 2 つの問題に直面します:

フロントエンドでページのアクセス制御を実装する方法。

Ajax リクエストを承認するにはどうすればよいですか?


フロントエンドでページアクセス制御を実装するにはどうすればよいですか?

Ember.js 1.13.0 には認証機能がありません。ember-simple-auth というサードパーティの拡張機能を使用しました。これはその Github ホームページです:

https://github.com/simplabs/ember-simple-auth

まず、ember-cli プロジェクトのルート ディレクトリに拡張機能をインストールします:

ember install ember-cli-simple-auth
ログイン後にコピー

次に Configure でember/config/environment.js ファイルで、具体的な設定オプションについて詳しく説明しています。私の設定は次のとおりです。

// ember/config/environment.jsENV['simple-auth'] = {    authorizer: 'authorizer:custom'    //我使用了一个自定义的授权模块};
ログイン後にコピー

Ember-simple-auth は、Whenルートは特定のミックスインを継承し、その事前定義された動作または機能の一部を取得します。たとえば、私の ember/app/routes/application.js の内容は次のとおりです。

// ember/app/routes/application.js import ApplicationRouteMixin from 'simple-auth/mixins/application-route-mixin';export default Ember.Route.extend(ApplicationRouteMixin, {    actions: {        invalidateSession: function() {            this.get('session').invalidate();        }    }});
ログイン後にコピー

application-route-mixin には一連のアクション メソッドが事前定義されています。セッション上のイベントがトリガーされると、イベントを処理するために対応するアクションが呼び出されます。 ember/app/routes/application.js の独自のアクションでこれらのメソッドをオーバーライドすることもできます (ember-simple-auth は、フロントエンドによって生成されたすべての認証情報を保存する localStorage にセッション オブジェクトを維持します)。

次に、認証されたユーザーのみがアクセスできるページルートに、authenticated-route-mixin を追加します。

// ember/app/routes/user.js import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';export default Ember.Route.extend(AuthenticatedRouteMixin,{    model: function(params) {        return this.store.find('user',params.user_id);    }});
ログイン後にコピー

authenticated-route-mixin により、認証されたユーザーのみが /user にアクセスできるようになります。許可されていない場合、デフォルトのリダイレクトは /login になります。したがって、認証なしでパスにアクセスできるようにするには、 unauthenticated-route-mixin を ember/app/routes/login.js:

// ember/app/routes/login.js import UnauthenticatedRouteMixin from 'simple-auth/mixins/unauthenticated-route-mixin';export default Ember.Route.extend(UnauthenticatedRouteMixin);
ログイン後にコピー

unauthenticated-route-mixin に追加する必要があります。これは /login にとって適切です。


Ajax リクエストを承認するにはどうすればよいですか?

カスタム認証子: ember/app/authenticators/custom.js

// ember/app/authenticators/custom.jsimport Base from 'simple-auth/authenticators/base';export default Base.extend({    /**     * Check auth state of frontend     *     * @param data (传入session包含的数据)     * @returns {ES6Promise.Promise}     */    restore: function(data) {        return new Ember.RSVP.Promise(function(resolve, reject)        {            if ( data.is_login ){                resolve(data);            }            else{                reject();            }        });    },    /**     * Permission to login by frontend     *     * @param obj credentials     * @returns {ES6Promise.Promise}     */    authenticate: function(credentials) {        var authUrl = credentials.isLogin ? '/auth/login' : '/auth/register'        return new Ember.RSVP.Promise(function(resolve, reject) {            Ember.$.ajax({                url:  authUrl,                type: 'POST',                data: { email: credentials.identification, password: credentials.password }            }).then(function(response) {                if(response.login === 'success'){                    resolve({ is_login : true });                }            }, function(xhr, status, error) {                reject(xhr.responseText);            });        });    },    /**     * Permission to logout by frontend     *     * @returns {ES6Promise.Promise}     */    invalidate: function() {        return new Ember.RSVP.Promise(function(resolve) {            Ember.$.ajax({                url: '/auth/logout',                type: 'GET'            }).then(function(response) {                if(response.logout === 'success'){                    resolve();                }            });        });    }});
ログイン後にコピー

restore、authenticate、invalidate の 3 つの関数をそれぞれ認可の取得、認可、認可のキャンセルに使用します。

カスタムオーソライザー: ember/app/authorizers/custom.js

// ember/app/authorizers/custom.jsimport Base from 'simple-auth/authorizers/base';export default Base.extend({    authorize: function(jqXHR, requestOptions)    {        var _this = this;        Ember.$.ajaxSetup({            headers:            {                'X-XSRF-TOKEN': Ember.$.cookie('XSRF-TOKEN')    // 防止跨域攻击            },            complete : function(response, state)            {                // 检查服务器的授权状态                if(response.status===403 && _this.get('session').isAuthenticated)                  {                    _this.get('session').invalidate();                }            }        });    }});
ログイン後にコピー

authorize 関数は 2 つのことを行います:

各 ajax リクエストに 'X-XSRF-TOKEN' ヘッダーを追加します

サーバーが返す認証ステータスを確認し、処理

?? 具体的には: ??

ヘッダーの内容は、laravel によって設定された 'XSRF-TOKEN' Cookie の値です。Laravel はヘッダー ('X-XSRF -TOKEN') を読み取ろうとします。トークンの値が正当である場合、チェックに合格した場合、それは安全なリクエストとみなされます (この関数は laravel/app/Http/Middleware/VerifyCsrfToken.php に実装されています)。

次に、laravel で新しいミドルウェア (ミドルウェア) を作成し、VerifyAuth という名前を付けました。

<?php// laravel/app/Http/Middleware/VerifyAuth.phpnamespace App\Http\Middleware;use Closure;use Illuminate\Contracts\Auth\Guard;class VerifyAuth{    protected $include = ['api/*'];    // 需要做权限验证的 URL    protected $auth;    public function __construct(Guard $auth)    {        $this->auth = $auth;    }    /**     * Handle an incoming request.     *     * @param  \Illuminate\Http\Request  $request     * @param  \Closure  $next     * @abort  403     * @return  mixed     */    public function handle($request, Closure $next)    {        if( $this->shouldPassThrough($request) || $this->auth->check() )        {            return $next($request);        }        abort(403, 'Unauthorized action.');     //抛出异常,由前端捕捉并处理    }    /**     * Determine if the request has a URI that should pass through auth verification.     *     * @param  \Illuminate\Http\Request  $request     * @return bool     */    protected function shouldPassThrough($request)    {        foreach ($this->include as $include) {            if ($request->is($include)) {                return false;            }        }        return true;    }}
ログイン後にコピー

AUTH リクエストは権限操作であるため、API リクエストの権限検証のみを行います。その他のリクエストは、フロントエンドを無効なリクエストとして認識しないと、エラーがスローされます。リクエストが承認されていない場合、サーバーは 403 エラーをスローして、ユーザーがログインまたは登録する必要があることをフロントエンドに通知します。

最後に、すべての認可ロジックをlaravelappHttpControllersAuthAuthController.phpに実装します:

<?phpnamespace App\Http\Controllers\Auth;use App\User;use Validator;use Response;use Auth;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Illuminate\Foundation\Auth\ThrottlesLogins;use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;class AuthController extends Controller{    use AuthenticatesAndRegistersUsers, ThrottlesLogins;    protected $remember = true;    // 是否长期记住已登录的用户    public function __construct()    {        $this->middleware('guest', ['except' => 'getLogout']);    }    public function postLogin(Request $credentials)    // 登录    {        return $this->logUserIn($credentials);    }    public function getLogout()    // 登出    {        Auth::logout();        return Response::json(['logout'=>'success']);    }    public function postRegister(Request $credentials)    // 创建并注册新用户    {        $newUser = new User;            $newUser->email = $credentials['email'];        $newUser->password = bcrypt($credentials['password']);            $newUser->save();            return $this->logUserIn($credentials);    }            protected function logUserIn(Request $credentials)    // 实现用户登录    {        $loginData = ['email' => $credentials['email'], 'password' => $credentials['password']];            if ( Auth::attempt($loginData, $this->remember) )        {            return Response::json(['login'=>'success']);        }        else        {            return Response::json(['login'=>'failed']);        }    }}
ログイン後にコピー


概要

ページアクセス許可を設定すると、権限のないユーザーが自分に属していないページにアクセスするのを防ぐことができますが、最終的にはフロントend はユーザーに完全に公開されるため、ユーザーの承認ステータスはサーバーによって維持される必要があります。一方では、フロントエンドは各 ajax リクエストに対するクロスドメイン攻撃を防ぐためにトークンを追加します。他方では、各リクエストが返されると、http ステータス コードが 403 パーミッション エラーであるかどうかを確認し、そうである場合はリダイレクトします。ログイン ページにアクセスして、ユーザーに承認の取得を要求します。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles