我是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 ;
请帮忙。
谢谢,
答案 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');
}
}
这是一个有点过于简单的例子,但我希望你能得到这个要点?