我使用laravel new MyApp
启动了一个新的Laravel 5.2项目,并通过php artisan make:auth
添加了身份验证。这是一个仅限会员的网站,第一个用户是种子,并创建其余的(没有手动用户创建/密码重置/等)。
这些是我目前定义的路线:
Route::group(['middleware' => 'web'], function () {
// Authentication Routes...
Route::get( 'user/login', ['as' => 'user.login', 'uses' => 'Auth\AuthController@showLoginForm']);
Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\AuthController@login' ]);
Route::group(['middleware' => 'auth'], function() {
// Authenticated user routes
Route::get( '/', ['as'=>'home', 'uses'=> 'HomeController@index']);
Route::get( 'user/{uid?}', ['as' => 'user.profile', 'uses' => 'Auth\AuthController@profile' ]);
Route::get( 'user/logout', ['as' => 'user.logout', 'uses' => 'Auth\AuthController@logout' ]);
Route::get( '/user/add', ['as' => 'user.add', 'uses' => 'Auth\AuthController@showAddUser']);
[...]
});
});
我可以登录得很好,但是我遇到了一些非常"时髦的"行为 - 当我尝试注销时(通过工匠创建的内置logout
方法),该页面将302重定向到主页,我仍然登录。
更重要的是,虽然几乎所有页面(此处未列出)都按预期工作,但user.add也会为主页生成302。
请注意,主页作为$redirectTo
向AuthController声明,如果这有任何区别
我通过调试栏发现了重定向。想知道该找什么?
答案 0 :(得分:7)
经过几个小时的拔毛,我找到了答案 - 而且很傻。
问题是,路由user.profile
的路径为user/{uid?}
,并且路径user/logout
和user/add
都匹配。
它在其他人之前,没有正则表达式或类似的,它处理了路线。
我仍然不知道为什么为 页面生成了302,但发现将其从AuthController
移到UserController
(其中)它应该从一开始)修复行为。
因此,我(修改和工作)路线现在看起来像这样:
Route::group(['middleware' => 'web'], function () {
// Authentication Routes...
Route::get( 'user/login', ['as' => 'user.login', 'uses' => 'Auth\AuthController@showLoginForm']);
Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\AuthController@login' ]);
Route::group(['middleware' => 'auth'], function() {
// Authenticated user routes
Route::get( '/', ['as'=>'home', 'uses'=> 'HomeController@index']);
Route::get( '/home', ['as'=>'home', 'uses'=> 'HomeController@home']);
Route::get( 'user/logout', ['as' => 'user.logout', 'uses' => 'Auth\AuthController@logout' ]);
// *** Added /profile/ here to prevent matching with other routes ****
Route::get( 'user/profile/{uid?}', ['as' => 'user.profile', 'uses' => 'UserController@profile' ]);
Route::get( '/user/add', ['as' => 'user.add', 'uses' => 'UserController@showAddUser']);
[...]
});
});
答案 1 :(得分:7)
发布ajax请求时遇到302重定向问题。在这种情况下的解决方案是记住包括CSRF令牌。
请在此处查看Laravel 5.4文档:https://laravel.com/docs/5.4/csrf
答案 2 :(得分:1)
注销home
后可能是默认重定向页面,而您的home
路由似乎没有web
。在AuthController.php
use AuthenticatesAndRegistersUsers, ThrottlesLogins; // after this line
$redirectAfterLogout = 'login' // add this line
注销后,这会将您重定向到login
页面。如果您愿意,可以将其更改为任何路线。我以login
为例。
或强>
您可以在\vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
public function logout()
{
Auth::logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : 'login');
}
我将默认路线更改为login
。如果您的$redirectAfterLogout
中没有AuthController.php
,则会在此处查找重定向路径。我不建议人们在这里编辑,这是一种硬编码。
答案 3 :(得分:1)
我遇到了同样的问题,我通过添加带有accept:'application / json'的标题解决了它。而且我想我检查了源代码,在此之前它指示如果不添加它,则在使用auth中间件时可能会重定向。但是我不确定是否是这种情况,而且我不记得在哪里找到了。
答案 4 :(得分:0)
我遇到了这个问题,事实证明我有一条路线:在我的ajax控制器内重定向。 这没有任何意义,因为显然我们必须返回ajax,但我正在返回一条路线!
答案 5 :(得分:0)
我也曾在登录页面上遇到过此问题,该页面以前运行良好。因此,请考虑一下目录权限,结果如下:
drwxr-xr-x 7 user user 4096 Jun 27 2019 storage
因此,存储目录具有755权限,这意味着只有所有者才具有写访问权,由于该目录由“用户”拥有,因此其他用户(如laravel)无法写入该目录。
使用此cmd将目录更改为777可解决我的问题:
sudo chmod 777 -R PROJECT_PATH/storage
正确的方法
由于将该目录设置为全球可写状态不是正确的方法,因此请将该目录归apache所有,并将775设置为storage ..然后它又可以工作了。
sudo chown -R user:www-data PROJECT_PATH/storage
sudo chmod 775 -R PROJECT_PATH/storage
答案 6 :(得分:0)
对我来说,它是guest
中间件!
如果验证通过,此中间件会将用户重定向到首页。
您不必将其用于Api
请求。所以我将其删除,问题得以解决。
答案 7 :(得分:0)
我使用了很多ajax(获取和发布),每次响应时,我在服务器上使用session()->regenerate()
更新令牌,然后在客户端使用js更新每个令牌字段。
但是上周,我错误地删除了一个班轮功能。因此,突然在第二个呼叫之后,系统开始给出302响应。很难找到正在发生的事情,因为它有时(firstime)有效,有时却不起作用。
在意识到这是令牌不匹配之后,我努力了几天,试图找出原因,因为响应中没有指出令牌不匹配,只是重定向了302。
最后,我通过tokensMatch()
函数上的两个标记dd()找到了问题。我不知道为什么它不会触发TokenMismatch。
希望这个轶事对您有所帮助。
答案 8 :(得分:0)
对我来说,这就是我的控制器中的内容:
public function __construct()
{
$this->middleware('admin');
}
答案 9 :(得分:0)
对我来说是config / session.php
我在那里更改了一些生产应用程序的值,例如路径,安全性,same_site
但是由于http:// localhost在本地,安全会话未能创建任何cookie。
这就是为什么身份验证中间件重定向到状态为302的登录页面的原因
答案 10 :(得分:0)
如果您的网站不使用 HTTPS,则必须在 .env 中定义以下属性
SESSION_SAME_SITE=Strict
注意:此预防措施被某些浏览器用于防止网站用户被利用