Advertisement
lignite0

GC\Auth\Staff

Jan 31st, 2017
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.64 KB | None | 0 0
  1. <?php
  2.  
  3. namespace GC\Auth;
  4.  
  5. use GC\Url;
  6. use GC\Logger;
  7. use GC\Response;
  8. use GC\Storage\AbstractEntity;
  9. use GC\Model\Staff\Staff as ModelStaff;
  10. use GC\Model\Staff\Session as ModelStaffSession;
  11. use GC\Model\Staff\Permission as Permission;
  12.  
  13. class Staff extends AbstractEntity
  14. {
  15.     private static $instance = null;
  16.     private static $config = [];
  17.  
  18.     private $permissions = [];
  19.  
  20.     public function __construct($staff_id, $data = [])
  21.     {
  22.         # całość jest łatwym do odczytu obiektem Entity
  23.        parent::__construct($data);
  24.  
  25.         # pobiera uprawnienia pracownika
  26.        $this->permissions = Permission::select()
  27.             ->fields('DISTINCT name')
  28.             ->source('::staff_membership JOIN ::staff_permissions USING(group_id)')
  29.             ->equals('staff_id', $staff_id)
  30.             ->fetchByMap('name', 'name');
  31.  
  32.         # jezeli istnieje flaga, ze trzeba zmienić hasło wtedy przekieruj
  33.        if ($this->getProperty('force_change_password', false)) {
  34.             redirect('/auth/force-change-password');
  35.         }
  36.  
  37.         logger('[STAFF] Authenticated', [$this->getProperty('name', 'Unnamed')]);
  38.     }
  39.  
  40.     /**
  41.      * Zwraca język edycji danych
  42.      */
  43.     public function getEditorLang()
  44.     {
  45.         # jeżeli w sesji nie ma języka edytora wtedy ustaw go z configa
  46.        if (isset($_SESSION['langEditor'])) {
  47.             return $_SESSION['langEditor'];
  48.         }
  49.  
  50.         return getConfig()['lang']['editorDefault'];
  51.     }
  52.  
  53.     /**
  54.      * Sprawdza czy pracownik ma uprawnienia do wykonania zadanych akcji
  55.      */
  56.     public function hasPermissions(array $requiredPermissions = [])
  57.     {
  58.         if (intval($this->getProperty('root', 0)) === 1) {
  59.             return true;
  60.         }
  61.  
  62.         foreach ($requiredPermissions as $requiredPermission) {
  63.             if (!in_array($requiredPermission, $this->permissions)) {
  64.                 return false;
  65.             }
  66.         }
  67.  
  68.         return true;
  69.     }
  70.  
  71.     /**
  72.      * Przekierowuje jezeli uzytkownik nie posiada uprawnień
  73.      */
  74.     public function redirectIfUnauthorized(array $permissions = [])
  75.     {
  76.         if (!$this->hasPermissions($permissions)) {
  77.             logger('[DENY] Not authorized', $permissions);
  78.             $perm = count($permissions) > 0 ? array_shift($permissions) : 'default';
  79.             redirect("/admin/account/deny/{$perm}");
  80.         }
  81.     }
  82.  
  83.     /**
  84.      * Sprawdza czy ciastko zostało wysłane i czy zawiera treść
  85.      */
  86.     public static function existsSessionCookie()
  87.     {
  88.         $name = getConfig()['session']['staff']['cookie']['name'];
  89.  
  90.         return isset($_COOKIE[$name]) and !empty($_COOKIE[$name]);
  91.     }
  92.  
  93.     public static function createFromSession()
  94.     {
  95.         # zmień ustawienia
  96.        static::configure();
  97.  
  98.         # jeżeli ciastko nie zostało nadesłane lub jest puste
  99.        if (static::existsSessionCookie() === false) {
  100.             static::abort('Cookie does not exists');
  101.         }
  102.  
  103.         # rozpoczyna sesję
  104.        static::start();
  105.  
  106.         # pobierz dane o pracowniku z tabelki sesji
  107.        $data = ModelStaff::select()
  108.             ->fields([
  109.                 'staff_id',
  110.                 'name',
  111.                 'email',
  112.                 'root',
  113.                 'lang',
  114.                 'expiry_datetime',
  115.                 'force_change_password',
  116.             ])
  117.             ->source('::session')
  118.             ->equals('session_id', session_id())
  119.             ->fetch();
  120.  
  121.         # jezeli sesja pracownika nie istnieje w bazie danych
  122.        if (!$data) {
  123.             static::abort("Staff session does not exists in database");
  124.         }
  125.  
  126.         if ($data['expiry_datetime'] <= sqldate()) {
  127.             static::abort('Session expired', '/auth/session-expired');
  128.         }
  129.  
  130.         $staff_id = $data['staff_id'];
  131.  
  132.         # aktualizacja czasu wygaśnięcia sesji
  133.        static::refreshSessionLifeTime($staff_id);
  134.  
  135.         # utworzenie obiektu pracownika
  136.        return new static($staff_id, $data);
  137.     }
  138.  
  139.     /**
  140.      * Przekierowuje i ustawia wiadomość w logach
  141.      */
  142.     public static function abort($message, $location = '/auth/login')
  143.     {
  144.         logger("[STAFF] {$message}");
  145.         static::destroySession();
  146.         redirect($location);
  147.     }
  148.  
  149.     /**
  150.      * Tworzy sesję i przypisuje do niej $staff_id;
  151.      */
  152.     public static function createSession($staff_id)
  153.     {
  154.         # zmień ustawienia
  155.        static::configure();
  156.  
  157.         # rozpoczyna sesję
  158.        static::start();
  159.  
  160.         # aktualizacja czasu wygaśnięcia sesji
  161.        static::refreshSessionLifeTime($staff_id);
  162.     }
  163.  
  164.     /**
  165.      * Niszczy sesję
  166.      */
  167.     public static function destroySession()
  168.     {
  169.         ModelStaffSession::delete()
  170.             ->equals('session_id', session_id())
  171.             ->execute();
  172.  
  173.         # jeżeli sesja jest ustanowiona
  174.        if (session_status() === \PHP_SESSION_ACTIVE) {
  175.             session_destroy();
  176.         }
  177.  
  178.         # usuń ciastko
  179.        unset($_COOKIE[session_name()]);
  180.         setcookie(session_name(), '', time() - 3600, '/');
  181.     }
  182.  
  183.     /**
  184.      * Konfiguruje mechanizm przechowywania sesji
  185.      */
  186.     protected static function configure()
  187.     {
  188.         # pobierz dane konfiguracyjne z configa
  189.        static::$config = getConfig()['session']['staff'];
  190.  
  191.         # zmiana nazwy ciastka sesyjnego dla pracownika
  192.        session_name(static::$config['cookie']['name']);
  193.  
  194.         # zmiana czasu żywotności ciastka
  195.        session_set_cookie_params(static::$config['cookie']['lifetime']);
  196.  
  197.         if (static::$config['useCustomStorage']) {
  198.             # włączenie niestandardowego sposobu przechowywania sesji
  199.            session_set_save_handler(new DatabaseSessionHandler());
  200.         }
  201.  
  202.         # ustaw, aby usuwać sesje starsze niż lifetime
  203.        ini_set('session.gc_maxlifetime', static::$config['lifetime']);
  204.     }
  205.  
  206.     /**
  207.      * Rozpoczyna sesję
  208.      */
  209.     protected static function start()
  210.     {
  211.         # jeżeli sesja jest nieustanowiona
  212.        if (session_status() === \PHP_SESSION_NONE) {
  213.  
  214.             # rozpocznij sesję, pobierz dane do $_SESSION
  215.            session_start();
  216.  
  217.             logger('[SESSION]', [session_id()]);
  218.         }
  219.     }
  220.  
  221.     /**
  222.      * Odświeża czas wygaśnięcia sesji
  223.      */
  224.     protected static function refreshSessionLifeTime($staff_id)
  225.     {
  226.         # aktualizacja czasu wygaśnięcia sesji w bazie danych
  227.        ModelStaffSession::replace([
  228.             'staff_id' => intval($staff_id),
  229.             'session_id' => session_id(),
  230.             'expiry_datetime' => sqldate(time() + static::$config['lifetime']),
  231.         ]);
  232.     }
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement