bantenprov/bantenprov-sso

基于Laravel框架的SSO客户端

dev-master 2017-12-10 10:05 UTC

This package is not auto-updated.

Last update: 2024-09-28 02:51:52 UTC


README

Scrutinizer Code Quality Build Status

本包用于Banten省一些应用的开发过程,其中要构建的应用概念是使用单点登录(集中认证)。

文档

在使用本包之前,有一些事项需要注意,甚至要非常注意,因为如果出现错误或规格不明确,这可能会导致一些功能无法正常工作

注意

  • 本包中开发的单点登录概念包括使用http请求,一个域名为profile的服务器作为客户端服务器,并使用cas服务器来触发。
  • Sso包通过IP地址和本地IP地址检测客户端,因此当有客户端使用SSO并在另一个标签页中打开另一个SSO应用时,本包将自动进行注册和登录。
  • BantenprovSso包仅与advancetruslaratrus包以及Laravel自带的auth包兼容,与其他认证包不兼容。本包仅能在Firefox和Chrome浏览器上良好运行。
  • 请与大家一起阅读并遵循此文档,以确保包的实施过程顺利。

应用程序演示

请在bantenprov profile应用程序中注册您的账户 http://profil-01.dev.bantenprov.go.id/

然后在此应用程序中登录

  1. SSO客户端一 http://client_satu.bangunbanten.com/login

  2. SSO客户端二 http://client_dua.bangunbanten.com/login

安装包

// 运行以下Composer命令以将包安装到您的项目中

composer require Bantenprov/BantenprovSso : dev-master

在.env文件中添加配置文件

在.env文件中添加以下几行代码

APPID=YOUR_APP_ID
TOKEN=YOUR_TOKEN
SSO_LOGIN=http://profil-01.dev.bantenprov.go.id/cas/v1/login
CHECK_LOGIN=http://profil-01.dev.bantenprov.go.id/cas/v1/check_login
CHECK_LOGOUT=http://profil-01.dev.bantenprov.go.id/cas/v1/check_logout
SSO_LOGOUT=http://profil-01.dev.bantenprov.go.id/cas/v1/logout

注册应用程序并获取您的app token

appid和token是您应用程序的凭证密钥,以便您可以向Bantenprov SSO服务器发送请求以注册您的应用程序。请查看http://profil-01.dev.bantenprov.go.id/页面上的列表,并进入开发者页面注册应用程序,您将立即获得应用程序的appid和token。

更新config/app.php文件

在config/app.php文件中添加以下几行代码

Bantenprov\BantenprovSso\BantenprovSsoServiceProvider::class,

运行Artisan命令

在您的终端中运行以下命令以发布一些路由、控制器和js资源文件

composer dump-autoload
php artisan vendor:publish
php artisan bantenprov-sso:add-route

添加meta代码

在登录页面或默认用户页面(用户未登录时显示)添加以下meta和javascript代码

  <meta name="ipaddress" id="locale" content="{{Session::get('ipaddress')}}" />
  <meta name="check_logout_url" id="locale" content="{{'cas/check_logout'}}" />
  <meta name="check_login_url" id="locale" content="{{'cas/check_login'}}" />
  <meta name="_token" id="locale" content="{{csrf_token()}}" />
  <meta name="logout_url" id="locale" content="{{url('logout')}}" />
  <meta name="auth_check" id="locale" content="{{(Auth::Check())?'1':'0'}}" />
  <meta name="current_url" id="locale" content="{{Request::fullUrl()}}" />
  <meta name="auth_page" id="locale" content="{{url('dashboard')}}" />

  <script type="text/javascript">
    var init_address = '{{ BantenprovSso::InitAddress() }}';
    //alert(init_address);
  </script>

在您的文件中包含.js数据

BantenprovSso包除了使用一些PHP模块外,还需要一些JavaScript脚本以运行其核心模块。因此,请将这些脚本添加到您的登录文件或默认未登录用户文件中

<script type="text/javascript" src="{{ asset('js/init_ipaddress.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/check_login.js') }}"></script>

还有一点很重要,请在您的登录表单中添加以下元素

为了抓取客户系统IP地址,需要通过输入页面发送IP数据,这些数据将被存储到SSO服务器上,并作为从其他应用程序登录的键来检测。

将其添加到登录页面的顶部文件。

