Laravel 4 登录验证问题
Posted
技术标签:
【中文标题】Laravel 4 登录验证问题【英文标题】:Laravel 4 login validation issue 【发布时间】:2013-08-05 15:15:00 【问题描述】:我在登录时遇到问题。即使没有发现验证错误,它也会转到我的 postIndex 方法中的 else 语句块,然后将我带回登录页面。关于问题是什么以及我需要更改什么来解决它的任何想法?
routes.php
<?php
Route::get('/', 'HomeController@getGuestIndex');
Route::controller('login', 'LoginController');
?>
HomeController.php
<?php
class HomeController extends BaseController
public function getGuestIndex()
return View::make('guests.index');
public function getAdminIndex()
return View::make('admin.index');
?>
登录控制器.php
<?php
class LoginController extends BaseController
public function getIndex()
// Check if we are already logged in.
if (Auth::check())
return Redirect::action('HomeController@getAdminIndex')
->with('message', 'You are already logged in');
return View::make('guests.login')
->with('title', 'Login');
public function postIndex()
// Get all the inputs
$user = array(
'username' => Input::get('username'),
'password' => Input::get('password')
);
$validation = User::validate($user);
if ($validation->passes())
// Try to log the user in.
if (Auth::attempt($user))
return Redirect::action('HomeController@getAdminIndex')
->with('message', 'You have logged in successfully');
return Redirect::to('login')
->withErrors($validation)
->withInput(Input::except('password'));
else
// Something went wrong.
return Redirect::back()
->withErrors($validation)
->withInput(Input::except('password'));
?>
BaseModel.php
<?php
class BaseModel extends Eloquent
public static function validate($inputs)
return Validator::make($inputs, static::$rules);
?>
用户.php
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends BaseModel implements UserInterface, RemindableInterface
protected $table = 'users';
protected $hidden = array('password');
protected static $rules = array(
'username' => 'required|alpha_dash|min:4',
'email' => 'required|email',
'password' => 'required|alpha_num|min:8|confirmed',
'password_confirmation' => 'required|alpha_num|min:8'
);
public function getAuthIdentifier()
return $this->getKey();
public function getAuthPassword()
return $this->password;
public function getReminderEmail()
return $this->email;
?>
login.blade.php
@extends('layouts.master')
@section('content')
<h2>Login into your account</h2>
Form::open(array('url' => 'login'))
<p>
Form::label('username', 'Username')
Form::text('username', Input::old('username'))
</p>
<p>
Form::label('password', 'Password')
Form::password('password')
</p>
<p>
Form::submit('Login')
</p>
Form::close()
<p> $errors->first('username') </p>
<p> $errors->first('password') </p>
@stop
【问题讨论】:
【参考方案1】:根据您的问题和示例脚本,验证失败。
问题可能出在基于模型的验证实现上。您正在使用注册规则验证登录。
一组验证规则并不适合所有情况。
如果您在 login.blade.php 中添加以下行,我想您会看到其他错误:
<p> $errors->first('email') </p>
<p> $errors->first('password_confirmation') </p>
要修复它,您需要更改模型上的验证规则,或更改验证实现。这两个优秀的教程展示了几种方法:
https://tutsplus.com/lesson/validation-services/
https://tutsplus.com/lesson/validating-with-models-and-event-listeners/
【讨论】:
谢谢。我假设它会自动跳过数组中不属于当前发布的表单字段的规则/字段。因此,如果我要使用模型和事件侦听器方法,我是否能够像我最初想要/假设的那样在模型中保留一组规则?我只是不想每次验证都重复规则 您可能需要为每种验证模式(登录、创建、更新)创建一组新规则。虽然并不完美,但我使用了第一个教程的变体。很难制作一个万能的验证系统。如果你想成为一个牛仔,你可以删除登录表单上的验证检查并坚持你现有的实现,尽管我不建议这样做。 我不知道你是否会认为这完全是牛仔,但这就是我最终要做的。正如您在我的用户模型中建议的那样,我为每种验证模式创建了不同的规则集。例如:$rules = array( 'email_reg' => 'required|email', 'password_reg' => 'required|min:8', 'email_login' => 'required', 'password_login' => 'required' )
然后在我的 BaseModel 验证方法中,我在我的规则数组上执行了一个 foreach 循环,并删除了所有未在我发布的表单中定义的规则集。 foreach (static::$rules as $field => $rule) if ( ! array_key_exists($field, $inputs)) unset(static::$rules[$field]);
这是一种有趣的方法,比删除登录验证要好。以上是关于Laravel 4 登录验证问题的主要内容,如果未能解决你的问题,请参考以下文章