2015-10-01 2 views
1

Я новичок в Laravel и хочу создать небольшую область администрирования для создания и редактирования данных. Я использую аутентификацию, которая выходит из коробки с Laravel 5.1 и следит за этой документацией http://laravel.com/docs/master/authentication.Laravel 5.1 Аутентификация для маршрута администратора

Я префикс всех моих бэкэнд-маршрутов с помощью «admin». Теперь, если я вхожу в систему, меня перенаправляют на правильную страницу. Но как только я нажимаю одну ссылку или перезагружаю страницу, меня перенаправляют на мою страницу входа.

Я думаю, что я просто ошибаюсь в маршрутах ...?

Дополнительная информация:

  • Laravel Framework версии 5.1.17 (LTS)
  • Я использую бродягу, как мой Dev окружающей среды. Это специальная коробка. Но I уже пробовал использовать Homestead с этой файловой базой, той же проблемой.
  • Без промежуточного программного обеспечения auth все мои маршруты доступны и работают .

routes.php

// Frontend 
Route::get('/', ['as' => 'home', 'uses' => '[email protected]']); 
Route::resource('comment', 'CommentController', ['only' => ['create','store']]); 

// Authentication 
Route::get('admin/login', array('as' => 'admin.login', 'uses' => 'Auth\[email protected]')); 
Route::post('admin/login', array('as' => 'admin.login', 'uses' => 'Auth\[email protected]')); 
Route::get('admin/logout', array('as' => 'admin.logout', 'uses' => 'Auth\[email protected]')); 

// Backend Admin with Authentication 
Route::group(array('prefix' => 'admin', 'middleware' => 'auth', 'namespace' => 'Admin'), function() 
{ 
    Route::post('content/sortlist', ['as' => 'admin.content.sortlist', 'uses' => '[email protected]']); 
    Route::resource('content', 'ContentController', ['except' => ['show']]); 
    Route::resource('comment', 'CommentController', ['only' => ['index','destroy']]); 
}); 

Выход из PHP ремесленника маршрута: список

+--------+----------+------------------------------+------------------------+-------------------------------------------------------+------------+ 
| Domain | Method | URI       | Name     | Action            | Middleware | 
+--------+----------+------------------------------+------------------------+-------------------------------------------------------+------------+ 
|  | GET|HEAD |/       | home     | App\Http\Controllers\[email protected]   |   | 
|  | GET|HEAD | admin/comment    | admin.comment.index | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | DELETE | admin/comment/{comment}  | admin.comment.destroy | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | POST  | admin/content    | admin.content.store | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | GET|HEAD | admin/content    | admin.content.index | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | GET|HEAD | admin/content/create   | admin.content.create | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | POST  | admin/content/sortlist  | admin.content.sortlist | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | PATCH | admin/content/{content}  |      | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | DELETE | admin/content/{content}  | admin.content.destroy | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | PUT  | admin/content/{content}  | admin.content.update | App\Http\Controllers\Admin\[email protected] | auth  | 
|  | GET|HEAD | admin/content/{content}/edit | admin.content.edit  | App\Http\Controllers\Admin\[email protected]  | auth  | 
|  | GET|HEAD | admin/login     | admin.login   | App\Http\Controllers\Auth\[email protected]  | guest  | 
|  | POST  | admin/login     | admin.login   | App\Http\Controllers\Auth\[email protected] | guest  | 
|  | GET|HEAD | admin/logout     | admin.logout   | App\Http\Controllers\Auth\[email protected] |   | 
|  | POST  | comment      | comment.store   | App\Http\Controllers\[email protected]   |   | 
|  | GET|HEAD | comment/create    | comment.create   | App\Http\Controllers\[email protected]   |   | 
+--------+----------+------------------------------+------------------------+-------------------------------------------------------+------------+ 

приложение/Http/Контроллеры/Auth/AuthController.php

<?php 

namespace App\Http\Controllers\Auth; 

use App\User; 
use Validator; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\ThrottlesLogins; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

class AuthController extends Controller 
{ 

    /* 
    |-------------------------------------------------------------------------- 
    | Registration & Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles the registration of new users, as well as the 
    | authentication of existing users. By default, this controller uses 
    | a simple trait to add these behaviors. Why don't you explore it? 
    | 
    */ 

