在AuthController中覆盖laravel的5.2身份验证方法

时间:2016-06-10 14:50:30

标签: php laravel authentication laravel-5 laravel-5.2

我对拉威尔来说仍然非常愚蠢,所以我无法弄清楚如何做到这一点: 我被困在登录系统中。我试图了解如何阻止非活动用户使用该应用程序。

修改

对于非活动用户,我指的是那些拥有记录字段并且处于活动状态的用户。因此,我需要实施一个检查,以验证邮件和密码以及活动字段

我已经制作了表格和auth系统,并且如文档中所述,我已将此方法放在我的AuthController中:

public function authenticate()
{
   dd('hi');
}

它完全被忽略了。似乎它永远不会被触发。我错过了什么吗?

我的控制器看起来像原来的Laravel的5.2 AuthController,除了之前的方法。没有进行任何其他更改,因为根据文档没有提到其他更改...

我的测试:

我还搜索了一个名为authenticate的方法。但没有找到的方法(使用php风暴)。所以我的问题是:

如果它是一个特质,是不是应该宣布该方法?所以我只是通过声明一个具有相同名称的方法来覆盖它?

重要文件:

routes.php文件

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
Route::get('/', 'HomeController@index');

Route::auth();

Route::get('/home', 'HomeController@index');

4 个答案:

答案 0 :(得分:1)

首先,您需要删除Auth路由,但在终端之前运行php artisan route:list。复制与auth相关的路由并将它们粘贴在路径文件中。

更改每个路径中的控制器,使其指向您应用程序中自己的AuthController。

接下来,在控制器(页面顶部)加上2个类中包含以下2个特征;

use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

然后将特征包含在班级的顶部;

use AuthenticatesAndRegistersUsers, ThrottlesLogins;

目前,auth功能仍应正常工作。

然后,更改login方法以接受活动标志。将以下内容添加到新控制器中;

/**
* [login description]
* @param  Request $request [description]
* @return [type]           [description]
*/
public function login( Request $request, $guard )
{
    $this->validateLogin( $request );
    $throttles = $this->isUsingThrottlesLoginsTrait();

    if ( $throttles && $lockedOut = $this->hasTooManyLoginAttempts( $request ) ) {
        $this->fireLockoutEvent( $request );
        return $this->sendLockoutResponse( $request );
    }
    $credentials = $this->getCredentials( $request );
    if ( Auth::guard( $guard )->attempt( [ 'active' => 1 ] + $credentials, $request->has( 'remember' ) ) ) {
        return $this->handleUserWasAuthenticated( $request, $throttles, $guard );
    }

    // check to see if they can login without the active flag
    if( Auth::guard( $guard )->attempt( $credentials ) ) {
        // log them back out and send them back
        Auth::guard( $guard )->logout();
        return redirect()->back()
            ->withInput( $request->only( $this->loginUsername(), 'remember' ) )
            ->withErrors([
                'active' => 'Your account is currently not active',
            ]);
    }
    if ( $throttles && ! $lockedOut ) {
        $this->incrementLoginAttempts( $request );
    }
    return $this->sendFailedLoginResponse( $request );
}

使用您自己的控制器中的特征应该会在未来为您提供更大的灵活性。

问候

答案 1 :(得分:1)

<强>解决

如果您键入php artisan route:list,您会看到通过post方法登录时,用户将其信息帐户发布到LoginController中的登录操作。所以,我已经通过Auth \ LoginController中的覆盖登录方法解决了这个问题,如下所示:

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');
    $credentials['active'] = 1;
    if (Auth::attempt($credentials)) {
        // Authentication passed...
        return redirect()->intended('/');
    }
}

答案 2 :(得分:0)

要防止访客用户(未经过身份验证)访问某些路由,您应该保护routes.php中的这些路由:

// All the routes inside the group are accessible for logged in users only
Route::group(array('before' => 'auth'), function() {
    Route::get('myroute', 'Controller@action'); 
});

// For routes accessible for everybody
Route::get('login', function(){
    return View::make('login');
});

答案 3 :(得分:0)

解决

我自己设法做到了这一点。不确定这是正确的方法,但无论如何它都有效。

我已经决定创建一个中间件,在成功登录后,检查用户是否活跃了&#39;如果不是,则重定向到特定页面。

`exports.get = function(req, res, next){
        res.render('admin/admin', {
                title: "Main panel"
        });
};`