Silex は、PHP 言語をベースにした軽量の Web フレームワークで、Web 開発をよりシンプルかつ効率的に行うための一連のコンポーネントとツールを提供します。中でも認証は、Web サービスを構築する上で重要な要素の 1 つであり、許可されたユーザーのみがサービスにアクセスできるようにすることができます。 Silex フレームワークで認証を使用するには、いくつかの設定とコードの実装が必要ですが、この記事では、Silex フレームワークで認証を使用する方法を紹介します。
1. 基本的な考え方
Silex フレームワークでは、Symfony Security コンポーネントを使用して認証を実現できます。基本的なプロセスは次のとおりです。
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 サイトの他の関連記事を参照してください。