ホームページ バックエンド開発 PHPチュートリアル Silex フレームワークを使用して Web サービスに認証を提供するにはどうすればよいですか?

Silex フレームワークを使用して Web サービスに認証を提供するにはどうすればよいですか?

Jun 03, 2023 am 08:21 AM
ウェブサービス 認証 silex

Silex は、PHP 言語をベースにした軽量の Web フレームワークで、Web 開発をよりシンプルかつ効率的に行うための一連のコンポーネントとツールを提供します。中でも認証は、Web サービスを構築する上で重要な要素の 1 つであり、許可されたユーザーのみがサービスにアクセスできるようにすることができます。 Silex フレームワークで認証を使用するには、いくつかの設定とコードの実装が必要ですが、この記事では、Silex フレームワークで認証を使用する方法を紹介します。

1. 基本的な考え方

Silex フレームワークでは、Symfony Security コンポーネントを使用して認証を実現できます。基本的なプロセスは次のとおりです。

  1. ユーザー名やパスワードなど、ユーザーから提供された ID 情報を取得します。
  2. 取得した身元情報を利用して身元認証を行い、認証に成功すると認証資格情報が生成されます。
  3. 後続のリクエストでのアクセス制御に認証資格情報を使用します。

2. 必要なコンポーネントをインストールする

Symfony Security コンポーネントを使用するには、Silex フレームワークに必要なコンポーネントをインストールする必要があります。Symfony Security コンポーネントとその他の依存コンポーネントは簡単にインストールできます。 Composer を通じてインストールされます。プロジェクトのルート ディレクトリにcomposer.json ファイルを作成し、次の内容を追加します。

{
    "require": {
        "silex/silex": "~2.0",
        "symfony/security": "^4.3"
    },
    "autoload": {
        "psr-4": { "": "src/" }
    }
}
ログイン後にコピー

次に、composer install コマンドを実行して、依存コンポーネントをインストールします。

3. 認証情報の構成

認証情報を構成するには、Silex フレームワークでセキュリティ サービスを定義し、このセキュリティ サービスの ID プロバイダーとユーザー プロバイダーを指定する必要があります。 ID プロバイダーは ID 情報の検証を担当し、ユーザー プロバイダーはユーザーの詳細を提供する責任を負います。単純な Web アプリケーションの場合、これら 2 つのサービスは同じ実装を使用できます。次のコードを app.php に追加します:

use SymfonyComponentSecurityCoreUserInMemoryUserProvider;
use SymfonyComponentSecurityCoreUserUser;
use SymfonyComponentSecurityCoreUserUserProviderInterface;

$app->register(new SilexProviderSecurityServiceProvider());

$app['security.firewalls'] = array(
    'secured' => array(
        'pattern' => '^/secured',
        'http' => true,
        'users' => function() use($app){
            return new InMemoryUserProvider(
                array(
                    'admin' => array('ROLE_USER', 'password')
                )
            );
        }
    )
);

$app['security.access_rules'] = array(
    array('^/secured', 'ROLE_USER')
);

$app['security.role_hierarchy'] = array(
    'ROLE_ADMIN' => array('ROLE_USER')
);

$app['security.user_provider'] = function($app) {
    return new UserProvider($app['db']);
};

$app['security.encoder.bcrypt'] = $app->share(function($app) {
    return new BCryptPasswordEncoder($app['security.encoder.bcrypt.cost']);
});

$app['security.authentication_listener.factory.form'] = $app->protect(function ($name, $options) use ($app) {
    $app['security.authentication_provider.'.$name.'.form'] = function () use ($app) {
        return new FormAuthenticationProvider(
            $app['security.user_provider'],
            $app['security.encoder_factory']
        );
    };
 
    $app['security.authentication_listener.'.$name.'.form'] = function () use ($app, $name, $options) {
        return new FormAuthenticationListener(
            $app['security'],
            $app['security.authentication_manager'],
            $name,
            $options,
            new UsernamePasswordFormAuthenticationEntryPoint(
                $app,
                $app['security.http_utils'],
                $name
            ),
            $app['logger'],
            $app['dispatcher'],
            $app['security.authentication.session_strategy']
        );
    };
 
    return array(
        'security.authentication_provider.'.$name.'.form',
        'security.authentication_listener.'.$name.'.form',
        null,
        'pre_auth'
    );
});
ログイン後にコピー

4. ユーザー プロバイダー (UserProvider) を作成します

ユーザー プロバイダーを作成するには、SymfonyComponentSecurityCoreUserUserProviderInterface インターフェイスを実装する必要があります。ユーザー情報の取得方法。 app.php で UserProvider を作成し、次のコードを追加します。

use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreExceptionUnsupportedUserException;

class UserProvider implements UserProviderInterface
{
    private $db;

    public function __construct(Connection $db)
    {
        $this->db = $db;
    }

