如何在 laravel 4.2 中创建登录功能


How to create login functionality in laravel 4.2

嗨,我对拉拉维尔很陌生。我被要求在拉拉维尔中创建应用程序。现在,最初,我正在研究登录模块。

基本要求

  • 当用户登录时,将登录页面显示为登录页面。
  • 提供用户凭据后,应设置会话,并且用户必须重定向到内页。
  • 成功登录后,除非注销,否则不应显示登录页面。

因此,为了检查登录状态,我在过滤器中使用了过滤器.php如下所示。

App::before(function($request)
{
    // $myApp Singleton object
    App::singleton('myApp', function(){
        $app = new stdClass;
        $app->title = "APD | Dealership Invoicing";
        if (Auth::check()) {
            $app->user = Auth::User();
            $app->isLogedin = TRUE;
        }
        else
        {
            $app->isLogedin = FALSE;
            $app->user = FALSE;
        }
        return $app;
    });
    $app = App::make('myApp');
    View::share('myApp', $app);
});

我根据" http://heera.it/laravel-4-view-composer-master-layout#.VH280nvB25s"中发布的博客实现了上述代码。

当用户从视图中单击登录按钮时,我将数据发送到控制器并检查数据库中的数据,如果数据正确,那么我将用户详细信息放在会话中并重定向到内部页面。

控制器代码

public function validateLogin()
{
    $data = Input::all();
    $user_data = $this->validate_user_login($data);
    if(is_array($user_data) && !empty($user_data) && count($user_data) > 0)
    {
        /* The below conversion is used, because there seems to be difficulty in returning the Arrays from the Eloquent ORM.*/
        $user_array = (array)$user_data[0];
        Session::put('user_data', $user_array);            
        return Redirect::to('/jobs');
    }
}

路线.php代码

Route::get('/', function()
{
    #return View::make('login/login');
    return Redirect::to('/login');
});
Route::get('/login', 'UserController@login');
Route::post('/user/validate_login', 'UserController@validateLogin');
Route::group(array('before' => 'auth'), function()
{
    Route::get('/jobs', 'JobsController@jobs_list');
});

但我的问题是,重定向将我带回登录页面。

问题

  • 登录后如何将登录状态设置为 true?
  • 如何启动会话。我在控制器中设置了会话密钥,这足以验证用户会话吗?
  • 将来,我必须为相同的应用程序开发REST API,我必须为Web和服务平台使用相同的应用程序。因此,基于将控件放入过滤器中会在 API 调用中遇到任何困难?
  • 我在哪里可以找到"Auth::Check(("中的身份验证类和检查函数?
我通过使用

Jeffrey 在"https://laracasts.com/series/laravel-from-scratch/episodes/15"中的教程实现了登录功能。这是简单而伟大的解释。我已经用Jeffrey解释的方式更改了我编写的代码。效果很好。

我将提供简短的登录功能,这是我在视频之后构建的。

路由器文件

Router.php
----------
/* This route is used to show the login page, when there is no session created.*/
Route::group(array('before' => 'login'), function()
{
    Route::get('login', 'UserController@create');
});
/* This below route is used when user is clicked on the login button in the log in page. */
Route::post('/user/store','UserController@store');

过滤器文件

Filter.php
----------
App::before(function($request)
{
    // $myApp Singleton object
    App::singleton('myApp', function(){
        $app = new stdClass;
        $app->title = "APD | Dealership Invoicing";
        if (Auth::check()) {
            $app->user = Auth::User();
            $app->isLogedin = TRUE;
        }
        else
        {
            $app->isLogedin = FALSE;
            $app->user = FALSE;
        }
        return $app;
    });
$app = App::make('myApp');
View::share('myApp', $app);
});

App::after(function($request, $response)
{
    /* The below headers are used to restrict the browser to cache the pages.           
    */
    $response->headers->set("Cache-Control","no-cache,no-store, must-revalidate");
    $response->headers->set("Pragma", "no-cache"); //HTTP 1.0
    $response->headers->set("Expires"," Sat, 26 Jul 1986 05:00:00 GMT");
});
/*
| Authentication Filters    
|
| The following filters are used to verify that the user of the current
| session is logged into this application. The "basic" filter easily
| integrates HTTP Basic authentication for quick, simple checking.
|
*/
Route::filter('auth', function()
{
    if (Auth::guest())
    {
        if (Request::ajax())
        {
            /*return Response::make('Unauthorized', 401);*/
            return Response::make('common.unauthorized');
        }
        else
        {
            return Redirect::guest('login');
        }
    }
});

控制器文件

UserController.php
------------------
/**
 * The below function is used to show the login screen.
 */
public function create()
{
    /*
       This helps us to restrict the display of login page when clicked on browser back button after login.
    */
    $headers = array();
    $headers['Expires'] = 'Tue, 1 Jan 1980 00:00:00 GMT';
    $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0';
    $headers['Pragma'] = 'no-cache';
    return Response::make(View::make('login.login'), 200, $headers);
    //return View::make('login.login');
}    
public function store()
{
    $input_data = Input::all();
    $credentials = array(
        'user_name' => htmlEncode(trim($input_data['user_name'])),
        'password' => $input_data['password'],
        'status' => 1
    );
    /* Here I am calling a function in the parent class. My UserController is extending the BaseController. The code will be available below. */
    $loginStatus = $this->validateUserLogin($credentials);
    if($loginStatus['status'] == 200)
    {
        $roleId = Auth::User()->role_id;
        $loggedInUserId = Auth::User()->id;
        $redirectPage = '/products';
        switch ($roleId)
        {
            case 'super':
                $redirectPage = '/manage_users';
                break;
            case 'admin':
                $redirectPage = '/products';
                break;                
        }
        return Redirect::to($redirectPage);
    }
    else
    {
        return Redirect::to('login')->with('status_data',$loginStatus);
    }
}

基本控制器文件

BaseController.php
------------------
protected function validateUserLogin($userData = '')
{
    $this->return_array = array();        
    if(!empty($userData))
    {
        if(Auth::attempt($userData))
        {
            $this->return_array['status'] = 200;
            $this->return_array['message'] = 'Login successfull.';
        }
        else
        {
            $userData['status'] = 0;
            if(Auth::validate($userData)) // This is to verify weather user is existed with status '0'. That means De-active user.
            {
                $this->return_array['status'] = 100;
                $this->return_array['message'] = 'Your account is deactivated, Please contact your admin.';
            }
            else
            {
                $this->return_array['status'] = 100;
                $this->return_array['message'] = 'Login failed. Please enter valid user name and password.';
            }
        }
    }
    else
    {
        $this->return_array['status'] = 100;
        $this->return_array['message'] = 'Unable to login please try after some time.';
    }
    return $this->return_array;
}