Laravel学习记录(五):CSRF保护和控制器

这一篇主要是对CSRF保护和控制器写的,主要是控制器的内容比较多。

CSRF保护

简述

提交表单都要在表单内容里加一个@csrf来保证安全性,防止CSRF(跨站请求伪造攻击)发生,它借助已验证的用户身份来运行未经过授权的命令。

加上之后,默认使用的CSRF防护中间件会自动验证请求里的令牌是否和存储在会话里的令牌匹配。

添加CSRF白名单

部分URL不需要CSRF保护,像是集成第三方收费管理API,对方的网址也没有办法发送CSRF令牌,可以在中间件文件里配置$except来忽略掉相关的URL。

控制器

用来替代在路由文件中以闭包形式定义的所有请求处理逻辑,简单来说就是对URI的处理函数,将这些控制逻辑组织成控制类,就是控制器。

定义一个指向控制器行为的路由是这样的:

use App\Http\Controllers\UserController;

Route::get('user/{id}', [UserController::class, 'show']);

//还有另一种写法

Route::get('user/{id}','UserController@show');

一般来说控制器可以直接生成,生成的框架是继承Controller基类的,当然不继承也行,但是少了基类的像是中间件和验证等方法的使用。

只处理单个行为的控制器,因为只有一个方法,所以可以直接指明方法叫__invoke,路由调用的时候也不需要指名方法,直接写控制器类名就行。

控制器中间件

上面说过可以在路由界面指定中间件,但是更方便的方法是在控制器的构造方法里指定中间件,这样还可以使用指定范围,像是只对某几个方法生效,除去几个方法生效等:

class UserController extends Controller
{
    /**
     * 实例化一个新的控制器实例
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log')->only('index');

        $this->middleware('subscribed')->except('store');
    }
}

这样的话甚至可以直接写一个闭包函数来注册中间件,虽然感觉不规整。

资源型控制器

资源路由只要一行代码就可以把常用的CRUD(增删改查)路由交给控制器。生成资源型控制器的命令是php artisan make:controller PhotoController --resource。这样生成的控制器会有上面提到的方法。

再使用命令来给控制器注册一个对应的方法的路由:

Route::resource('photos', PhotoController::class);
//还可以写成这样
Route::resource('photos','PhotoController');

甚至可以一次给资源型路由传入多个键值对来注册多个资源控制器。

可以使用only()、except()来限定生成的路由,毕竟不是每个路由都要用。

自己针对模型要自定义的路由要放在资源型路由的前边,顺序决定优先级。

路由缓存

在只使用了基于路由的控制器下,进行路由缓存可以提高路由访问速度,应用也会更快。

php artisan route:cache
php artisan route:clear

上一句进行缓存,下一句清理缓存,每次添加新路由记得重新生成缓存。

总结

CSRF部分比较少,但是控制器部分有个依赖注入和方法注入,看不懂。