跳至内容

控制器过滤器

提供的过滤器

注意

Shield 提供的 $aliases 过滤器会自动由位于 src/Config/Registrar.phpRegistrar 类添加。因此,您无需在 app/Config/Filters.php 中添加。

您可以使用 Shield 提供的 控制器过滤器 来保护路由

$aliases = [
    'session'     => \CodeIgniter\Shield\Filters\SessionAuth::class,
    'tokens'      => \CodeIgniter\Shield\Filters\TokenAuth::class,
    'hmac'        => \CodeIgniter\Shield\Filters\HmacAuth::class,
    'chain'       => \CodeIgniter\Shield\Filters\ChainAuth::class,
    'auth-rates'  => \CodeIgniter\Shield\Filters\AuthRates::class,
    'group'       => \CodeIgniter\Shield\Filters\GroupFilter::class,
    'permission'  => \CodeIgniter\Shield\Filters\PermissionFilter::class,
    'force-reset' => \CodeIgniter\Shield\Filters\ForcePasswordResetFilter::class,
    'jwt'         => \CodeIgniter\Shield\Filters\JWTAuth::class,
];
过滤器 说明
session 限制未通过 Session 身份验证器验证的用户的访问。
tokens 限制未通过 AccessTokens 身份验证器验证的用户的访问。
chained 该过滤器将按顺序检查身份验证器,以查看用户是否通过任一身份验证器登录,从而允许单个 API 端点同时适用于使用会话身份验证的 SPA 和使用访问令牌的移动应用程序。
jwt 限制未通过 JWT 身份验证器验证的用户的访问。请参阅 JWT 身份验证
hmac 限制未通过 HMAC 身份验证器验证的用户的访问。请参阅 HMAC 身份验证
auth-rates 为身份验证相关路由的速率限制提供了良好的基础。
group 检查用户是否属于传入的某个组。
permission 检查用户是否具有传入的权限。
force-reset 检查用户是否需要重置密码。

这些可以在任何 常规过滤器配置设置路由文件中 使用。

配置控制器过滤器

保护所有页面

如果您想限制所有路由(例如 localhost:8080/adminlocalhost:8080/panel 等),您需要在 app/Config/Filters.php 文件中添加以下代码。

public $globals = [
    'before' => [
        // ...
        'session' => ['except' => ['login*', 'register', 'auth/a/*', 'logout']],
    ],
    // ...
];

速率限制

为了帮助保护您的身份验证表单不被机器人发送垃圾邮件,建议您在所有身份验证路由上使用 auth-rates 过滤器。这可以通过以下过滤器设置来完成

public $filters = [
    'auth-rates' => [
        'before' => [
            'login*', 'register', 'auth/*'
        ]
    ]
];

强制重置密码

如果你的应用程序需要强制密码重置功能,确保从before全局中排除认证页面和实际的密码重置页面。这将确保你的用户不会遇到太多重定向错误。请参阅

public $globals = [
    'before' => [
        //...
        //...
        'force-reset' => ['except' => ['login*', 'register', 'auth/a/*', 'change-password', 'logout']]
    ]
];
在上面的示例中,假设你为用户创建的用于在成功登录后更改密码的页面是change-password

注意

如果你对路由进行了分组或更改了默认格式,确保你的代码与app/Config/Filter.php文件中的新格式匹配。

例如,如果你像这样配置了路由

$routes->group('accounts', static function($routes) {
    service('auth')->routes($routes);
});

那么session的全局before过滤器应该如下所示

public $globals = [
    'before' => [
        // ...
        'session' => ['except' => ['accounts/login*', 'accounts/register', 'accounts/auth/a/*', 'accounts/logout']]
    ]
]

速率限制和强制密码重置也应适用。