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

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 までご連絡ください。
PHPの目的:動的なWebサイトの構築PHPの目的:動的なWebサイトの構築Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHP:データベースとサーバー側のロジックの処理PHP:データベースとサーバー側のロジックの処理Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO)PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO)Apr 15, 2025 am 12:15 AM

PHPで前処理ステートメントとPDOを使用すると、SQL注入攻撃を効果的に防ぐことができます。 1)PDOを使用してデータベースに接続し、エラーモードを設定します。 2)準備方法を使用して前処理ステートメントを作成し、プレースホルダーを使用してデータを渡し、メソッドを実行します。 3)結果のクエリを処理し、コードのセキュリティとパフォーマンスを確保します。

PHPおよびPython:コードの例と比較PHPおよびPython:コードの例と比較Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

アクション中のPHP:実際の例とアプリケーションアクション中のPHP:実際の例とアプリケーションApr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP:インタラクティブなWebコンテンツを簡単に作成しますPHP:インタラクティブなWebコンテンツを簡単に作成しますApr 14, 2025 am 12:15 AM

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPython:2つの一般的なプログラミング言語を比較しますPHPとPython:2つの一般的なプログラミング言語を比較しますApr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの永続的な関連性:それはまだ生きていますか?PHPの永続的な関連性:それはまだ生きていますか?Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、