热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

迁移yaf项目到laravel5.5,并全面使用passport提供API之自定义加密方式(一)

因为之前的项目是基于yaf的,个人觉得开发相率上laravel更好,所以迁移到laravel上使用。这就会遇到一个兼容性的问题,比如用户登录就不行,以前加密方式也是自己写的,所以迁

因为之前的项目是基于yaf的,个人觉得开发相率上laravel 更好,所以迁移到laravel上使用。这就会遇到一个兼容性的问题,比如用户登录就不行,以前加密方式也是自己写的,所以迁移起来,首先就要解决用户登录问题了

laravel 自带的登录

App\Http\Controllers\Auth\LoginController 里面用了一个trait AuthenticatesUsers,主要的登录逻辑在这里:

  • showLoginForm 显示登录界面
  • login 处理登录请求
  • validateLogin 验证登录请求信息
  • attemptLogin 登录(重要)
  • credentials 过滤不需要的请求信息
  • sendLoginResponse 返回成功登录信息
  • authenticated 认证
  • sendFailedLoginResponse 返回登录失败信息
  • username 默认使用登录的字段,(如果你使用的是phone,那么重写这个方法就可以了)
  • logout 退出登录
  • guard获取守卫者

具体的细节就不说了,主要就看attemptLogin

protected function attemptLogin(Request $request)
{

return $this->guard()->attempt(
$this->credentials($request), $request->has('remember')
);
}
protected function guard()
{
return Auth::guard();
}

$this->guard()就是获取到Auth:guard(),那么这个facade又是什么呢,看一下这个facade:

protected static function getFacadeAccessor()
{
return 'auth';
}

那么看一下Illuminate\Foundation\ApplicationregisterCoreContainerAliases(别问我怎么一下找到Application来的,以后有机会说一下facade):

public function registerCoreContainerAliases()
{
foreach ([
'app' => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class],
'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
'auth.driver' => [\Illuminate\Contracts\Auth\Guard::class],
'blade.compiler' => [\Illuminate\View\Compilers\BladeCompiler::class],
'cache' => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
....
//省略

可以看到auth 就是\Illuminate\Contracts\Auth\Factory::class的具体实现类\Illuminate\Auth\AuthManager::class,那么我们就可以找到上文说的guard

public function guard($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return isset($this->guards[$name])
? $this->guards[$name]
: $this->guards[$name] = $this->resolve($name);
}
public function getDefaultDriver()
{
return $this->app['config']['auth.defaults.guard'];
}

这里就看到了,默认是configauth.php的配置项web:

'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],

接着看$this->resolve('web')是返回了什么鬼:

protected function resolve($name)
{
$cOnfig= $this->getConfig($name);
//$cOnfig=[ 'driver' => 'session', 'provider' => 'users']
if (is_null($config)) {
throw new InvalidArgumentException("Auth guard [{$name}] is not defined.");
}

if (isset($this->customCreators[$config['driver']])) {
return $this->callCustomCreator($name, $config);
}
//$driverMethod=createSessionDriver
$driverMethod = 'create'.ucfirst($config['driver']).'Driver';
if (method_exists($this, $driverMethod)) {
return $this->{$driverMethod}($name, $config);
}
throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined.");
}

由上面可以知道,最后跑到了createSessionDriver这个方法了:

//$cOnfig=[ 'driver' => 'session', 'provider' => 'users']
public function createSessionDriver($name, $config)
{
//$provider=EloquentUserProvider($this->app['hash'], $config['model']);

$provider = $this->createUserProvider($config['provider'] ?? null);
$guard = new SessionGuard($name, $provider, $this->app['session.store']);

if (method_exists($guard, 'setCOOKIEJar')) {
$guard->setCOOKIEJar($this->app['COOKIE']);
}
if (method_exists($guard, 'setDispatcher')) {
$guard->setDispatcher($this->app['events']);
}
if (method_exists($guard, 'setRequest')) {
$guard->setRequest($this->app->refresh('request', $guard, 'setRequest'));
}
return $guard;
} public function createUserProvider($provider = null)
{
//$provider=user
if (is_null($cOnfig= $this->getProviderConfiguration($provider))) {
return;
}

//$cOnfig= ['driver' => 'eloquent','model' => App\User::class,]
//我们没有自定义自己的提供器,所以这一坨跳过,那么怎么自定义自己的呢,使用Auth::provider
//
//public function provider($name, Closure $callback)
//{
// $this->customProviderCreators[$name] = $callback;
//
// return $this;
// }
// 具体可以看文档https://d.laravel-china.org/docs/5.5/authentication
if (isset($this->customProviderCreators[$driver = ($config['driver'] ?? null)])) {
return call_user_func(
$this->customProviderCreators[$driver], $this->app, $config
);
}
//$driver=eloquent
switch ($driver) {
case 'database':
return $this->createDatabaseProvider($config);
case 'eloquent':
//return new EloquentUserProvider($this->app['hash'], $config['model']);
return $this->createEloquentProvider($config);
default:
throw new InvalidArgumentException(
"Authentication user provider [{$driver}] is not defined."
);
}
}

所以Auth::guard()最后返回一个SessionGuard实例,接着看一下sessionGuard里面找一下attempt方法:

// $this->guard()->attempt($this->credentials($request), $request->has('remember'));
public function attempt(array $credentials = [], $remember = false)
{
//很任性的不管
$this->fireAttemptEvent($credentials, $remember);
//$this->provider 就是上面的 EloquentUserProvider($this->app['hash'], $config['model']);
//具体就是查找用户,太简单了,不说了
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
//这里就是验证用户密码是不是相同的地方
if ($this->hasValidCredentials($user, $credentials)) {
$this->login($user, $remember);
return true;
}
$this->fireFailedEvent($user, $credentials);
return false;
} protected function hasValidCredentials($user, $credentials)
{
return ! is_null($user) && $this->provider->validateCredentials($user, $credentials);
}

可以看最后是在EloquentUserProvider 里面验证了用户的密码是不是相同:

public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}

所有到这里我们就找到问题的根源了(你说是不是很蛋疼,找一个问题费老大劲),那么我们要解决旧系统的密码加密问题,有两个办法:

  • 自定义用户提供器(目前不就是使用的EloquentUserProvider,’我们自定义一个,再重写一下validateCredentials就可以了)
  • 重写 $this->hasher

感觉一次写的有点多了,下次在写具体方法吧


推荐阅读
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
author-avatar
涩味122_508
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有