#php #laravel #laravel-5.7 #web-development-server
#php #laravel #laravel-5.7 #веб-разработка-сервер
Вопрос:
Я сталкиваюсь с проблемой, когда пользователь на веб-сайте после входа перенаправляет его на домашнюю страницу, и все работает нормально, но когда пользователь переходит на любую другую страницу, он больше не входит в систему, и я не знаю, в чем проблема.
извините, что я новичок в этом, поэтому, если вам что-то нужно еще, просто скажите мне
Я использую: laravel: 5.7 php: 7.1.3
маршруты:
<?php
use AppHttpControllersPagesController;
Route::get('/','PagesController@index');
Route::get('/login','PagesController@login');
Route::post('/login','PagesController@validateLogin');
Route::post('/signup','PagesController@insert');
Route::get('/signup','PagesController@signup');
Route::get('/postRequest','PagesController@postRequest');
Route::post('/postRequest','PagesController@postuser');
Route::get('/session','PagesController@usession');
Файл конфигурации сеанса:
use IlluminateSupportStr;
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
| Session Encryption
|--------------------------------------------------------------------------
|
| This option allows you to easily specify that all of your session data
| should be encrypted before it is stored. All encryption will be run
| automatically by Laravel and you can use the Session like normal.
|
*/
'encrypt' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path('framework/sessions'),
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => env('SESSION_CONNECTION', null),
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Cache Store
|--------------------------------------------------------------------------
|
| When using the "apc" or "memcached" session drivers, you may specify a
| cache store that should be used for these sessions. This value must
| correspond with one of the application's configured cache stores.
|
*/
'store' => env('SESSION_STORE', null),
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => [2, 100],
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('PHP', 'laravel'), '_').'_session'
),
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => env('SESSION_DOMAIN', null),
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => env('SESSION_SECURE_COOKIE', false),
/*
|--------------------------------------------------------------------------
| HTTP Access Only
|--------------------------------------------------------------------------
|
| Setting this value to true will prevent JavaScript from accessing the
| value of the cookie and the cookie will only be accessible through
| the HTTP protocol. You are free to modify this option if needed.
|
*/
'http_only' => true,
/*
|--------------------------------------------------------------------------
| Same-Site Cookies
|--------------------------------------------------------------------------
|
| This option determines how your cookies behave when cross-site requests
| take place, and can be used to mitigate CSRF attacks. By default, we
| do not enable this as other CSRF protection services are in place.
|
| Supported: "lax", "strict"
|
*/
'same_site' => null,
];
PageController:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use databasemigrations;
use DB;
use Validator;
use Appusers;
use AppHttpControllersController;
use IlluminateSupportFacadesHash;
//Abdulmalik
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesSession;
class PagesController extends Controller
{
public function index() {
return view('index');
}
public function postRequest() {
return view('postRequest');
}
public function postuser() {
$user1 = new users();
$email = request('reqName');
$pass = request('reqDesc');
$fn = request('category');
$ln = request('skills');
$user1->email =$email;
$user1->password=$pass;
$user1->firstName=$fn;
$user1->lastName=$ln;
$user1->save();
return view('postRequest');
}
public function login() {
return view('login');
}
public function validateLogin(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required',
]);
if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
// Success
// $message = "successfully login ";
// echo "<script type='text/javascript'>alert('$message');</script>";
//$value = $request->session()->all();//Session::get('laravel_session');
//Session::put('userId', $value);
//$request->session()->keep(['laravel_session']);
//echo $value;
return view('index');
} else {
return "something happened"/*redirect()->back()*/;
};
}
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
}
public function signup() {
return view('signup');
}
protected function validator(array $data)
{
return Validator::make($data, [
'firstName' => 'required|string|max:255',
'lastName' => 'required|string|max:255',
'email' => 'unique:users,email',
'password' => 'required|string|min:6|confirmed',
]);
}
public function insert(){
$errors="";
$firstName = request('Fname');
$lastName = request('Lname');
$pass = request('password');
$em = request('email');
$conpass = request('conPassword');
$validation = Validator::make(
[ //parameters
'firstName' => request('Fname'),
'lastName' => request('Lname'),
'password' => request('password'),
'email' => request('email'),
'password_confirmation' => request('conPassword'),
], //rule
[
'firstName' => ['required','string','max:255' ],
'lastName' => ['required','string','max:255' ],
'password' => ['required','string','min:6','confirmed' ],
'password_confirmation' => [],
'email' => ['required', 'email','unique:users'],
],//error messages
['firstName.required' =>"الرجاء إدخال الاسم الأول *",
'lastName.required' =>"الرجاء إدخال اسم العائلة *",
'password.required' =>"الرجاء إدخال كلمة المرور *",
'password.min' =>"كلمة المرور يجب ان تتكون من ستة خانات على الأقل *",
'password.confirmed' =>"كلمة المرور يجب ان تتطابق *",
'email.required' =>"الرجاء إدخال البريد الالكتروني *",
'email.unique' =>"البريد الالكتروني مسجل مسبقا *ً",
'email.email' =>"البريد الالكتروني يجب ان يكون بالصيغة الصحيحة *ً",
]
);
if ( $validation->fails() ) {
$errors = $validation->messages();
return redirect()->back()->withErrors($errors);
}
else{
if($pass!=null) {
$pass = Hash::make(request('password'));
}
$user1 = new users();
$user1->email =$em;
$user1->password=$pass;
$user1->firstName=$firstName;
$user1->lastName=$lastName;
$user1->save();
/*$data = array("email" => $em, "password" => $pass, "firstName" => $firstName, "lastName" => $lastName);
DB::table('users')->insert($data);*/
}
return redirect('/');
}
public function usession(Request $request){
dd($request->session()->all());
}
}
Контроллер входа:
<?php
namespace AppHttpControllersAuth;
use AppHttpControllersController;
use IlluminateFoundationAuthAuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
protected function authenticated()
{
// Update last_session after logged-in
User::find(Auth::id())->update(['laravel_session'=>Session::getId()]);
}
}
Комментарии:
1. Ваши маршруты никогда не вызывают LoginController, почему вы опубликовали это? Laravel 5.7 поставляется с полной системой аутентификации, я думаю, это пользовательская система, верно?
2. пожалуйста, покажите нам результат этой команды php artisan route:list
3. @DitoKhelaia я только что обновил сообщение результатами, которые вы просили
4. @dparoli я новичок в этом извините, у вас есть какие-либо ссылки, которые могут помочь мне использовать систему авторизации laravel ?! помимо документации laravel.
5. Попробуйте изменить
$this->middleware('guest')->except('logout');
на это$this->middleware('auth');
в вашем методе PagesController __construct
Ответ №1:
Как показано в вашем файле routes, для ваших маршрутов входа в систему вы вызываете функции login и validateLogin на PagesController, а в вашем PagesController в функции construct у вас есть промежуточное программное обеспечение, защищающее функции на этом контроллере, с помощью гостевого промежуточного программного обеспечения. Чтобы пояснить вам это, промежуточное программное обеспечение здесь это все равно, что сказать, что все функции, существующие на этом контроллере, видны только гостям, и именно поэтому, когда вы входите в систему и переходите к другим маршрутам, вызывающим функции на PagesController, промежуточное программное обеспечение будет препятствовать вам, потому что эти маршруты предназначены только для гостей (пользователей, которые не вошли в систему), поэтому, чтобы решить эту проблему, вы можете попробовать одно из этих решений:
- В методе construct в PagesController измените его на
$this->middleware('guest', ['only' => [ 'login', 'validateLogin' ]]);
- Или переместите login и validateLogin в LoginController, чтобы вы могли настроить промежуточное программное обеспечение для их размещения. (И это лучшее решение для организации вашего кода)
Комментарии:
1. спасибо за вашу помощь, я сделал именно то, что вы сказали, и я получил ошибку при запуске приложения: imgur.com/tMgnSk0
2. можете ли вы показать мне ошибку? И я отредактировал свой ответ, вы можете попробовать одно из этих решений, которые я перечислил, извините, что не уточнил это.
3. (1) -для первого решения я получил эту ошибку после его применения: ссылка (2)-для второго решения веб-сайт работает, но когда я пытаюсь зайти на страницу входа, я получаю эту ошибку: ссылка
4. 1- Для первого решения измените его на это
$this->middleware('guest', ['only' => [ 'login', 'validateLogin' ]]);
есть ошибка опечатки