每个用户创建一个会话

时间:2020-03-09 02:00:17

标签: laravel-5

我正在尝试在Laravel 5.4中为每个用户创建1个会话。如何在我的Laravel中配置1个会话用户。这是我的登录控制器。

我的意思是,如果我登录Chrome。我无法登录Mozilla。因此,我首先退出Chrome或Swap。

登录控制器

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Auth;
use Illuminate\Http\Request;
use Validator;
use DB;
use App\d_mem;
use Redirect;
use Session;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Adldap;

class LoginController extends Controller
{

    protected $exceptionUsers = ['admin', 'user1', 'user2','bhandoko','ksoleh'];

    public function index()
    {
        return view('auth.login');
    }
    public function welcome()
    {
        return view('welcome');
    }
    // use AuthenticatesUsers;
    public function login(Request $req)
    {

        $user = d_mem::where('m_username',$req->username)->first();

            if ($user && $user->m_password == sha1(md5('لا إله إلاّ الله') . $req->password)) { 
            $response = true;
        }


        if ($response) {
            $usernm = $req->username;
            Auth::login($user);

            $ses = DB::select("SELECT d.m_id,
                                      d.m_name as nama,
                                      d.m_manager,
                                      d.m_lead,
                                      d.m_coordinator,
                                      d.m_specialist,
                                      d.m_email as email,
                                      (SELECT dm.m_name from d_mem dm where  dm.m_id=d.m_manager LIMIT 1) as manager ,
                                      u2.m_name as lead,
                                      u3.m_name as coor,
                                      u7.m_name as spec,
                                      u4.u_name as role,
                                      u5.u_name as unit,
                                      u5.u_id   as unit_id,
                                      u5.u_role as unit_role,
                                      u5.u_flag as unit_flag,
                                      u6.s_id   as site_id,
                                      u6.s_name as site_name 
                    from d_mem d
                    LEFT JOIN d_mem u2 ON u2.m_id=d.m_lead
                    LEFT JOIN d_mem u3 ON u3.m_id=d.m_coordinator
                    LEFT JOIN d_mem u7 ON u7.m_id=d.m_specialist
                    LEFT JOIN d_unit u4 ON u4.u_id=d.m_access
                    LEFT JOIN d_unit u5 ON u5.u_id=d.m_unit
                    LEFT JOIN d_site u6 ON u6.s_id=d.m_site
                    where d.m_username = '$usernm'
                    ");

            // return json_encode($ses);
            Session::put('id',$ses[0]->m_id);
            Session::put('username',$req->username);
            Session::put('name',$ses[0]->nama);
            Session::put('unit',$ses[0]->unit);
            Session::put('unit_id',$ses[0]->unit_id);
            Session::put('unit_role',$ses[0]->unit_role);
            Session::put('unit_flag',$ses[0]->unit_flag);
            Session::put('email',$ses[0]->email);
            Session::put('role',$ses[0]->role);
            Session::put('coor',$ses[0]->coor);
            Session::put('lead',$ses[0]->lead);
            Session::put('spec',$ses[0]->spec);
            Session::put('spec_id',$ses[0]->m_specialist);
            Session::put('coor_id',$ses[0]->m_coordinator);
            Session::put('lead_id',$ses[0]->m_lead);
            Session::put('manager_id',$ses[0]->m_manager);
            Session::put('manager',$ses[0]->manager);
            Session::put('site',$ses[0]->site_id);
            Session::put('site_name',$ses[0]->site_name);

            $data = DB::table('d_mem')->where('m_username',$req->username)->update(['m_lastlogin'=>date('Y-m-d h:i:s')]);

            return redirect(url('/home'));
        }else{
            return Redirect::back()->withErrors(['Wrong Username / Password !']);
        }
    }

    use AuthenticatesUsers;

    public function logout(Request $request)
    {

        Auth::logout();
        $data = DB::table('d_mem')->where('m_username',Session::get('username'))->update(['m_lastlogout'=>date('Y-m-d h:i:s')]);
        $request->session()->regenerate();
       return redirect('/login')->with('info', 'You have successfully logged out');
    }
}

逐步告诉我如何在Laravel 5.4中实现一个会话一次登录。 谢谢

1 个答案:

答案 0 :(得分:0)

我用于允许每次登录一个会话的解决方案是,我将database用于会话驱动程序,并且在每个登录请求中,我首先从数据库表中删除所有现有的用户会话(使用user_id列)然后为用户创建一个新会话。简而言之,无论何时从新设备登录,用户都将从所有其他设备注销。

要创建sessions表,请使用以下命令

php artisan session:table

然后在验证用户身份之后,在您的login()方法中添加以下行

DB::table('sessions')->where('user_id',$user->id)->delete();

注意:由于我的应用程序没有很多用户,因此该解决方案对我有用,但是如果您的应用程序依赖于很多用户,我建议您使用memcache之类的内存中存储或redis作为会话驱动程序。