【问题标题】:Can we use same route for authenticated and non-authenticated users in laravel with same controller and same view?我们可以在具有相同控制器和相同视图的 laravel 中为经过身份验证和未经身份验证的用户使用相同的路由吗?
【发布时间】:2023-03-31 15:29:01
【问题描述】:
// route which should be used by authenticated and unauthenticated user 
Route::get('user/send-parcel', 'User\SenderController@sendParcerl');

我已尝试在 web 中添加此路由(在此 auth 中间件之外)。它工作正常,但在我的控制器中,如果用户未登录,我必须添加用户 ID,如果用户未登录 user_id 字段应包含 NULL 的值。

$user = Auth::user();
$parcel->user_id = isset($user) ? $user->id : NULL;

主要问题是如果我将路由放在 Auth 中间件之外,它将无法在我的控制器中获得 Auth。因此该代码适用于未经身份验证的用户,但对于经过身份验证的用户,它还将NULL 放在user_id 字段中

【问题讨论】:

  • 你能发布你的路线吗?
  • 请向我们展示控制器功能sendParcerl()代码。你需要有一个 user->id 或者它可以是 null 吗?
  • 这是 api 身份验证还是会话身份验证?
  • Route::group(['middleware' => 'auth:user'], function () { Route::get('send-parcel', 'User\SenderController@sendParcerl'); });但我希望这条路由在 auth 和 unauth 用户中使用,所以我把它放在这个中间件之外,但结果是我的控制器如果用户登录并尝试添加数据,它会给我 NULL
  • 您的路由受 Auth 中间件保护,因此您可以删除路由中间件、从中间件中删除此路由或编写另一个指向同一控制器@函数的路由。

标签: php laravel laravel-5


【解决方案1】:

是的,你可以。 在您的控制器中,您必须使用自己的中间件添加构造。

public function __construct()
{
    $this->middleware(function ($request, $next) {

        $this->user = $request->user('api');

        return $next($request);
    });
}

这里最重要的部分是

$request->user('api');

如果您的路由是公开的(没有任何中间件进行限制),它将使用所有可公开访问的信息,因此不会有会话、令牌等。 $request->user(); 无法正常使用。

幸运的是 $request->user() 可以接受参数

 /**
 * Get the user making the request.
 *
 * @param  string|null  $guard
 * @return mixed
 */
public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}

所以如果你执行 $request->user('api'),它将使用 api 保护检索用户,因为这些信息可以在 'api' 保护中访问。

现在在您的代码中,您可以检查 $this->user 是否为 null(null 它将不是登录用户,对象它将是登录用户)。

来源:答案 #1,此处为第 3 点 https://www.py4u.net/discuss/32099

【讨论】:

    【解决方案2】:

    简单的回答是可以。

    它是如何工作的,如果你看看这个页面:https://laravel.com/docs/5.8/authentication#authentication-quickstart

    您将看到一个解释如何检查用户是否登录的部分。

    确定当前用户是否经过身份验证

    要确定用户是否已经登录到您的应用程序,您可以使用 Auth 门面的 check 方法,如果用户通过身份验证,它将返回 true:

        use Illuminate\Support\Facades\Auth;
    
        if (Auth::check()) {
            // The user is logged in...
        }
    

    因此,在您的控制器中,添加 Auth 外观后,您可以这样做:

    if (Auth::check()) {
        // do something with an authenticated user
    } else {
       // do something with a non-authenticated user
    }
    // shared code between all kind of users
    

    正如 Laravel 的文档中提到的,大多数情况下建议使用中间件并重定向到不同的控制器。

    【讨论】:

    • 如果用户登录(没有授权中间件路线),问题是它进入其他部分
    • 我不确定你的意思。 Auth::check() 返回真或假。它不会重定向任何东西,它只是查看用户是否登录。Auth 中间件和 Auth 门面之间存在差异。
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2013-06-17
    • 2017-09-11
    • 2019-03-12
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多