在Laravel 6上使用自定义身份验证



我想手动验证公司中的用户。问题是,我在Oracle数据库中有两个表,称为Student和Staff。

至于Student表,由于用户名和密码直接存储在表中,我得到了覆盖通过authscaffolding命令提供的内置Auth方法的想法。

对于Staff表,密码存储在不同的列/表中,并使用存储过程/包进行加密,因此获得用户验证的唯一方法是调用只返回0或1的包。

我所做的,

我编写了自己的Routes,并在LoginController中添加了自己的功能。

public function loginStaff(Request $req){
$username = Str::upper($req->input('username'));
$password = $req->input('password');
$users = PortalUser::where('ID', $username)->firstOrFail();
if ($users->user_type == 'STAFF'){
$queryResult = DB::select('select PACKAGE.validStaff(?,?) from dual',[$username, $password]);
if($queryResult == 1){
//this is where I would like to auth the user.
//using Auth::Attempt and Auth::Login will only run the default query
}
}

我已在控制器中成功返回值1和0。

那么,我还缺少什么吗?还是应该使用session((方法自己手动设置会话?

谢谢。

如果要手动验证用户,可以轻松使用会话。有以下代码作为参考:

//this is where I would like to auth the user.
//using Auth::Attempt and Auth::Login will only run the default query
// typically you store it using the user ID, but you can modify the session using other values.     
session()->put('user_id', user id from database here);

如果您想检查用户是否经过身份验证,请将RedirectIfAuthenticated中间件修改为:

<?php
namespace AppHttpMiddleware;
use AppProvidersRouteServiceProvider;
use Closure;
use IlluminateSupportFacadesAuth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param  IlluminateHttpRequest  $request
* @param  Closure  $next
* @param  string|null  $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (session()->has('user_id')) {
return redirect(  custom path here );
}
return $next($request);
}
}

当你想注销用户时,只需销毁会话密钥

session()->forget('user_id');

**注意:**许多广播和插件使用Laravel的身份验证系统(Guards(,如果你想将它们与自定义身份验证系统一起使用,你可能需要挂接它们的代码

Laravel提供自定义会话驱动程序,可用于创建或删除会话

<?php
namespace AppExtensions;
class MongoSessionHandler implements SessionHandlerInterface
{
public function open($savePath, $sessionName) {}
public function close() {}
public function read($sessionId) {}
public function write($sessionId, $data) {}
public function destroy($sessionId) {}
public function gc($lifetime) {}
}

希望它有帮助,如果没有,请在下面评论。会帮你的。

########更新#######

我认为你必须从Laravel 制作自定义HTTP会话

步骤1:在数据库中为会话创建另一个表,如下所示;

Schema::create('sessions', function ($table) {
$table->string('id')->unique();
$table->unsignedInteger('user_id')->nullable();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity');
});

步骤2:在会话中存储数据,通常使用put方法或session助手;

// Via a request instance...
$request->session()->put('key', 'value');
// Via the global helper...
session(['key' => 'value']);

步骤3:当您的功能返回1 时,获取特定用户的密钥

$value = $request->session()->get('key', function () {
return 'default';
});

步骤4:删除会话,一段时间后,出于安全原因,您需要删除会话,然后您就可以这样做了。

$value = $request->session()->pull('key', 'default');

相关内容

  • 没有找到相关文章

最新更新