php – Silex:获取防火墙外路由的经过身份验证的用户信息
作者:互联网
我正在使用Silex 2.0(我知道 – 它的开发版本尚未完全发布)以及CNAM的JWT安全提供程序(请参阅:https://github.com/cnam/security-jwt-service-provider)为我正在编写的开源应用程序编写API.
简而言之,我关心的用户有三种类型:
>具有完全访问权限的全站点管理员(ROLE_ADMIN)
>委员(ROLE_COMMISH)谁创建他们拥有的对象,并可以编辑自己的对象
>访问只读信息的匿名用户.
因此,有三个路段与这些“角色”一起:
> / admin / *管理员可以执行他们的超级行动
> / commish / *委员或管理员可以对其对象执行操作
> / *所有用户都可以阅读信息
我遇到的问题是,虽然我可以设置3个防火墙,每个防火墙一个,但在第3个路由类别(例如GET / object / 1)中有时需要匿名访问,但如果是用户提供了一个有效的JWT令牌,我需要访问该用户,以便对我在响应中返回的数据执行一些额外的逻辑.
正如我现在设置的那样(更多在我的配置下面),它是全有或全无:我要么将整个防火墙限制为只有具有某个角色的经过身份验证的用户,要么我将其打开给匿名用户(因此无法查看用户)信息).
是否有可能有任何人可以击中的路线,但也可以看到登录用户?
目前的安全配置:
$app['users'] = function () use ($app) {
return new UserProvider($app);
};
$app['security.jwt'] = [
'secret_key' => AUTH_KEY,
'life_time' => 86400,
'algorithm' => ['HS256'],
'options' => [
'header_name' => 'X-Access-Token'
]
];
$app['security.firewalls'] = array(
'login' => [
'pattern' => 'login|register|verify|lostPassword|resetPassword',
'anonymous' => true,
],
'admin' => array(
'pattern' => '^/admin',
'logout' => array('logout_path' => '/logout'),
'users' => $app['users'],
'jwt' => array(
'use_forward' => true,
'require_previous_session' => false,
'stateless' => true,
)
),
'commish' => array(
'pattern' => '^/commish',
'logout' => array('logout_path' => '/logout'),
'users' => $app['users'],
'jwt' => array(
'use_forward' => true,
'require_previous_session' => false,
'stateless' => true,
)
)
);
$app['security.role_hierarchy'] = array(
'ROLE_ADMIN' => array('ROLE_MANAGER'),
);
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->register(new Silex\Provider\SecurityJWTServiceProvider());
此外,我尝试了另一种方法,我匹配单个防火墙下的所有路由,但然后使用securty.access_rules配置保护某些路由,但它不起作用.我尝试过的一个例子:
$app['security.firewalls'] = array(
'api' => array(
'pattern' => '^/',
'logout' => array('logout_path' => '/logout'),
'anonymous' => true,
'jwt' => array(
'use_forward' => true,
'require_previous_session' => false,
'stateless' => true
)
)
);
$app['security.access_rules'] = array(
array('^/admin', 'ROLE_ADMIN'),
array('^/commish', 'ROLE_MANAGER'),
array('^/', 'IS_AUTHENTICATED_ANONYMOUSLY')
);
解决方法:
您可以使用$app [‘security.jwt.encoder’]解码jwt并创建自定义trait并扩展路由对象或在路由级别使用midddleware或更简单的方法是在应用程序级别使用中间件.我有类似的问题,这就是我解决它的方式,如下所示
恩.
$app->before(function (Request $request, Application $app) {
$request->decodedJWT = $app['security.jwt.encoder']->
decode($request->headers->get('X-Access-Token'));
});
这样你就可以通过任何路径访问解码的jwt格式
$app->get('/object/1', function(Request $request) {
$decodedJWT = $request->decodedJWT;
// do whatever logic you need here
})
标签:silex,php,symfony,security,jwt 来源: https://codeday.me/bug/20190725/1527839.html