Laravel 5.0,管理员和前端用户


Laravel 5.0, Admin and front end users

我是Laravel的新手,使用的是5.0版。

我的网站将在前端有用户,显然网站将有管理员。

我面临的问题是非管理员用户也可以登录到管理面板。

如何不允许前端用户进入管理员?

也请看看我是否以正确的方式做事,如果不是,那么正确的方式是什么。

我的路线.php

如下
Route::get('home', 'HomeController@index');
Route::get('consign', 'HomeController@showConsignment');
Route::post('processConsignment', 'HomeController@processConsignment');
Route::get('login', array('uses' => 'HomeController@showLogin'));
Route::post('login', array('uses' => 'HomeController@doLogin'));
Route::get('logout', array('uses' => 'HomeController@doLogout'));
Route::controllers([
    'auth' => 'Auth'AuthController',
    'password' => 'Auth'PasswordController',
]);
// Admin area
get('admin', function () {
  return redirect('/admin/dashboard');
});
$router->group([
  'namespace' => 'Admin',
  'middleware' => 'auth',
], function () {
  resource('admin/dashboard', 'DashboardController');
  resource('admin/auction', 'AuctionController');
  resource('admin/auctionlot', 'AuctionLotController');
  resource('admin/video', 'VideoController');
});
// Logging in and out
get('/auth/login', 'Auth'AuthController@getLogin');
post('/auth/login', 'Auth'AuthController@postLogin');
get('/auth/logout', 'Auth'AuthController@getLogout');

HomeController 的相关部分如下:

public function showLogin(){
    // show the form
    return View('home.login');
}
public function doLogin(){
    // validate the info, create rules for the inputs
    $rules = array(
        'email'    => 'required|email', // make sure the email is an actual email
        'password' => 'required|alphaNum|min:3' // password can only be alphanumeric and has to be greater than 3 characters
    );
    // run the validation rules on the inputs from the form
    $validator = Validator::make(Input::all(), $rules);
    // if the validator fails, redirect back to the form
    if ($validator->fails()) {
        return Redirect::to('login')
            ->withErrors($validator) // send back all errors to the login form
            ->withInput(Input::except('password')); // send back the input (not the password) so that we can repopulate the form
    } else {
        // create our user data for the authentication
        $userdata = array(
            'email'     => Input::get('email'),
            'password'  => Input::get('password'),
            'active'    => '1',
            'role'      => 'user'
        );
        // attempt to do the login
        if (Auth::attempt($userdata)) {
            // validation successful!
            // redirect them to the secure section or whatever
            // return Redirect::to('secure');
            // for now we'll just echo success (even though echoing in a controller is bad)
            return Redirect::to('home');
        } else {        
            // validation not successful, send back to form 
            return Redirect::to('login');
        }
    }
}//doLogin

这意味着我为管理员和前端用户提供了单独的表单

我的用户表结构如下

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `role` enum('admin','user') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'user',
  `active` enum('1','0') COLLATE utf8_unicode_ci NOT NULL,
  `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

请帮忙。

谢谢

这可以通过使用中间件(http://laravel.com/docs/5.0/middleware)轻松解决首先让我们创建中间件,你可以随便称呼它,比如说管理中间件

php artisan make:middleware AdminMiddleware

现在我们有了中间件,我们需要编辑它并指定我们希望它做什么。在 App''Http''Middleware 中,您应该看到新创建的文件

我们刚刚创建的管理员中间件

<?php namespace App'Http'Middleware;
use Closure;
class AdminMiddleware {
    /**
     * Handle an incoming request.
     *
     * @param  'Illuminate'Http'Request  $request
     * @param  'Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->user()->type != 'admin') 
        {
            return redirect('home');
        }
        return $next($request);
    }
}

我们在这里所做的是,带用户并检查类型是否为 A,如果不是.. 重定向回家。现在我们有了它,我们需要在 routes.php 文件中使用它。

路由文件

Route::group(['middleware' => 'App'Http'Middleware'AdminMiddleware'], function()
{
    Route::get('/admin', function()
    {
        // can only access this if type == admin
    });
});

希望对您有所帮助!

答案是从这里复制的

我在应用程序中所做的是在登录过程中,一旦它们被验证,我将向session写入一些相关信息,然后在任何相关 URL 上创建中间件检查并检查中间件中的session

在您的情况下,您可能希望将它们的角色写入会话变量并在中间件中检查它。

例如:

路线.php

我会将要保护的所有终结点放在路由组中:

Route::group(['middleware' => 'auth'], function()
{
   resource('admin/dashboard', 'DashboardController');
   resource('admin/auction', 'AuctionController');
   resource('admin/auctionlot', 'AuctionLotController');
   resource('admin/video', 'VideoController');
});

在主控制器中将角色放入会话中

    $sess_array = [
        'user_role'       => $user_role, // From what you got from DB 
        'user_email'      => $user->sup_email,
        'active'          => '1',
    ];
    $request->session()->put($sess_array);

身份验证中间件

  public function handle(Request $request, Closure $next)
{
           if($request->session()->get('user_role') ! == 'admin') {
               return $next($request);
           } else {
               return redirect('login');
           }
}

这是一个有点过于简单的例子,但我希望你明白要点?