这一定是很容易的事情,但是我在Laravel中没有很多经验,而且我一直在寻找和尝试,没有运气。
我正在处理一个现有项目,并且它的某些路由使用auth:api
中间件,例如:
Route::group(['namespace' => 'Api', 'prefix' => 'api', 'middleware' => 'auth:api', 'throttle:100,1'], function () {
// Route.....
});
在这些路由的任何控制器中,Auth :: user()可以正常工作,并返回登录的用户实例。到目前为止,一切都很好。
现在,我有另一套路由是公用的,因此它们不使用auth:api
中间件。但是,已登录的用户也可以访问这些路由,并且基于此条件(无论是否已登录),我想运行其他逻辑。综上所述,登录页面和公共用户均可访问该页面。但是如果用户已登录,我们将运行其他逻辑。但是,当我尝试使用Auth::user()
时,它返回null,而auth()->check()
返回false。
请记住,我不能使用auth中间件,因为这将限制公共用户访问页面,这不是我们所需要的。
答案 0 :(得分:1)
如果用户具有要认证的所需信息,则可以在用户请求路由时手动对其进行认证。如果他不这样做,那么您可以对未经身份验证的用户使用您的逻辑。
https://laravel.com/docs/5.7/authentication#authenticating-users
答案 1 :(得分:1)
您应将auth与防护一起使用。
{{ \Auth::guard('api')->user(); }}
答案 2 :(得分:0)
或者,您可以通过Illuminate \ Http \ Request实例访问经过身份验证的用户。
解释
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
/**
* Update the user's profile.
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
// $request->user() returns an instance of the authenticated user...
}
}
选中here
答案 3 :(得分:0)
虽然调用Auth::guard('api')->user()
可以正常工作,但我发现每次尝试访问经过身份验证的用户时都必须设置默认保护措施非常难看。
您可以做的是创建一个新的中间件,该中间件为特定路由设置默认防护。
创建一个新的中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;
class DefaultGuard
{
/**
* The authentication factory instance.
*
* @var Auth
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param Auth $auth
*
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param $request
* @param Closure $next
* @param $guard
*
* @return mixed
*/
public function handle($request, Closure $next, $guard)
{
$this->auth->shouldUse($guard);
return $next($request);
}
}
将其添加到$routeMiddleware
中的app\Http\Kernel.php
属性中
protected $routeMiddleware = [
'guard' => DefaultGuard::class,
];
将其应用于您的公共路线:
Route::group([ 'middleware' => 'guard:api'], function () {
// Route.....
});
现在,您可以像往常一样访问经过身份验证的用户,例如:
Auth::user();
$request->user();
etc.