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' =&gt; 'required|email', 'password_reg' =&gt; 'required|min:8', 'email_login' =&gt; 'required', 'password_login' =&gt; 'required' ) 然后在我的 BaseModel 验证方法中,我在我的规则数组上执行了一个 foreach 循环,并删除了所有未在我发布的表单中定义的规则集。 foreach (static::$rules as $field =&gt; $rule) if ( ! array_key_exists($field, $inputs)) unset(static::$rules[$field]); 这是一种有趣的方法,比删除登录验证要好。

以上是关于Laravel 4 登录验证问题的主要内容,如果未能解决你的问题,请参考以下文章

laravel 4.2 如何检查是不是有用户登录多重身份验证

vue token 登录验证 Laravel

Laravel 4 身份验证注销错误

Laravel登录验证碰到的坑 哈希验证匹配问题

Laravel 验证登录表单验证在密码确认中失败?

Laravel 验证登录