我想手动验证公司中的用户。问题是,我在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');