繁体   English   中英

使用自定义角色访问被拒绝错误 Symfony

[英]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;
    }

因此,当isGrantedis_granted并且您的角色不以ROLE_时,默认投票者将弃权。

因此,要解决您的问题,您可以在 MODULE 角色前加上ROLE_ ,或者创建一个自定义投票器以在角色名称上更加灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM