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:

ROLE_ADMIN のようなセキュリティ ロールに加えて、isGranted() メソッドと #[IsGranted()] 属性も Expression オブジェクトを受け入れます。
  • 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

6.2

The #[IsGranted()] attribute was introduced in Symfony 6.2.

#[IsGranted()] 属性は 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).

この例では、現在のユーザーが ROLE_ADMIN を持っている場合、または currentuser オブジェクトの isSuperAdmin() メソッドが true を返す場合、アクセスが許可されます (注: User オブジェクトに isSuperAdmin() メソッドがない場合があります。このメソッドはこの例のために考案されたものです)。

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() メソッドを使用するのと同じです。
is_remember_me() は IS_AUTHENTICATED_REMEMBERED のチェックとは異なります

The is_remember_me() and is_fully_authenticated() functions are similar to using IS_AUTHENTICATED_REMEMBERED and IS_AUTHENTICATED_FULLY with the isGranted() function - but they are not the same. The following controller snippet shows the difference:

is_remember_me() および is_fully_authenticated() 関数は、isGranted() 関数で IS_AUTHENTICATED_REMEMBERED および IS_AUTHENTICATED_FULLY を使用するのと似ていますが、同じではありません。次のコントローラー スニペットは、違いを示しています。
1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
// ...

public function index(AuthorizationCheckerInterface $authorizationChecker): Response
{
    $access1 = $authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED');

    $access2 = $authorizationChecker->isGranted(new Expression(
        'is_remember_me() or is_fully_authenticated()'
    ));
}

Here, $access1 and $access2 will be the same value. Unlike the behavior of IS_AUTHENTICATED_REMEMBERED and IS_AUTHENTICATED_FULLY, the is_remember_me() function only returns true if the user is authenticated via a remember-me cookie and is_fully_authenticated() only returns true if the user has actually logged in during this session (i.e. is full-fledged).

ここで、$access1 と $access2 は同じ値になります。 IS_AUTHENTICATED_REMEMBERED および IS_AUTHENTICATED_FULLY の動作とは異なり、is_remember_me() 関数は、ユーザーが me 記憶 Cookie を介して認証されている場合にのみ true を返し、is_fully_authenticated() は、ユーザーがこのセッション中に実際にログインした場合 (つまり、本格的にログインした場合) にのみ true を返します。

Learn more