Heim >PHP-Framework >Laravel >Verwendung des Auth-Moduls von Laravel

Verwendung des Auth-Moduls von Laravel

Guanhui
Guanhuinach vorne
2020-05-02 11:29:273896Durchsuche

Dieser Artikel basiert auf der Analyse und dem Schreiben des Auth-Modulcodes der Laravel 5.4-Version.

Modulzusammensetzung

Das Auth-Modul ist funktional in zwei Teile unterteilt Teile: Benutzerauthentifizierung und Berechtigungsverwaltung In Bezug auf die Dateizusammensetzung ist das IlluminateAuthPasswords-Verzeichnis ein kleines Modul zum Zurücksetzen von Passwörtern oder zur Verarbeitung vergessener Passwörter. IlluminateAuth ist ein Modul, das für die Benutzerauthentifizierung und Berechtigungsverwaltung verantwortlich ist und ein System zum Anmelden und Ändern von Passwörtern bereitstellt , Zurücksetzen von Passwörtern usw. Logikimplementierung; Die folgende Abbildung zeigt die Beziehung zwischen den verschiedenen Dateien des Auth-Moduls und gibt eine kurze Erklärung

Verwendung des Auth-Moduls von Laravel

Benutzerauthentifizierung

HTTP selbst Es ist zustandslos, normalerweise wird im Prozess der Systeminteraktion die Konto- oder Token-Identifikation verwendet, um den authentifizierten Benutzer zu bestimmen

Interpretation der Konfigurationsdatei

return [
    'defaults' => [
        'guard' => 'web',
        ...
    ],
    'guards' => [  
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [    
            'driver' => 'token', 
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ], 
    ],
], 
];

Verstehen Sie von unten nach oben;

Anbieter ist eine Schnittstelle, die Benutzerdaten bereitstellt, und das Treiberobjekt und das Zielobjekt müssen hier markiert werden. Der Schlüsselname Benutzer ist der Name einer Reihe von Anbietern, die von ihnen gesteuert werden Der eloquente und modale Teil ist AppUser::class; der Teil „Guards“ dient zum Konfigurieren des Authentifizierungsmanagements. Es gibt zwei Authentifizierungsmethoden, eine heißt Web und die andere ist API , die Benutzer-ID wird entsprechend der Sitzungs-ID abgerufen und der Benutzer wird im API-Anbieter abgefragt; die Wertinteraktion verwendet ebenfalls den Benutzeranbieter.

Standardelement zeigt an, dass die Webauthentifizierung verwendet wird Standard;

Authentifizierung

Sitzungsverbindliche Authentifizierungsinformationen:

// $credentials数组存放认证条件,比如邮箱或者用户名、密码
// $remember 表示是否要记住,生成 `remember_token`
public function attempt(array $credentials = [], $remember = false) 
 
public function login(AuthenticatableContract $user, $remember = false)
 
public function loginUsingId($id, $remember = false)

HTTP-Basisauthentifizierung, die Authentifizierungsinformationen werden im Anforderungsheader platziert; Zugriff über sessionId;

public function basic($field = 'email', $extraConditions = [])

wird nur in der aktuellen Sitzung authentifiziert und die Authentifizierungsinformationen werden nicht in der Sitzung aufgezeichnet:

public function once(array $credentials = [])
public function onceUsingId($id)
public function onceBasic($field = 'email', $extraConditions = [])

Während des Authentifizierungsprozesses (einschließlich Registrierung, vergessenes Passwort) wird die Definierte Ereignisse lauten wie folgt:

Ereignis „Verifizierungsversuch versucht“

Ereignis „Authentifizierte Verifizierung bestanden“

Ereignis „Verifizierung fehlgeschlagen“

Sperrung Die Anzahl der Fehler überschreitet den Grenzwert , sperren Sie die Anforderung, um erneut auf das Ereignis zuzugreifen

Logi-Ereignis wird aufgerufen, wenn Sie sich erfolgreich über „remember_token“ anmelden

