当前位置: 首页 > 知识库问答 >
问题:

我正在尝试为用户和管理员实现Laravel5.2多重身份验证。但未定义身份验证用户提供程序[]错误已给出

嵇浩淼
2023-03-14

我一直在问这个问题,谁能举例说明Laravel5.2多重身份验证

使用管理和用户表实现多表身份验证。我已经完成了上面提到的所有步骤,如添加管理员作为提供者,在配置/auth.php中保护,为管理员创建身份验证控制器,为管理员创建中间件。但是在我运行我的项目后,它说身份验证用户提供者[]没有定义。但是我在配置/auth.php中定义了管理员和用户的提供者。我使用了不同的登录和注册表单,用户和管理员的控制器。当用户或管理员登录时,我想在导航栏中显示用户或管理员名称。为此,我使用了laravel docs(master file html附件中的代码)中所述的身份验证保护。我已经坚持这个错误6天了。我急切地需要你的帮助。这是我的附件配置/auth.php

    return [



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



'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
    'user' =>[
    'driver' => 'session',
    'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],



'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
        'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],



'passwords' => [
    'users' => [
        'provider' => 'users',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
        'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],

];

routes.php

    <?php


Route::get('/', function () {
    return view('welcome');
});

Route::auth();

Route::get('/home', 'HomeController@index');

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

}); 

app/Http/Controllers/AdminAuth/AuthController.php

namespace App\Http\Controllers\AdminAuth;

use App\Admin;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{


    use AuthenticatesAndRegistersUsers, ThrottlesLogins;


    protected $redirectTo = '/admin';
    protected $guard = 'admin';
    //protected $redirectTo = '/';

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    }


    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
        ]);
    }

            protected function create(array $data)
    {
        return Admin::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
    public function showLoginForm()
    {
        if (view()->exists('auth.authenticate')) {
            return view('auth.authenticate');
        }

        return view('admin.auth.login');
    }
    public function showRegistrationForm()
    {
        return view('admin.auth.register');
    } 
}

Admin.php

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;


class Admin extends Authenticatable
{

    protected $fillable = [
        'name', 'email', 'password',
    ];


    protected $hidden = [
        'password', 'remember_token',
    ];
}

AdminController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use Illuminate\Contracts\View\View;

class AdminController extends Controller
{

    protected $guard =  'admin';

     public function __construct(){
        $this->middleware('admin');
    }
    public function index(){
        return view('admin.home');
    }

}

管理中间件

<?php

namespace App\Http\Middleware;

use Closure;

class RedirectIfNotAdmin
{

    public function handle($request, Closure $next, $guard = 'admin')
    {
        if (!Auth::guard($guard)->check()) {
            return redirect('/');
        }

        return $next($request);
    }
}

显示管理员的主布局

<!-- Authentication Links -->
                    @if (Auth::guard('admin')->guest())
                        <li><a href="{{ url('/login') }}">Login</a></li>
                        <li><a href="{{ url('/register') }}">Register</a></li>
                    @else
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
                                {{ Auth::guard('admin')->user()->name }} <span class="caret"></span>
                            </a>

                            <ul class="dropdown-menu" role="menu">
                                <li><a href="{{ url('/logout') }}"><i class="fa fa-btn fa-sign-out"></i>Logout</a></li>
                            </ul>
                        </li>
                    @endif

共有1个答案

乔丁雨
2023-03-14

我认为这会有帮助。http://blog.sarav.co/multiple-authentication-in-laravel/

为什么不试试使用内置的用户模型并用它扩展admin呢。

 类似资料:
  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • 在我的LaravelV5.4项目中,我有两个模型:用户和管理员。 在config/auth.php中,我向警卫和提供者添加了admin,如下所示: 现在在AdminController类中,我想使用Auth::true函数,但默认情况下它使用用户表。我可以在config/auth.php中更改默认值,如下所示,它可以工作,但在这种情况下,我不能为用户使用auth::trunt。 我想将用户设置为默

  • 我在调试身份验证问题时遇到了这个代码片段: 我在调试和摆弄用户凭证时注意到,如果第一个身份验证提供者(即< code > userdailsservice )无法对我的用户进行身份验证,那么就会远程调用我的LDAP服务器来尝试对我的用户进行身份验证。但是,如果第一个身份验证提供者成功地对我的用户进行了身份验证,则不会调用第二个身份验证提供者。 我的问题是,列出这些身份验证提供者的工作方式是否使得如

  • 我正在尝试从Ldap服务器对用户进行身份验证。 以下是我的Ldap用户: 我的管理员的路径是cn=admin,dc=ldap,dc=agem,dc=com 我错过了什么?

  • 我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向

  • 我正在使用React并尝试处理用户的密码更改。我正在发送一个如下的POST请求: ...我得到一个401错误:“未提供身份验证凭据”。 然而,如果我通过邮递员发送完全相同的请求,那么效果很好。 我也在同一个应用程序中执行GET请求以获取用户数据,它也可以毫无问题地工作: 可能是什么问题。。。?