使用Form :: open()时,为什么我的CSRF令牌为空?

时间:2015-12-22 19:04:40

标签: laravel csrf

只是开始所以请原谅我。我对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"}

5 个答案:

答案 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并添加了集体按照步骤来解决问题:

  1. composer require laravelcollective/html
  2. composer update
  3. 添加config / app.php
  4. 'providers' => ['Collective\Html\HtmlServiceProvider'], 'aliases' => [ 'Form' => 'Collective\Html\FormFacade', 'Html' => 'Collective\Html\HtmlFacade', ],

    然后你就可以使用那个表格了。