Abmeldeereignis für Benutzerexit

Registrierungsereignis für registrierte Benutzer

Es gibt noch einige andere Authentifizierungsmethoden:

Überprüfen Sie, ob ein authentifizierter Benutzer vorhanden ist: Auth::check()

Den aktuellen authentifizierten Benutzer abrufen: Auth ::user()

System verlassen: Auth::logout()

Passwortverarbeitung

Konfigurationsinterpretation

return [
    'defaults' => [
        'passwords' => 'users',
        ...
    ],
    
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
]

Sehen Sie sich die Konfiguration von unten nach oben an ;

Das Passwortarray ist die Konfiguration zum Zurücksetzen des Passworts; Benutzer ist der Alias ​​des Konfigurationsschemas, das drei Elemente enthält: Anbieter (das Schema, das Benutzer bereitstellt, das ist das Anbieterarray oben), Tabelle (die Tabelle, die das Zurücksetzen speichert). Passwort-Token), Ablauf (Token-Ablaufzeit)

Standardelement legt das Standardschema zum Zurücksetzen von Passwörtern fest

Aufruf und Implementierung des Zurücksetzens von Passwörtern

Schauen wir uns zunächst an, wie die Passwort-Reset-Funktion von Laravel implementiert ist:

public function reset(array $credentials, Closure $callback) {
    // 验证用户名、密码和 token 是否有效
    $user = $this->validateReset($credentials);
    if (! $user instanceof CanResetPasswordContract) {
         return $user;
    }    
    
    $password = $credentials['password'];
    // 回调函数执行修改密码,及持久化存储
    $callback($user, $password);
    // 删除重置密码时持久化存储保存的 token
    $this->tokens->delete($user);
    return static::PASSWORD_RESET;
}

Schauen wir uns dann an, wie das vom FoundationAuth-Modul gekapselte Passwort-Reset-Modul heißt:

// 暴露的重置密码 API
public function reset(Request $request)   {
    // 验证请求参数 token、email、password、password_confirmation
    $this->validate($request, $this->rules(), $this->validationErrorMessages());
    // 调用重置密码的方法,第二个参数是回调,做一些持久化存储工作
    $response = $this->broker()->reset(
        $this->credentials($request), function ($user, $password) {
        $this->resetPassword($user, $password);
        }
    );
    // 封装 Response
    return $response == Password::PASSWORD_RESET
        ? $this->sendResetResponse($response)
        : $this->sendResetFailedResponse($request, $response);
}
// 获取重置密码时的请求参数
protected function credentials(Request $request)  {
    return $request->only(
        'email', 'password', 'password_confirmation', 'token'
    );
}
// 重置密码的真实性验证后,进行的持久化工作
protected function resetPassword($user, $password) {
    // 修改后的密码、重新生成 remember_token
    $user->forceFill([
        'password' => bcrypt($password),
        'remember_token' => Str::random(60),
    ])->save();
    // session 中的用户信息也进行重新赋值                                     
    $this->guard()->login($user);
}

„Passwort vergessen => Das Der allgemeine Prozess von „E-Mail senden => Passwort zurücksetzen“ ist wie folgt:

Klicken Sie auf „Passwort vergessen“, springen Sie über die Routing-Konfiguration zur Seite „Passwort vergessen“ und es gibt ein Feld „Zu sendende E-Mail“. auf der Seite.

Überprüfen Sie, ob die zu sendende E-Mail in der Datenbank vorhanden ist.

Dort wird eine E-Mail zum Zurücksetzen des Passworts gesendet ist ein Link in der E-Mail zum Zurücksetzen des Passworts (Nach dem Klicken wird das Token zur Seite zum Ändern des Passworts weitergeleitet) und die Datenbank speichert den Hash-verschlüsselten Wert dieses Tokens

