laravel的服务-用户认证
1.相关文件:
config/auth.php - 认证配置
app/user.php - Eloquent模型类(同我们自己生成的Eloquent类不同)
app/Http/Controller/Auth/AuthController.php - 注册和登录相关的控制器
app/Http/Controller/Auth/PasswordController.php - 找回密码控制器
2.运行命令:
php artisan make:auth - 生成认证路由和视图
生成文件:
app/Http/Controller/HomeController.php - 用户个人中心控制器
resources/views/auth/* - 所有认证需要的视图
resources/views/layouts/* - 应用的基础布局视图
resources/views/home.blade.php - 用户个人中心视图
resources/views/welcome.blade.php - 欢迎视图
添加的路由:
3.认证构建成功后,开始构建认证逻辑:
1>自定义路径
用户登录成功后,默认会跳转到 "/"。改变默认跳转路径,在AuthController.php中设置 $redirectTo 属性
protected $redirectTo = "/home";
登录认证失败后,会跳回表单登录页
2>自定义用户认证 "Guard"
在AuthController.php中设置 $guard 属性
protected $guard = "admin";
注意:
$guard属性的值对应认证配置文件 config/auth.php 中的相应 guard 配置
3>自定义验证/存储
1)新用户注册所必需的字段,以及如何修改字段来存储(密码加密等)
AuthController.php 的 create() 方法
2)验证用户输入字段
AuthController.php 的 validator() 方法
4>获取认证用户:
1)通过 Auth Facade的user()方法,访问认证用户:
$user = Auth::user();
2)用户通过认证后,通过 "IlluminateHttpRequest" 实例访问认证用户
IlluminateHttpRequest; // 引入
class ProfileController extends Controller{
public function updateProfile(Request $request)
{
if ($request->user()) {
// $request->user() 返回认证用户实例...
}
}
}
3)通过 Auth Facade的check()方法,判断用户是否通过认证,通过后返回true:
Auth::check()
5>路由保护
给需要用户认证的路由,添加中间件。认证中间件在:
appHttpMiddlewareAuthenticate.php
我们要做的只是,将中间件添加到某些路由上:
1)使用路由闭包
Route::get("profile", ["middleware" => "auth", function() {
// 只有认证用户可以进入...
}]);
2)使用控制器
Route::get("profile", [
"middleware" => "auth",
"uses" => "ProfileController@show"
]);
3)正在使用控制器类,也可以在控制器的构造方法中使用,该控制器中的所有方法,都会进行认证:
public function __construct(){
$this->middleware("auth");
}
指定使用哪一个guard来实现认证:
Route::get("profile", [
"middleware" => "auth:api", // 使用api类型的guard
"uses" => "ProfileController@show"
]);
注意:
指定的guard,与config/auth.php中的$guards数组的键对应!(默认有 "web" & "api" 2个)
6>登录失败次数限制
可以使用 "IlluminateFoundationAuthThrottlesLogins" 来限制用户登录失败次数。
看文档!
4.手动认证用户:
不使用Laravel自带的认证控制器,直接使用Laravel认证类来管理用户认证。通过 "Auth" Facade 来访问认证服务。
1>示例:
use Auth; // 直接引入Auth服务
class AuthController extends Controller{
public function authenticate()
{
if (Auth::attempt(["email" => $email, "password" => $password])) {
// 认证通过...
return redirect()->intended("dashboard");
}
}
}
解释:
Auth::attempt() - 接收数组作为第一个参数,从数据表查询用户,再进行密码比对。成功返回true,失败false
redirect()->intended() - 将用户重定向到登录之前用户想要访问的 URL,在目标 URL 无效的情况下备用 URI 将会传递给该方法
2>访问指定的Guard实例:
Auth::guard("admin")->attempt() - guard()方法的guard名,对应 config/auth.php中的$guards配置的某个键
3>退出应用,使用 "Auth" 的 logout(),会清除用户session
Auth::logout();
4>记住用户
在应用中提供 "记住我" 的功能,需要2点:
1)给Auth::attempt(),传递第二个参数。"boolean" 类型的 true
2)users表中,必需包含 "remember_token" 字段
示例:
if (Auth::attempt(["email" => $email, "password" => $password], $remember)) {
// The user is being remembered...
}
开启了 "记住我" 功能,可通过 "viaRemember" 来判断用户是否使用 "记住我" cookie进行认证:
if (Auth::viaRemember()) {
//
}
5>认证一个用户实例
Auth::login($user); // $user - 是一个用户实例
注意:
$user用户实例,必需是"IlluminateContractsAuthAuthenticatable" 的实现,自带的 AppUser 模型已经实现该接口。
6>通过ID认证用户:
Auth::loginUsingId(1); // 认证用户的主键作为参数
7>一次性认证用户:
只在单个请求中将用户登录到应用,而不存储任何 Session 和 Cookie,这在构建无状态的 API 时很有用
Auth::once() - 同 attempt() 用法类似
5.基于HTTP的基本认证(就是浏览器会自动弹出一个认证框,不是我们应用里的登录认证。。)
HTTP基本认证能够帮助用户快速实现登录认证而不用设置专门的登录页面!就是为了方便!
1>只需要在路由上,添加上 "auth.basic" 中间件!
示例:
Route::get("profile", ["middleware" => "auth.basic", function() {
// 只有认证用户可以进入...
}]);
注意:
默认情况下,auth.basic 使用用户信息的 "email" 字段作为 "用户名" 来认证!可以在 AuthController.php中修改 $username = "name" 来改变字段(可能是这个...)
2>使用 PHP FastCGI,HTTP基本认证将不能正常工作,需要在 ".htaccess" 加入:
apache服务器:
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
nginx服务器:
有时间了再上网查查
3>无状态的HTTP基本认证
一次性访问,不需要session和cookie,同样是API认证。需定义一个调用 "Auth::onceBasic()" 的中间件。
示例:
use Auth;
class AuthenticateOnceWithBasicAuth{
public function handle($request, Closure $next)
{
return Auth::onceBasic() ?: $next($request); // 调用 "Auth::onceBasic()"
}
}
路由中,添加中间件:
Route::get("api/user", ["middleware" => "auth.basic.once", function() {
// 只有认证用户可以进入...
}]);
6.重置密码:
1>要求:
1)app/User.php模型,需要实现 "IlluminateContractsAuthCanResetPassword"。自带的 "app/User.php" 已经实现了该接口。
2)存储充值令牌的表必需被创建,laravel已经自带了这张表的迁移:database/migrations/create_password_resets_table
2>命令:
php artisan migrate - 生成数据表
php artisan make:auth - 同认证一样,生成视图和路由,已经生成了!
3>涉及到的文件:
app/Http/Controller/Auth/PasswordController.php - 控制器
resources/views/auth/passwords/* - 视图
app/User.php - 模型
4>定义好重置用户密码路由和视图后,只需要在浏览器中访问这些路由即可。框架自带的 PasswordController 已经包含了发送密码重置链接邮件以及更新数据库中密码的逻辑。
5>自定义修改密码后,重定向连接:
修改 PasswordController.php 中的 $redirectTo 属性
protected $redirectTo = "/dashboard";
6>默认情况下,密码重置令牌一小时内有效,你可以通过修改 config/auth.php 文件中的选项reminder.expire 来改变有效时间。
7>自定义认证guard:
修改 PasswordController.php 中的 $guard 属性,同 "auth.php" 中的 $guards 的键对应
protected $guard = "admins";
8>自定义密码$broker
1)在 config/auth.php 中配置$broker,可配置多个重置密码(默认没有该属性)
2)修改 PasswordController.php 中的 $broker 属性,同 "auth.php" 中的 $broker 的键对应
protected $broker = "admins";
例如:
我们有一个 "前台用户表 - users" 和 "后台管理员表 - admins",就可能需要2个不同的重置密码
7.社会化登录认证
通过OAuth协议,进行简单、方便的认证。目前Laravel内置的 "Laravel Socialite" 支持:Facebook、Twitter、LinkedIn、GitHub和Bitbucket进行登录。
配置步骤:
1>在composer.json中添加依赖:
composer require laravel/socialite
2>在config/app.php中注册服务:
"providers" => [
LaravelSocialiteSocialiteServiceProvider::class,
],
3>在config/app.php中注册Facade,添加到$alias数组中:
"Socialite" => LaravelSocialiteFacadesSocialite::class,
4>在config/services.php中,添加OAuth服务认证信息,以 "github" 为例:
"github" => [
"client_id" => "your-github-app-id",
"client_secret" => "your-github-app-secret",
"redirect" => "http://your-callback-url",
],
5>开始认证用户:
1)需要2个路由,1.用于重定向用户到OAuth提供者;2.用户获取认证后的回调地址
Route::get("auth/github", "AuthAuthController@redirectToProvider");
Route::get("auth/github/callback", "AuthAuthController@handleProviderCallback");
2)在AuthController.php中,定义这2个方法(方法名,应该是可以自定义,因为我们可能引入多个不同的第三方服务)
// 引入 "Socialite" Facade
use Socialite;
class AuthController extends Controller{
// 将用户重定向到Github认证页面
public function redirectToProvider()
{
return Socialite::driver("github")->redirect();
}
// 从Github获取用户信息
public function handleProviderCallback()
{
$user = Socialite::driver("github")->user();
// $user->token;
}
}
3)基于Socialite::driver("github")的几个方法:
1.redirect() - 将用户发送到OAuth提供者
2.user() - 读取请求信息,并从提供者中获取用户信息
3.Socialite::driver("github")->scopes(["scope1", "scope2"])->redirect();
scopes() - 重写已存在的所有作用域
4)有了用户实例后,可以获取用户的更多详情:
$user = Socialite::driver("github")->user();
$token = $user->token;
$tokenSecret = $user->tokenSecret;
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
github教程可查看:
http://laravelacademy.org/post/1305.html
这里再粘贴段,将github认证后的用户信息,保存到数据库中:
public function handleProviderCallback()
{
$user = Socialite::driver("github")->user(); // 得到用户实例
// 数据库中没有该用户,插入用户!
if(!User::where("github_id",$user->id)->first()){
$userModel = new User;
$userModel->github_id = $user->id;
$userModel->email = $user->email;
$userModel->name = $user->name;
$userModel->avatar = $user->avatar;
$userModel->save();
}
$userInstance = User::where("github_id",$user->id)->firstOrFail();
Auth::login($userInstance);
echo $user->name."登录成功!";
}
8.添加自定义的Guard:
使用Auth::extend(),可在 "某个服务提供者"(我们可以直接使用系统自带的 "AuthServiceProvider") 的boot()方法中实现。
--------
详情看手册
--------
9.添加自定义用户提供者
理解:
我们该篇是针对的是 "Auth认证",这里的用户提供者,就是 "用户相关的表",针对的是 config/auth.php 中的 $provider 而言。默认支持2种:eloquent,database。
如果没有使用传统的关系型数据库,来存储用户信息。只能自己扩展Laravel了(网上查,必然有用户实现过了)
使用Auth::provider(),可在 "某个服务提供者"(我们可以直接使用系统自带的 "AuthServiceProvider") 的boot()方法中实现。
--------
详情看手册
--------
切换新的用户提供者:
配置 config/auth.php 中的 $providers 和 $guards 属性
2个契约,查看文档:
IlluminateContractsAuthUserProvider - 实现只负责从持久化存储系统中获取
IlluminateContractsAuthAuthenticatable - 实现,例如MySQL、Riak等等。这两个接口允许 Laravel 认证机制继续起作用而不管用户数据如何存储或者何种类来展现。
10.事件:
Laravel支持在认证过程中触发多种事件,可在自己的 EventServiceProvider 中监听这些事件(系统自带的app/Providers/EventServiceProvider.php):
protected $listen = [
"IlluminateAuthEventsAttempting" => [
"AppListenersLogAuthenticationAttempt",
],
"IlluminateAuthEventsLogin" => [
"AppListenersLogSuccessfulLogin",
],
"IlluminateAuthEventsLogout" => [
"AppListenersLogSuccessfulLogout",
],
];声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
