[英]Access Denied Error Symfony with custom roles
早上好,我正在配置我的 symfony 5.4 api,我遇到了 symfony 的 is_granted function 问题。我连接的用户拥有令牌中的所有角色(经典角色 + 自定义角色)。 自定义角色链接到公司,公司的每个用户都继承公司的角色。
我在令牌中添加了所有角色,但是当我将 is_granted 放在 rest class 上时,访问被拒绝。 如果我忘记了什么,你能告诉我吗?
我的 REST class 和 is_granted function:
/**
* TrainingSession controller.
* @RouteResource("Training")
* @Security("is_granted('MODULE_TRAINING')")
*/
class TrainingSessionRESTController extends BaseRESTController
{
我的token对应的角色:
[▼
"ROLE_HR"
"ROLE_DEBUG"
"ROLE_PANEL"
"ROLE_USER"
"ROLE_MANAGER"
"MODULE_LIBRARY"
"MODULE_EXPENSE_REPORT"
"MODULE_TRAINING"
"MODULE_ANNUAL_REVIEW"
"MODULE_PRO_REVIEW"
"MODULE_COMPANY_CHART"
"MODULE_COMPANY_CONTACT"
"MODULE_COMPANY_DOCUMENT"
"MODULE_CALENDAR"
"MODULE_FOLDER"
"MODULE_TIME_MANAGEMENT"
"MODULE_EMPLOYEE_MEDICAL"
"MODULE_REPORT"
]
这是 class ExpressionLanguage.php 的供应商安全方法,它返回 false 而不是 True。 $expression 包含:“is_granted('MODULE_TRAINING')”。 并且 $values 确实包含 MODULE_TRAINING 角色。
/**
* Evaluate an expression.
*
* @param Expression|string $expression The expression to compile
*
* @return mixed
*/
public function evaluate($expression, array $values = [])
{
return $this->parse($expression, array_keys($values))->getNodes()->evaluate($this->functions, $values);
}
您可以尝试对以ROLE_
开头的角色执行相同的操作吗?
Symfony RoleVoter不适用于不以ROLE_
为前缀的角色
public function __construct(string $prefix = 'ROLE_')
{
$this->prefix = $prefix;
}
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
{
//...
foreach ($attributes as $attribute) {
if (!\is_string($attribute) || !str_starts_with($attribute, $this->prefix)) {
continue;
}
//...
}
return $result;
}
因此,当isGranted
或is_granted
并且您的角色不以ROLE_
时,默认投票者将弃权。
因此,要解决您的问题,您可以在 MODULE 角色前加上ROLE_
,或者创建一个自定义投票器以在角色名称上更加灵活。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.