Laravel 5.2 的身份验证系统基于守卫(Guard)和提供者(Provider)的概念构建:
在 app/Http/Controllers/Auth/AuthController.php
中:
protected function getCredentials(Request $request)
{
return [
'email' => $request->input('email'),
'password' => $request->input('password'),
'active' => 1, // 添加额外条件
];
}
在 config/auth.php
中:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admin' => [ // 自定义守卫
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [ // 自定义提供者
'driver' => 'database',
'table' => 'admins',
],
],
创建自定义提供者类:
namespace App\Providers;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;
class CustomUserProvider implements UserProvider
{
public function retrieveById($identifier)
{
// 实现根据ID获取用户
}
public function retrieveByToken($identifier, $token)
{
// 实现根据token获取用户
}
public function updateRememberToken(Authenticatable $user, $token)
{
// 更新记住我token
}
public function retrieveByCredentials(array $credentials)
{
// 根据凭证获取用户
}
public function validateCredentials(Authenticatable $user, array $credentials)
{
// 验证用户凭证
}
}
然后在 AuthServiceProvider
中注册:
Auth::provider('custom', function($app, array $config) {
return new CustomUserProvider();
});
在 AuthController
中:
protected function authenticated(Request $request, $user)
{
// 登录成功后的逻辑
return redirect()->intended('/dashboard');
}
protected function sendFailedLoginResponse(Request $request)
{
// 登录失败后的逻辑
return redirect()->back()
->withInput($request->only('email', 'remember'))
->withErrors([
'email' => '认证失败,请检查您的凭据',
]);
}
原因:redirectTo
属性未正确设置或中间件配置问题
解决:
protected $redirectTo = '/dashboard'; // 在AuthController中设置
原因:用户模型未实现 Illuminate\Contracts\Auth\Authenticatable
接口
解决:确保用户模型使用 Authenticatable
trait
原因:未在 getCredentials
方法中包含自定义字段
解决:
protected function getCredentials(Request $request)
{
return $request->only('email', 'password', 'custom_field');
}
Laravel 5.2 的身份验证系统虽然相对简单,但通过合理的扩展和定制,可以满足大多数应用场景的需求。
没有搜到相关的文章