    use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

    protected $redirectPath = 'admin/content'; 

    protected $loginPath = 'admin/login'; 

    /** 
    * Create a new authentication controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware('guest', ['except' => 'getLogout']); 
    } 

    /** 
    * Get a validator for an incoming registration request. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
      'firstname' => 'required|max:255', 
      'lastname' => 'required|max:255', 
      'email' => 'required|email|max:255|unique:users', 
      'password' => 'required|confirmed|min:6', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    protected function create(array $data) 
    { 
     return User::create([ 
      'firstname' => $data['firstname'], 
      'lastname' => $data['lastname'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
     ]); 
    } 
} 

приложение/Http/Middleware/Authenticate.php

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Contracts\Auth\Guard; 

class Authenticate 
{ 
    /** 
    * The Guard implementation. 
    * 
    * @var Guard 
    */ 
    protected $auth; 

    /** 
    * Create a new filter instance. 
    * 
    * @param Guard $auth 
    * @return void 
    */ 
    public function __construct(Guard $auth) 
    { 
     $this->auth = $auth; 
    } 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if ($this->auth->guest()) { 
      if ($request->ajax()) { 
       return response('Unauthorized.', 401); 
      } else { 
       return redirect()->guest('admin/login'); 
      } 
     } 

     return $next($request); 
    } 
} 

приложение/Http/Промежуточное/RedirectIfAuthenticated.php

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Contracts\Auth\Guard; 

class RedirectIfAuthenticated 
{ 
    /** 
    * The Guard implementation. 
    * 
    * @var Guard 
    */ 
    protected $auth; 

    /** 
    * Create a new filter instance. 
    * 
    * @param Guard $auth 
    * @return void 
    */ 
    public function __construct(Guard $auth) 
    { 
     $this->auth = $auth; 
    } 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if ($this->auth->check()) { 
      return redirect('admin/content'); 
     } 

     return $next($request); 
    } 
} 

postLogin на поставщика/Laravel/рамочный/SRC/Осветите/Foundation/Auth/AuthenticatesUsers.php (меняло здесь)

<?php 

namespace Illuminate\Foundation\Auth; 

use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Support\Facades\Lang; 

trait AuthenticatesUsers 
{ 
    use RedirectsUsers; 

    /** 
    * Show the application login form. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function getLogin() 
    { 
     if (view()->exists('auth.authenticate')) { 
      return view('auth.authenticate'); 
     } 

     return view('auth.login'); 
    } 

    /** 
    * Handle a login request to the application. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function postLogin(Request $request) 
    { 
     $this->validate($request, [ 
      $this->loginUsername() => 'required', 'password' => 'required', 
     ]); 

     // If the class is using the ThrottlesLogins trait, we can automatically throttle 
     // the login attempts for this application. We'll key this by the username and 
     // the IP address of the client making these requests into this application. 
     $throttles = $this->isUsingThrottlesLoginsTrait(); 

     if ($throttles && $this->hasTooManyLoginAttempts($request)) { 
      return $this->sendLockoutResponse($request); 
     } 

     $credentials = $this->getCredentials($request); 

     if (Auth::attempt($credentials, $request->has('remember'))) { 
      return $this->handleUserWasAuthenticated($request, $throttles); 
     } 

     // If the login attempt was unsuccessful we will increment the number of attempts 
     // to login and redirect the user back to the login form. Of course, when this 
     // user surpasses their maximum number of attempts they will get locked out. 
     if ($throttles) { 
      $this->incrementLoginAttempts($request); 
     } 

     return redirect($this->loginPath()) 
      ->withInput($request->only($this->loginUsername(), 'remember')) 
      ->withErrors([ 
       $this->loginUsername() => $this->getFailedLoginMessage(), 
      ]); 
    } 

    /** 
    * Send the response after the user was authenticated. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param bool $throttles 
    * @return \Illuminate\Http\Response 
    */ 
    protected function handleUserWasAuthenticated(Request $request, $throttles) 
    { 
     if ($throttles) { 
      $this->clearLoginAttempts($request); 
     } 

     if (method_exists($this, 'authenticated')) { 
      return $this->authenticated($request, Auth::user()); 
     } 

     return redirect()->intended($this->redirectPath()); 
    } 