    public function loadUserByUsername($username)
    {
        $stmt = $this->db->executeQuery('SELECT * FROM users WHERE username = ?', array(strtolower($username)));

        if (!$user = $stmt->fetch()) {
            throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
        }

        $rolesStmt = $this->db->executeQuery('SELECT roles.role FROM user_roles JOIN roles ON user_roles.role_id = roles.id WHERE user_id = ?', array($user['id']));
        $roles = array();
        while ($role = $rolesStmt->fetch(PDO::FETCH_ASSOC)) {
            $roles[] = $role['role'];
        }

        return new User($user['username'], $user['password'], explode(',', $user['roles']), true, true, true, true);
    }

    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof User) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        return $user;
    }

    public function supportsClass($class)
    {
        return $class === 'SymfonyComponentSecurityCoreUserUser';
    }
}
ログイン後にコピー

上記のコードでは、loadUserByUsername メソッドを使用して、ユーザー名とユーザーが所有するロール (役割) に基づいてユーザー情報をクエリします。 freshUser メソッドとsupportsClass メソッドは、インターフェイスの実装を実装する必要があります。

5. コントローラーの作成

Silex フレームワークでコントローラーを作成するには、ユーザーを ID 認証用のログイン ページに誘導するプライベート URL を定義する必要があります。認証が成功すると、ユーザーは元の要求された URL にアクティブにリダイレクトされます。認証に失敗した場合は、エラーメッセージが表示され、再認証を行うためのログインページが表示されます。

次のコードを app.php に追加します。

$app->match('/login', function(Request $request) use ($app){
        $username = $request->request->get('_username');
        $password = $request->request->get('_password');

        $user = $app['security.user_provider']->loadUserByUsername($username);

        if (!$app['security.encoder.bcrypt']->isPasswordValid($user->getPassword(), $password, $user->getSalt())) {
            throw new Exception('Bad credentials');
        } else {
            $token = new UsernamePasswordToken($user, null, 'secured', $user->getRoles());
            $app['security.token_storage']->setToken($token);
            $request->getSession()->set('_security_secured', serialize($token));
            return $app->redirect($request->headers->get('referer'));
        }
})->bind('login');

$app->match('/secured', function() use ($app){
        if (!$app['security.authorization_checker']->isGranted('ROLE_USER')){
            return $app->redirect('/login');
        }
 
        return 'Welcome ' . $app['security.token_storage']->getToken()->getUsername();
})->bind('secured');
ログイン後にコピー

上記のコードでは、/login ルートはプライベート URL であり、これによりユーザーは認証のためにユーザー名とパスワード情報を送信できます。 /secured ルートはアクセスが制限されたルートです。ユーザーが認証なしで /secured ルートにアクセスすると、ログイン ページにリダイレクトされます。

6. まとめ

上記の手順により、Silex フレームワークにユーザー ID 認証機能を実装しました。このプロセスでは、Symfony Security コンポーネントを使用して認証とユーザー プロバイダー機能を実装しましたが、同時に、完全な認証システムを実装するには構成情報、ユーザー プロバイダー、およびコントローラーを構成する必要があります。上記の紹介を通じて、Silex フレームワークに認証機能を実装する必要がある開発者に参考になれば幸いです。

以上がSilex フレームワークを使用して Web サービスに認証を提供するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Safari でプライベート ブラウジング認証を無効にする方法: iOS 17 のハウツー ガイド Safari でプライベート ブラウジング認証を無効にする方法: iOS 17 のハウツー ガイド Sep 11, 2023 pm 06:37 PM

iOS 17 では、Apple はモバイル オペレーティング システムにいくつかの新しいプライバシーおよびセキュリティ機能を導入しました。その 1 つは、Safari のプライベート ブラウジング タブに対して 2 段階認証を要求する機能です。その仕組みとオフにする方法は次のとおりです。 iOS 17 または iPadOS 17 を実行している iPhone または iPad で、Safari でプライベート ブラウズ タブを開いてからセッションまたはアプリを終了すると、Apple のブラウザでは再度アクセスするために Face ID/TouchID 認証またはパスコードが必要になります。言い換えれば、ロックが解除されている iPhone または iPad を誰かが手に入れても、パスコードを知らなければ閲覧することはできません。

PHP でシングル サインオンを実装する方法 PHP でシングル サインオンを実装する方法 Jun 11, 2023 pm 07:01 PM

シングル サインオン (SSO) は、ユーザーがユーザー名とパスワードなどの単一の資格情報セットを使用して、複数のアプリケーションおよびサイト間で認証できるようにする認証メカニズムです。このメカニズムにより、ユーザー エクスペリエンスと効率が向上すると同時に、セキュリティも強化されます。 PHP では、シングル サインオンを実装するには、いくつかの特定のメソッドが必要です。ここではPHPでシングルサインオンを実装する方法を紹介します。以下の手順に分けて説明します。 OAuth2を使用したユーザー認証センター(AuthenticationCenter)を作成します。

