2016-07-31 9 views
1

jeder. Ich habe derzeit ein Problem mit der Änderung des Auth-Registrierungssystems in Laravel 5.2. Was ich versuche zu tun, ist zwei separate Log-System für regelmäßige Benutzer und Administratoren. Ich habe der Datenbank ein neues Feld für die Benutzer admin hinzugefügt und den Standardwert auf 0 oder false gesetzt. Auf der Registrierungsseite, die Laravels Authentifizierungssystem verwendet, habe ich eine versteckte Eingabe hinzugefügt und den Wert auf 1 gesetzt. Diese Seite wird natürlich verwendet, um sich bei den Admins anzumelden, damit sie den Admin-Bereich betreten können.Änderung des Auth-Registrierungssystems in Laravel 5.2, um versteckte Formularfelder zu enthalten

Wenn ich das Formular absende, wird das Admin-Feld einfach auf den Standardwert gesetzt, was ich für diesen Teil der Site nicht möchte. Sobald der Benutzer auf dieser Seite auf "Senden" klickt, möchte ich, dass seine Informationen den Administratorwert von 1 an die Datenbank gesendet werden. Gibt es eine Möglichkeit, dies zu tun?

Hier ist, was ich bisher getan habe, um das Auth-Registrierungssystem anzupassen.

Ich habe das Namensfeld entfernt und ein Vornamen- und Nachname-Feld hinzugefügt, sodass die Benutzer beide Werte in separaten Texteingaben eingeben können. Ich habe das Benutzermodell aktualisiert, um diese Felder in das $ fillable -Array aufzunehmen, und die Validierungsmethode von AuthControllers aktualisiert, sodass diese Felder validiert werden können.

Hier ist der Code für jeden ist die

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', 
]; 
} 

und hier OS die AuthContoller Datei User.php Modelldatei

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

Wie Sie sehen können, habe ich hier

ist auch hinzugefügt Das Admin-Feld in der User.php-Modelldatei hofft, dass sich das automatisch füllt.

Wenn mir jemand sagen kann, wie das gemacht werden könnte, wäre das großartig. Aber wie Sie sehen können, ist dies nicht wirklich eine praktische Lösung für eine tatsächliche Website, aber es geht eher darum, die Ins-und-Outs von Laravel zu lernen und zu lernen, wie man das ausdiskutiert. Als ich begann, diese Frage zu formulieren, schien es mir, als könnte ich einfach die Registrierung für jeden Benutzer verwenden und einem übergeordneten Administrator erlauben, den Wert des admin - Feldes auf "true" zu setzen, damit sich der Benutzer in die Admin-Abschnitte der Anwendung. Natürlich, würde ein System wie dieses, es gäbe keine Notwendigkeit, zwei separate Login-Bildschirme, aber wie ich schon sagte, ich lerne gerade.

Ich plane auch das Hinzufügen von Rollen, ähnlich wie Word für die verschiedenen Ebenen der Admins, die Dinge wie das Erstellen, Bearbeiten und Veröffentlichen von Inhalten wie Posts steuern würde. Aber im Moment arbeite ich nur an diesem System, so wie es ist.

Vielen Dank für jegliche Hilfe und Kommentare zu diesem Thema.

Antwort

0

Zunächst einmal, wie Sie erwähnt haben, ist dies kein praktisches Beispiel, es ist tatsächlich auf großen Sicherheitslücken gebaut, so meine Antwort hier ist, die Laravel-Funktionen zu demonstrieren, ohne in die gegebene Beispielgültigkeit zu graben.

Zweitens keine Notwendigkeit, ein verstecktes Feld in der Form, für den Admin-Status hinzufügen möchten, können Sie diesen Wert festlegen, bevor das Benutzermodell zu speichern:

$user = User($request->all()); 
$user->admin = 1; 
$user->save() 

Im Allgemeinen etwas füllen automatisch zu machen.

class User extends Model 
{ 
    protected $fillable = ['first_name', 'lastname', 'email', 'password', 'admin']); 
} 
+0

Vielen Dank für hier auf meine Frage antwortet. – Kaley36

0

Wenn Sie vorhaben, dort angeben müssen, dass in dem Modell ein rollenbasiertes System zu implementieren, besteht keine Notwendigkeit, ‚admin‘ im User-Modell hinzuzufügen.

Dies ist die kurze Version von dem, was ich tat

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']) 

Mit diesem Aufbau können die Benutzer mehrere Rollen haben, und 1 Erlaubnis in allen Rollen sein kann.
Ich habe auch eine separate Login-Seite für Administratoren und andere Arten von Benutzern.

Um dies zu tun, verwende ich verschiedene Routen

Route::get('/[secure_string]/auth', '[email protected]')->name('UserLogin'); 
Route::post('/[secure_string]/auth', '[email protected]'); 
Route::get('/[secure_string]/auth/strong', '[email protected]')->name('AdminLogin'); 
Route::post('/[secure_string]/auth/strong', '[email protected]'); 
(The secure string is placed in a config file, 
anyone can guess /dashboard will get you to the CMS) 

Beide diese Methoden die gleiche Ansicht zurückkehren, aber mit einem anderen Aktion Attribute auf dem Formular.

public function getNormalLogin() { 
    return view('login_form')->with(['action' => route('UserLogin')]); 
} 

public function getAdminLogin() { 
    return view('login_form')->with(['action' => route('AdminLogin')]); 
} 

Meine Form sieht aus wie

<form method='post' action='{{ $action }}'> 
    // input fields and submit button 
</form> 

Mein Beitrag Methoden

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 
    } 
} 
+0

Sieht gut aus. Danke für das Teilen. – Kaley36