我只是开始所以请原谅我。我对CodeIgniter有扎实的把握,所以我理解发生了什么。但是,我在创建表单时注意到我的CSRF令牌是空的。我正在通过laracasts视频来了解Laravel工作流程。
myfile.blade.php
{!! Form::open((array('action' => 'MyController@method'))) !!}
...
{{!! Form::close() !!}}
以下是我查看来源时的内容:
<form method="POST" action="http://mysite.dev/route" accept-charset="UTF-8">
<input name="_token" type="hidden">
</form>
我查看了config目录,但没有看到必须启用csrf。在我需要更新的地方是否有其他设置?
感谢您的建议。
修改
甚至这给了我一个空的隐藏输入字段:
{{ Form::token() }} // <input name="_token" type="hidden">
修改
以下是我的控制器的样子:
//use Illuminate\Http\Request;
use Request;
use App\Article;
use App\Http\Requests;
use App\Http\Controllers\Controller;
public function store(Request $request)
{
$input = Request::all();
return $input;
}
所以我更新的表单标签如下所示:
{!! Form::open((array('action' => 'ArticleController@store'))) !!}
...
当我提交时,我可以看到json响应 - 令牌显然是空的。
{"_token":"","title":"test","body":"test"}
答案 0 :(得分:26)
Laravel Fundamental系列适用于Laravel 5.0,因此您有几个选择。您可以安装Laravel 5.0以继续该系列。要安装L5.0,您需要运行以下命令:
composer create-project laravel/laravel {directory} "~5.0.0" --prefer-dist
如果您想使用Laravel 5.2(我建议使用,而且Jeffrey Way很可能很快就会发布这个系列),还有几件需要考虑的事情。
首先,将所有路由放在“web”中间件组中,如下所示:
Route::group(['middleware' => ['web']], function () {
// Put your routes inside here
});
过去,默认情况下,每个请求都运行了几个中间件。在5.2中,情况已不再如此。例如,令牌存储在会话中,但在5.2中,诸如“StartSession”中间件之类的东西不会自动应用。因此,需要将“Web”中间件应用于您的路由。这种变化的原因在于5.2:
中间件组允许您在一个方便的密钥下将多个路由中间件组合在一起,允许您一次为路由分配多个中间件。例如,在同一应用程序中构建Web UI和API时,这非常有用。您可以将会话和CSRF路由分组到
web
组,也可以将api
组中的速率限制器分组。
此外,在Laravel Fundamental系列中,Jeffrey引入了“illuminate / html”包,但现在,大多数人都使用了laravel集体包。他们处理了很多从核心中取出的Laravel软件包。结果,我会删除“illuminate / html”包。在composer.json
文件中,删除"illuminate/html: 5.0"
(或要求部分中的任何内容)。此外,删除您添加到config/app.php
文件中的相应服务提供商并形成外观。
要安装laravel集合版本,请将其添加到composer.json
文件中:"laravelcollective/html": "5.2.*-dev"
。然后,运行composer update
。完成后,在config/app.php
文件中,将其添加到您的提供者数组中:
Collective\Html\HtmlServiceProvider::class,
并将其添加到别名数组中:
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
我希望我不会错过任何其他内容。
答案 1 :(得分:2)
这是配置问题。您需要将配置文件...config/app.php
中的应用密钥设置为32个字符的字符串,或者使用artisan cli php artisan key:generate
生成密钥以便您能够使用CSRF令牌。
另外,请确保在web
组路由中包含使用CSRF令牌的路由。
您可以通过在默认的routes.php文件中包含的Web中间件组之外定义路由,或者通过将URI添加到VerifyCsrfToken中间件的$ except属性来排除URI:http://laravel.com/docs/5.2/routing#csrf-protection
答案 2 :(得分:1)
如果您有登录页面,并且想要使用以下方式清除会话:
// ConTransacciones.java
// Also tried with Throwable.class
@Transactional(rollbackFor=CustomError.class)
public class ConTransacciones {
public ArchivosEnDiscoRepo repositorio;
public void enTransaccion(Long id) throws CustomError {
repositorio.save(new ArchivoEnDisco(id, id + "A.txt"));
throw new CustomError();
}
}
// CustomError.java
public class CustomError extends Exception { }
// PruebasSinTransacciones.java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = GhcserviceapiApplication.class)
@WebAppConfiguration
public class PruebasSinTransacciones {
@Autowired
ArchivosEnDiscoRepo repositorio;
@Test
public void compruebaTransaccionSinVariable() {
ConTransacciones ct = new ConTransacciones();
ct.repositorio = this.repositorio;
Long id = repositorio.count() + 10l;
try {
ct.enTransaccion(id);
fail("Debería haberse lanzado una excepción");
} catch (Exception e) {
}
ArchivoEnDisco aedOriginal = repositorio.findOne(id);
assertThat("La transacción no debería haber guardado el archivo", aedOriginal, nullValue());
}
}
不要忘记这也会清除csrf令牌,然后才能将其放入视图中
答案 3 :(得分:0)
应该是
{!! Form::open((array('action' => 'MyController@method'))) !!}
...
{!! Form::close() !!}
答案 4 :(得分:0)
我已经解决了HtmlService提供程序的问题,实际上5.2版本删除了Illuminate并添加了集体按照步骤来解决问题:
composer require laravelcollective/html
composer update
'providers' => ['Collective\Html\HtmlServiceProvider'],
'aliases' => [
'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',
],
然后你就可以使用那个表格了。