ThinkPHP提供了许多控制器层面的访问控制措施,在其中,最核心的是通过授权访问。开发者可以使用auth
方法来定义授权规则,例如:
use think\App;
use think\exception\HttpException;
class Base
{
protected $app;
public function __construct(App $app)
{
$this->app = $app;
}
protected function auth()
{
$controller = $this->app->request->controller();
$action = $this->app->request->action();
$ruleName = strtolower($controller) . "/" . strtolower($action);
if (! $this->app->user->can($ruleName)) {
throw new HttpException(403, 'Unauthorized access');
}
}
}
在这个例子中,auth()
方法检查当前访问的控制器和操作是否具有授权。如果没有,它将抛出一个HTTP异常并返回状态代码403。因此,开发者可以在每个需要授权的控制器中扩展此基类,以保证拥有相同的授权逻辑。
授权规则可以使用authManager
应用程序模块来定义。可以使用以下命令从控制台安装此模块:
composer require topthink/think-auth
接下来,开发者需要在应用程序的配置文件config/auth.php
中定义它们所需的授权规则。例如:
return [
'auth_on' => true,
'auth_provider' => 'basic',
'auth' => [
'admin/dashboard' => ['admin'],
'user/profile' => ['user'],
],
];
在上面的示例中,使用auth_on
变量开启授权检查。通过将auth_provider
设置为basic
,可以指定要使用的授权提供程序。
最后,通过在路由器配置中使用闭包,可以结合Auth
中间件对特定路由进行授权验证。例如:
use think\facade\Route;
use think\middleware\Auth;
Route::get('admin/dashboard', function () {
return "Welcome to admin dashboard";
})->middleware(Auth::class);
在这个例子中,访问/admin/dashboard
URI时,Auth中间件将自动调用控制器中的auth()
方法来确定请求是否具有适当的授权级别。