Mat*_*abe 3 php security symfony jwt 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());
Run Code Online (Sandbox Code Playgroud)
此外,我尝试了另一种方法,我匹配单个防火墙下的所有路由,但然后通过使用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')
);
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以使用$ app ['security.jwt.encoder']来解码jwt并创建自定义特征并扩展路由对象或在路由级别使用midddleware或者更简单的方法是在应用程序级别使用中间件.我有类似的问题,这就是我解决它的方式,如下所示
恩.
$app->before(function (Request $request, Application $app) {
$request->decodedJWT = $app['security.jwt.encoder']->
decode($request->headers->get('X-Access-Token'));
});
Run Code Online (Sandbox Code Playgroud)
这样你就可以通过任何路径访问解码的jwt格式
$app->get('/object/1', function(Request $request) {
$decodedJWT = $request->decodedJWT;
// do whatever logic you need here
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2022 次 |
| 最近记录: |