Laravel 5.0,管理员和前端用户

时间:2016-04-25 14:43:34

标签: php laravel admin frontend

我是Laravel的新手并使用5.0版本。

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

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

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

请同时查看我是否以正确的方式处理这些事情,如果没有,那么正确的方法是什么。

我的routes.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

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

我的USERS表格结构如下所示

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 ;

请帮忙。

谢谢,

2 个答案:

答案 0 :(得分:3)

使用中间件(http://laravel.com/docs/5.0/middleware)可以很容易地解决这个问题 首先让我们创建中间件,你可以随便调用它,让我们说AdminMiddleware

php artisan make:middleware AdminMiddleware

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

我们刚创建的AdminMiddleware

<?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
    });

});

希望这有帮助!

答案是从HERE

复制的

答案 1 :(得分:0)

我在我的应用程序中执行的操作是在验证后的登录过程中我会向session写一些相关信息,然后在任何相关URL上创建中间件检查并检查session在中间件中。

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

例如:

routes.php

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

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

将角色置于HomeController中的会话

    $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');
           }

}

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