PHP と SOAP を使用して Web サービスの呼び出しと開発を実装する方法 PHP と SOAP を使用して Web サービスの呼び出しと開発を実装する方法 Jun 25, 2023 am 09:59 AM

Web 開発の分野では、Web サービスは、さまざまなアプリケーションが相互に通信して、より複雑で強力なシステムを構築できるようにする非常に重要なテクノロジです。この記事では、PHP と SOAP を使用して Web サービスの呼び出しと開発を実装する方法を詳しく説明します。 SOAP (SimpleObjectAccessProtocol) は、異なるアプリケーション間の情報交換に使用される XML ベースのプロトコルです。 SOAP は重要な Web サービス標準です

Slimフレームワークのミドルウェアを利用したユーザー認証の実装 Slimフレームワークのミドルウェアを利用したユーザー認証の実装 Jul 29, 2023 am 10:22 AM

Slim フレームワークのミドルウェアを使用したユーザー認証の実装 Web アプリケーションの開発では、ユーザー認証が重要な機能になっています。ユーザーの個人情報や機密データを保護するには、ユーザーの身元を確認するための信頼できる方法が必要です。この記事では、Slimフレームワークのミドルウェアを利用してユーザー認証を実装する方法を紹介します。 Slim フレームワークは、Web アプリケーションを簡単かつ迅速に構築する方法を提供する軽量の PHP フレームワークです。強力な機能の 1 つは中央です。

Angular と Node を使用したトークンベースの認証 Angular と Node を使用したトークンベースの認証 Sep 01, 2023 pm 02:01 PM

認証は、Web アプリケーションの最も重要な部分の 1 つです。このチュートリアルでは、トークンベースの認証システムと、それが従来のログイン システムとどのように異なるかについて説明します。このチュートリアルを終えると、Angular と Node.js で書かれた完全に動作するデモが表示されます。従来の認証システム トークンベースの認証システムに進む前に、従来の認証システムを見てみましょう。ユーザーはログイン フォームにユーザー名とパスワードを入力し、[ログイン] をクリックします。リクエストを行った後、データベースにクエリを実行してバックエンドでユーザーを認証します。リクエストが有効な場合、データベースから取得したユーザー情報を使用してセッションが作成され、セッション情報が応答ヘッダーで返され、セッション ID がブラウザに保存されます。対象となるアプリケーションへのアクセスを提供します。

Python スクリプト操作を使用して Linux サーバーに Web サービスを実装するための技術ガイド Python スクリプト操作を使用して Linux サーバーに Web サービスを実装するための技術ガイド Oct 05, 2023 am 11:42 AM

Python スクリプト操作を使用して Linux サーバーに Web サービスを実装するためのテクニカル ガイド 1. はじめに インターネットの急速な発展に伴い、Web サービスは多くの企業や個人にとって最初の選択肢になりました。 Python は、シンプルかつ強力なプログラミング言語として、Web 開発に広く使用されています。この記事では、Python スクリプトを使用して Linux サーバーに Web サービスを実装する方法を紹介し、具体的なコード例を示します。 2. 準備 始める前に、Python と

Web サービスの標準は何ですか? Web サービスの標準は何ですか? Nov 30, 2023 pm 05:45 PM

Web サービスには、「HTTP プロトコル」、「RESTful アーキテクチャ」、「データ交換形式」、「WSDL」、「SOAP」、「セキュリティ」、「スケーラビリティ」の 7 つの標準があります。 1. HTTP プロトコル、Web サービスの使用方法 HTTP プロトコル通信するため、HTTP プロトコルの仕様に従う必要があります; 2. スケーラブルで疎結合の Web サービスを構築するために使用される RESTful アーキテクチャ; 3. データを送信するために特定のデータ交換形式を使用します; 4. Web サービスを記述するために使用される WSDLインターフェースや操作性など。

Laravel 開発: Laravel Guard でユーザー認証を管理するにはどうすればよいですか? Laravel 開発: Laravel Guard でユーザー認証を管理するにはどうすればよいですか? Jun 13, 2023 pm 04:41 PM

Laravel開発: LaravelGuardでユーザー認証を管理するにはどうすればよいですか? Web アプリケーションでは、セキュリティとユーザー認証が非常に重要です。ビジネスが成長するにつれて、ユーザーの数も増加します。適切なユーザー認証スキームが実装されていないと、アプリケーションは悪意のある攻撃、データ漏洩、その他のセキュリティ問題を含むさまざまな攻撃に対して脆弱になる可能性があります。幸いなことに、Laravel フレームワークは、ユーザー認証を処理するためのシンプルかつ効果的な方法を提供します。この方法はGuと呼ばれます

See all articles