    /** 
    * Get the needed authorization credentials from the request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return array 
    */ 
    protected function getCredentials(Request $request) 
    { 
     return $request->only($this->loginUsername(), 'password'); 
    } 

    /** 
    * Get the failed login message. 
    * 
    * @return string 
    */ 
    protected function getFailedLoginMessage() 
    { 
     return Lang::has('auth.failed') 
       ? Lang::get('auth.failed') 
       : 'These credentials do not match our records.'; 
    } 

    /** 
    * Log the user out of the application. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function getLogout() 
    { 
     Auth::logout(); 

     return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); 
    } 

    /** 
    * Get the path to the login route. 
    * 
    * @return string 
    */ 
    public function loginPath() 
    { 
     return property_exists($this, 'loginPath') ? $this->loginPath : '/auth/login'; 
    } 

    /** 
    * Get the login username to be used by the controller. 
    * 
    * @return string 
    */ 
    public function loginUsername() 
    { 
     return property_exists($this, 'username') ? $this->username : 'email'; 
    } 

    /** 
    * Determine if the class is using the ThrottlesLogins trait. 
    * 
    * @return bool 
    */ 
    protected function isUsingThrottlesLoginsTrait() 
    { 
     return in_array(
      ThrottlesLogins::class, class_uses_recursive(get_class($this)) 
     ); 
    } 
} 

Как я ссылку на страницах администрирования в моем файле master.admin лезвия (может быть, преступник?)

<ul class="nav nav-sidebar"> 
<li {{ Request::is('admin/content') ? "class=active" : null }}><a href="{{ URL::route('admin.content.index') }}">Inhalte <span class="sr-only">(current)</span></a></li> 
<li {{ Request::is('admin/comment') ? "class=active" : null }}><a href="{{ URL::route('admin.comment.index') }}">Kommentare <span class="sr-only">(current)</span></a></li> 
</ul> 

Следуя бесчисленным ссылкам google, я уже проверял разрешения на доступ к хранилищу/структуре/сеансам и проверял, является ли сеанс постоянным. Кажется мне так. Я переключился с сеанса на основе файлов на сеанс базы данных в config/session.php, никаких изменений вообще. В файле laravel.log ничего нет.

Я нахожусь в своем остроумие. Наверное, это просто какая-то конфигурация, которую я просто не получаю.

Благодарим за помощь!

+0

звучит как сеанс cookie не создан в вашем браузере, отслеживайте заголовки страниц после входа в систему, если они в порядке, проверьте, что файл cookie действительно создан – Gal

+0

Спасибо! Я проверил с помощью инспектора элементов Chrome unter Resources -> Cookies. Присутствуют как файлы XSRF-TOKEN, так и файл cookie laravel_session. Однако хранилище сеансов пуст. Это может быть проблема? – Sam

+0

Нет, если у вас есть laravel session cookie, это нормально, убедитесь, что оно соответствует тому, что у вас есть в db, также вы можете захотеть 'dd' внутри' auth' просто понять, что может пойти не так. – Gal

ответ

0

Найдено решение. Я наткнулся на другой вопрос здесь о stackoverflow относительно auth и нашел проблему.

Я использовал

<li><a href="{{ Auth::logout() }}">Logout</a></li> 

в моем шаблоне лезвия для выхода из системы. Пока это было, появится описанное выше поведение. Я заменил его следующим

<li><a href="{{ URL::to('admin/logout') }}">Logout</a></li> 

и теперь все работает как ожидается! Я все равно хотел бы знать, почему это происходит ... Но, возможно, это поможет кому-то еще!

+1

Это происходит потому, что 'Auth :: logout()' делает то, что он говорит: он регистрирует вас, а не предоставляет ссылку на страницу выхода. Итак, после вашего входа вы перенаправляетесь на главную страницу и снова выходите из системы, так как этот звонок происходит в вашем шаблоне кликов. После того, как вы нажмете еще одну ссылку, вы больше не войдете в систему и поэтому перенаправлены на страницу входа. – Tim

+0

Спасибо за разъяснение, Тим! Не буду использовать его так снова. – Sam