<?php 
use Bantenprov\BantenprovSso\BantenprovSso as BantenprovSso;
?>

接下来,将以下脚本添加到登录表单中。这样,该元素将与客户凭据数据一起提交。

<div class="hide">
<input type="text" class="ip2" name="ip2" value="{{BantenprovSso::InitAddress()}}">
<input type="text" name="ip1" class="ip1" id="list"/>
</div>

更新用于登录表单操作的控制器方法

实际上,使用此SSO包是通过向已提供的SSO服务器查询凭据数据来加倍现有凭据数据的。因此,对于Adavatrust开发的方法,有一些用于处理认证过程的数据处理更改。以下是一个使用bantenprovSso进行认证的示例方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth, Redirect, Validator;
use App\User;
use Hash, Session;
use Bantenprov\BantenprovSso\BantenprovSso as BantenprovSso;


class DevelController extends Controller
{
    public function login()
    {
        if(!Auth::check())
        {
            return view('pages.credential.login');
        }
        return Redirect::to('dashboard');
    }

    public function post_login(Request $request)
    {
        $validator = Validator::make($request->all(), 
            [
                'email'         => 'required|email',
                'password'      => 'required'
            ]);

        if($validator->fails())
        {
            Session::flash('message', 'Data tidak boleh kosong');
            return redirect()->back()
                ->withErrors($validator)
                ->withInput();
        }
        $credential = [
        'email'         => $request->input('email'), 
        'password'      => $request->input('password'),
        'ipaddress'     => $request->input('ip1').'-'.$request->input('ip2')
        ];

        //set session 
        Session(['ipaddress' => $request->input('ip1').'-'.$request->input('ip2')]);

        if(!BantenprovSso::Attempt($credential))
        {
            //dd(BantenprovSso::message());
            Session::flash('message', 'terjadi kesalah, login tidak berhasil');
            return redirect()->back()
                ->withErrors(BantenprovSso::message())
                ->withInput();
        }
        //dd(BantenprovSso::data());
        $data = BantenprovSso::data();
        //check data user pada table user 
        $user = User::where('email', $data->email)
                ->first();
        if(count($user) == 0)
        {
            //return 'gak ada';
            //insert data user
            $create_user = new User;
            $create_user->email         = $data->email;
            $create_user->name          = $data->name;
            $create_user->password      = $data->password;
            $create_user->save();

            return Self::init_login($create_user);
        }
        else
        {
            return Self::init_login($user);
        }

    }

    public function init_login($data)
    {
        //login with id
        //dd($data->id);
        if(Auth::loginUsingId($data->id))
        {
            return redirect::to('dashboard');

        }
        else
        {
            //false
            return Redirect::to('login');
        }

    }

    public function check_logout(Request $request)
    {
        if(BantenprovSso::check_logout(['ipaddress' => $request->input('ipaddress')]))
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

    public function check_login(Request $request)
    {
        $check = BantenprovSso::check_login(['ipaddress' => $request->input('ipaddress')]);
        if(!$check)
        {
            return 0;
        }
        else
        {
            // cari atau simpan data baru
            $teng = BantenprovSso::check_login_data();
            $user_data = User::where('email', $teng->email)->first();
            if(count($user_data) == 0)
            {
                //simpan data baru
                $simpan = new User;
                $simpan->email          = $teng->email;
                $simpan->name           = $teng->name;
                $simpan->password       = 'bantenprov';
                $simpan->save();

                Auth::loginUsingId($simpan->id);
                return 1;
            }
            else
            {
                Auth::loginUsingId($user_data->id);
                return 1;
            }
        }
    }

    public function cas_logout()
    {
        Auth::logout();
        Session()->forget('ipaddress');
        return 1;
    }

    public function logout()
    {
        Auth::logout();
        BantenprovSso::Logout(['ipaddress' => Session::get('ipaddress')]);
        Session()->forget('ipaddress');
        return Redirect::to('/login');
    }

    public function test()
    {
        return BantenprovSso::init();
    }
}

提示:请仔细阅读并正确运行此文档,以确保实现过程顺利进行。

快乐的编码

祝您尝试成功

注意

  • 此包仍在开发阶段,如果出现错误或其他数据缺失,请告知。开发者可以通过电话085711511295或发送电子邮件至ahmadorin@gmail.com联系。

支持StackEdit