Using Expressions in Security Access Controls ¶
See also
The best solution for handling complex authorization rules is to use the Voter System.
In addition to security roles like ROLE_ADMIN
, the isGranted()
method
and #[IsGranted()]
attribute also accept an
Expression object:
-
Attributes
属性
-
PHP
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// src/Controller/MyController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpFoundation\Response;
class MyController extends AbstractController
{
#[IsGranted(new Expression(
'"ROLE_ADMIN" in role_names or (is_authenticated() and user.isSuperAdmin())'
))]
public function index(): Response
{
// ...
}
}
|
6.2
The #[IsGranted()]
attribute was introduced in Symfony 6.2.
In this example, if the current user has ROLE_ADMIN
or if the current
user object's isSuperAdmin()
method returns true
, then access will
be granted (note: your User object may not have an isSuperAdmin()
method,
that method is invented for this example).
This uses an expression and you can learn more about the expression language syntax, see The Expression Syntax.
Inside the expression, you have access to a number of variables:
user
-
An instance of UserInterface
that represents the current user or
null
if you're not authenticated.現在のユーザーを表す UserInterface のインスタンス、または認証されていない場合は null。 role_names
-
An array with the string representation of the roles the user has. This array
includes any roles granted indirectly via the role hierarchy but it
does not include the
IS_AUTHENTICATED_*
attributes (see the functions below).ユーザーが持つロールの文字列表現を含む配列。この配列には、ロール階層を介して間接的に付与されたすべてのロールが含まれますが、IS_AUTHENTICATED_* 属性は含まれません (以下の関数を参照)。 object
-
The object (if any) that's passed as the second argument to
isGranted()
.isGranted() の 2 番目の引数として渡されるオブジェクト (存在する場合)。 subject
-
It stores the same value as
object
, so they are equivalent.オブジェクトと同じ値を格納するため、同等です。 token
-
The token object.
トークン オブジェクト。
trust_resolver
-
The AuthenticationTrustResolverInterface,
object: you'll probably use the
is_*()
functions below instead.AuthenticationTrustResolverInterface,object: おそらく代わりに以下の is_*() 関数を使用します。
Additionally, you have access to a number of functions inside the expression:
is_authenticated()
-
Returns
true
if the user is authenticated via "remember-me" or authenticated "fully" - i.e. returns true if the user is "logged in".ユーザーが「remember-me」経由で認証されている場合、または「完全に」認証されている場合は true を返します。つまり、ユーザーが「ログイン」している場合は true を返します。 is_remember_me()
-
Similar, but not equal to
IS_AUTHENTICATED_REMEMBERED
, see below.IS_AUTHENTICATED_REMEMBERED と同様ですが、等しくはありません。以下を参照してください。 is_fully_authenticated()
-
Equal to checking if the user has the
IS_AUTHENTICATED_FULLY
role.ユーザーが IS_AUTHENTICATED_FULLY ロールを持っているかどうかを確認するのと同じです。 is_granted()
-
Checks if the user has the given permission. Optionally accepts a
second argument with the object where permission is checked on. It's
equivalent to using the isGranted() method
from the security service.
ユーザーが特定の権限を持っているかどうかを確認します。オプションで、権限がチェックされているオブジェクトで 2 番目の引数を受け入れます。これは、セキュリティ サービスの isGranted() メソッドを使用するのと同じです。
Learn more ¶
- How to Inject Values Based on Complex Expressions複雑な式に基づいて値を挿入する方法
- Expression表現