каждый.
У меня сейчас проблема с изменением системы регистрации Auth в Laravel 5.2. То, что я пытаюсь сделать, это две отдельные системы регистрации для обычных пользователей и администраторов. Я добавил новое поле в базу данных для пользователей с именем admin и установил значение по умолчанию 0 или false. Используя страницу регистрации, которую использует система авторизации Laravel, я добавил скрытый ввод и установил значение 1. Очевидно, что эта страница будет использоваться для входа в систему администраторов, чтобы они могли войти в область администратора.
Когда я отправляю форму, в поле администратора просто устанавливается значение по умолчанию, а это не то, что я хочу для этой части сайта. Когда пользователь нажимает кнопку «Отправить» на этой странице, я хочу, чтобы его информация отправлялась в базу данных со значением администратора 1. Есть ли способ сделать это?
Вот что я сделал до сих пор, чтобы настроить систему регистрации авторизации.
Я удалил поле имени и добавил поле имени и фамилии, чтобы пользователи могли вводить оба этих значения в отдельных текстовых полях. Я обновил модель User, чтобы включить эти поля в массив $ fillable, и обновил метод проверки AuthControllers, чтобы эти поля можно было проверять.
Вот код для каждого
Вот файл модели User.php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'firstname', 'lastname', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token', 'admin',
];
}
а вот здесь файл AuthContoller
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
/**
* Where to redirect users after login / registration.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new authentication controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
}
/**
* 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|min:6|confirmed',
'admin' => 'required',
]);
}
/**
* 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']),
'admin' => $data['admin'],
]);
}
}
Как вы можете видеть, я также добавил поле администратора в файл модели User.php, надеясь, что оно будет заполнено автоматически.
Если кто-нибудь может сказать мне, как это можно сделать, это было бы здорово. Но, как вы можете видеть, это на самом деле не практическое решение для реального веб-сайта, а больше о том, как изучить все тонкости Laravel и узнать, как настроить его. Когда я начал выписывать этот вопрос, мне показалось, что я мог бы просто использовать регистрацию для любого пользователя, а затем позволить администратору верхнего уровня установить значение поля администратора в true, чтобы пользователь мог рисковать в Административные разделы приложения. Конечно, если бы такая система была такой, не было бы необходимости иметь два отдельных экрана входа в систему, но, как я уже сказал, я только учусь.
Я также планирую добавить роли, аналогичные нажатию слов для администраторов различного уровня, которые будут управлять такими вещами, как создание, редактирование и публикация контента, такого как посты. но сейчас я просто работаю над этой системой как она есть.
Спасибо за любую помощь и комментарии по этой теме.
Прежде всего, как вы упомянули, это совсем не практический пример, он фактически построен на основных дырах в безопасности, поэтому мой ответ здесь — просто продемонстрировать возможности Laravel, не вдаваясь в валидность данного примера.
Во-вторых, не нужно добавлять скрытое поле в форму, для статуса администратора вы можете установить это значение перед сохранением модели пользователя:
$user = User($request->all());
$user->admin = 1;
$user->save()
В общем, чтобы сделать что-то заполнить автоматически. вам нужно указать, что в модели
class User extends Model
{
protected $fillable = ['first_name', 'lastname', 'email', 'password', 'admin']);
}
Если вы собираетесь внедрить систему на основе ролей, нет необходимости добавлять ‘admin’ в модель User.
Это короткая версия того, что я сделал
Permission model
- ID
- name
- display_name
- description
Role model
- ID
- name
- display_name
- description
- power
(Let's say both roles Manager and Admin can delete users,
the manager has 50 power and the admin has 90 power.
The manager is not able to delete the admin, but the admin can delete the manager.)
User model
- ID
- fname
- lname
- username
- email
- password
permission_role table
- permission_id
- role_id
$table->primary(['permission_id', 'role_id'])
role_user table
- role_id
- user_id
$table->primary(['role_id', 'user_id'])
С этой настройкой ваши пользователи могут иметь несколько ролей, и 1 разрешение может быть во всех ролях.
Я тоже сделал отдельную страницу входа для администраторов и других типов пользователей.
Для этого я использую разные маршруты
Route::get('/[secure_string]/auth', 'AuthController@getNormalLogin')->name('UserLogin');
Route::post('/[secure_string]/auth', 'AuthController@postNormalLogin');
Route::get('/[secure_string]/auth/strong', 'AuthController@getAdminLogin')->name('AdminLogin');
Route::post('/[secure_string]/auth/strong', 'AuthController@postAdminLogin');
(The secure string is placed in a config file,
anyone can guess /dashboard will get you to the CMS)
Оба эти метода будут возвращать одно и то же представление, но с другим атрибутом действия в форме.
public function getNormalLogin() {
return view('login_form')->with(['action' => route('UserLogin')]);
}
public function getAdminLogin() {
return view('login_form')->with(['action' => route('AdminLogin')]);
}
Моя форма выглядит
<form method='post' action='{{ $action }}'>
// input fields and submit button
</form>
Мои методы сообщения
public function validateForm($request) {
// validate input
}
public function fetchUser($username) {
return User::where('username', $username)->first();
public function postNormalLogin(Request $request) {
$this->validateForm($request);
$user = $this->fetchUser($request->get('username');
// see if the user has the admin role assigned (recommend writing a $user->hasRole($role) method)
if ($user->hasRole('admin')) {
// if so reject the login request
} else {
// continue with login
}
}
public function postAdminLogin(Request $request) {
$this->validateForm($request);
$user = $this->fetchUser($request->get('username');
// see if the user has the admin role assigned (recommend writing a $user->hasRole($role) method)
if ($user->hasRole('admin')) {
// continue with login
} else {
// if so reject the login request
}
}