anibalsanchez / security-jwt-service-provider_s2p3f5
Silex Security JWT 服务提供者,已升级至 Silex 2.2,Pimple 3 和 Firebase 5
2.5.1
2018-05-29 14:06 UTC
Requires
- firebase/php-jwt: ^5.0
- pimple/pimple: ^3.0
- silex/silex: ^2.2
- symfony/security: ~2.8|~3.0
README
此提供者主要基于 cnam/security-jwt-service-provider,但已将依赖更新至 Silex 2.2,Pimple 3 和 Firebase 5。
安装
composer require anibalsanchez/security-jwt-service-provider_s2p3f5
简单示例
初始化 silex 应用程序
require_once __DIR__ . '/../../vendor/autoload.php'; $app = new Silex\Application(['debug' => true]);
创建配置
为安全 JWT 添加配置
$app['security.jwt'] = [ 'secret_key' => 'Very_secret_key', 'life_time' => 86400, 'options' => [ 'username_claim' => 'name', // default name, option specifying claim containing username 'header_name' => 'X-Access-Token', // default null, option for usage normal oauth2 header 'token_prefix' => 'Bearer', ] ];
创建用户,任何实现 UserProviderInterface 接口的用户提供者
$app['users'] = function () use ($app) { $users = [ 'admin' => array( 'roles' => array('ROLE_ADMIN'), // raw password is foo 'password' => '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg==', 'enabled' => true ), ]; return new InMemoryUserProvider($users); };
为 silex 安全添加配置
$app['security.firewalls'] = array( 'login' => [ 'pattern' => 'login|register|oauth', 'anonymous' => true, ], 'secured' => array( 'pattern' => '^.*$', 'logout' => array('logout_path' => '/logout'), 'users' => $app['users'], 'jwt' => array( 'use_forward' => true, 'require_previous_session' => false, 'stateless' => true, ) ), );
注册 silex 提供者
$app->register(new Silex\Provider\SecurityServiceProvider()); $app->register(new Silex\Provider\SecurityJWTServiceProvider());
授权和请求受保护资源的示例
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\User; $app->post('/api/login', function(Request $request) use ($app){ $vars = json_decode($request->getContent(), true); try { if (empty($vars['_username']) || empty($vars['_password'])) { throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $vars['_username'])); } /** * @var $user User */ $user = $app['users']->loadUserByUsername($vars['_username']); if (! $app['security.encoder.digest']->isPasswordValid($user->getPassword(), $vars['_password'], '')) { throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $vars['_username'])); } else { $response = [ 'success' => true, 'token' => $app['security.jwt.encoder']->encode(['name' => $user->getUsername()]), ]; } } catch (UsernameNotFoundException $e) { $response = [ 'success' => false, 'error' => 'Invalid credentials', ]; } return $app->json($response, ($response['success'] == true ? Response::HTTP_OK : Response::HTTP_BAD_REQUEST)); }); $app->get('/api/protected_resource', function() use ($app){ return $app->json(['hello' => 'world']); }); $app->run();
完整示例在 tests/mock/app.php 目录中
并且 silex-security-jwt-provider 应正确工作于测试