【发布时间】:2026-01-17 11:00:01
【问题描述】:
我正在使用 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')
);
【问题讨论】:
标签: php security symfony silex jwt