Nach dem Ausfüllen der drei Felder Mit „E-Mail“, „Passwort“ und „Passwort bestätigen“ ermittelt der Carry-Token die drei Felder „E-Mail“, „Passwort“ und „Bestätigungspasswort“ und überprüft dann, ob das Token gültig ist Zurücksetzen ist erfolgreich;

Berechtigungsverwaltung

Die Berechtigungsverwaltung wird durch Fähigkeiten verwaltet, eine Array-Variable, die im Speicherbereich verwaltet wird. Die Struktur ist wie folgt:

$abilities = array(
    '定义的动作名,比如以路由的 as 名(common.dashboard.list)' => function($user) {
        // 方法的参数,第一位是 $user, 当前 user, 后面的参数可以自行决定
        return true;  // 返回 true 意味有权限, false 意味没有权限
    },
    ......
);

Aber nur durch die Verwendung von $abilities wird der definierte Teil des Codes zum Zusammenstellen verwendet, was zu umständlich ist. Daher entsteht eine Richtlinienstrategieklasse.

Richtlinienrichtlinienklasse definiert die entsprechende Beziehung zwischen einer Gruppe von Entitäten und Entitätsberechtigungsklassen. Nehmen Sie zum Beispiel den Artikel:

Es gibt eine modale Entitätsklasse namens Post, die dafür verwendet werden kann. Die Entitätsklasse definiert eine PostPolicy-Berechtigungsklasse und definiert einige Aktionen als Methodennamen in dieser Berechtigungsklasse;

class PostPolicy {
    // update 权限,文章作者才可以修改
    public function update(User $user, Post $post) {
        return $user->id === $post->user_id;
    }
}

und registriert sie dann im ServiceProvider, damit das System weiß, dass, wenn die Klasse, die Sie überprüfen möchten, ein Post-Objekt ist, fügen Sie Ihren Aktionsnamen hinzu Das System findet die entsprechende Methode der PostPolicy-Klasse. Wie ruft man

protected $policies = [
    Post::class => PostPolicy::class,
];

auf?

Für im Fähigkeiten-Array definierte Berechtigungen:

Ob der aktuelle Benutzer über die common.dashboard.list-Berechtigung verfügt: Gate::allows('common.dashboard.list')

Ob der aktuelle Benutzer über common.dashboard.list-Berechtigungen verfügt:! Gate::denies('common.dashboard.list')

Ob der aktuelle Benutzer über common.dashboard.list-Berechtigungen verfügt: $request-> ;user() ->can('common.dashboard.list')

Ob der aktuelle Benutzer über die Berechtigung common.dashboard.list verfügt:! $request->user()->cannot(' common.dashboard.list ')

指定用户是否具备common.dashboard.list权限:Gate::forUser($user)->allows('common.dashboard.list')

对于policy策略类调用的权限:

当前用户是否可以修改文章(Gate 调用):Gate::allows('update', $post)

当前用户是否可以修改文章(user 调用):$user->can('update', $post)

当前用户是否可以修改文章(用帮助函数):policy($post)->update($user, $post)

当前用户是否可以修改文章(Controller 类方法中调用):$this->authorize('update', $post);

当前用户是否可以修改文章(Controller 类同名方法中调用):$this->authorize($post);

指定用户是否可以修改文章(Controller 类方法中调用):$this->authorizeForUser($user, 'update', $post);

有用的技巧

获取当前系统注册的权限,包括两部分abilities和policies数组内容,代码如下:

$gate = app(\Illuminate\Contracts\Auth\Access\Gate::class);
$reflection_gate = new ReflectionClass($gate);
$policies = $reflection_gate->getProperty('policies');
$policies->setAccessible(true);
// 获取当前注册的 policies 数组
dump($policies->getValue($gate));
                                                                                                        
$abilities = $reflection_gate->getProperty('abilities');                                       
$abilities->setAccessible(true);
// 获取当前注册的 abilities 数组
dump($abilities->getValue($gate));

推荐教程:《Laravel教程

Das obige ist der detaillierte Inhalt vonVerwendung des Auth-Moduls von Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen