Проверка id пользователя

Тема в разделе "Как сделать...", создана пользователем anadikt, 17 июл 2014.

  1. anadikt

    anadikt

    Регистр.:
    29 янв 2010
    Сообщения:
    408
    Симпатии:
    63
    Подскажите, пожалуйста, как сделать так, чтобы сделать проверку пользователя по ID, если к примеру пользователь залогинен как админ с ID=1, то показывать один текст, если пользователь не залогинен или же залогинен, но не админ, то другой текст! В общих чертах: когда пользователь залогинен как админ, то ему не надо вводить ни капчу, ни имя, если залогинен другой пользователь, то вводит только капчу, имя автоматом в поле, ну и когда гость, то ему нужно ввести и имя и капчу!

    Вот работает, но тут либо залогинен, либо нет:
    php
    Код:
    <?php
    class ViewCommentAdd extends View {
      
        var $postLink;
      
        function ViewCommentAdd($postLink) {
            $this->postLink = $postLink;
        }
    
        function getLogin() {
            $userId = SimpleAuth::getUserId();
            if ($userId) {
                $item = AuthItem::getInstance($userId);
                if ($item)
                    return $item->login;
            }
            return NULL;
        }
      
        function _done() {
            $postLink = $this->postLink;
            $login = $this->getLogin();
            $capthaDomain = ppc_substr($_SERVER['HTTP_HOST'], 4);
            include dirname(__FILE__)."/add.tpl";
        }
    }
    ?>
    шаблон
    Код:
        <?php if (!$login) : ?>
        <td width="90%">Ваше имя:<br><input type=text name="user" maxLength=40 style="width:100%"></td>
        <td><div style="width:30px;">&nbsp;</div></td>
        <td width="100" nowrap="nowrap">Код протекции:<br><input type=text name="securityCode" maxLength=4 value="" style="width:100%"></td>
        <td><div style="width:10px;">&nbsp;</div></td>
        <td><img src="images/code.php" border="0" alt="" height="38px"></td>
        <?php else : ?>
        <td>Ваше имя:<br><input type=text name="user" maxLength=40 value="<?= htmlspecialchars($login )?>" style="width:100%"></td>
        <?php endif ?>
     
  2. Otto

    Otto

    Регистр.:
    12 май 2008
    Сообщения:
    484
    Симпатии:
    158
    Приведённым вами код класса не возможно проверить...
    Для начало делайте тупо проверки if перед каждым полем, а там уже видно будет как можно оптимизировать через else... http://goo.gl/7EyM3V
     
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Выложите код классов SimpleAuth и AuthItem, вполне реально что там уже реализованы эти методы.
     
  4. anadikt

    anadikt

    Регистр.:
    29 янв 2010
    Сообщения:
    408
    Симпатии:
    63
    Код:
    <?php
    require_once(CLASSES_PATH . "Auth/AuthManager.php");
    
    class SimpleAuth {
        function authenticate($login = NULL, $password = NULL) {
            @session_start();
            if (SimpleAuth::checkAuth(false)) return true;
            if (!$login)
                if (isset($_COOKIE["login"])) {
                    $login = $_COOKIE["login"];
                }
            if (!$password)
                if (isset($_COOKIE["password"])) {
                    $password = $_COOKIE["password"];
                }
            $manager = new AuthManager();
            $auth = $manager->createByLoginPassword($login, $password);
            if (!$auth)
                return false;
            $_SESSION["password"] = $password;
            $_SESSION["user_id"] = $auth->record_id;
            setcookie("login", $login, gmmktime(0, 0, 0, 12, 31, 2037), "/", "." . DOMAIN);
            setcookie("password", $password, gmmktime(0, 0, 0, 12, 31, 2037), "/", "." . DOMAIN);
            return true;
        }
       
        function checkAuth($needRestore = true) {
            @session_start();
            if (isset($_SESSION["password"]))
                return true;
            if ($needRestore)
                return SimpleAuth::authenticate();
            return false;
        }
       
        function getUserId() {
            if (SimpleAuth::checkAuth())
                return $_SESSION["user_id"];
            else return NULL;
        }
       
        function logoff() {
            @session_start();
            setcookie("login", "", time() - 72000, "/", "." . DOMAIN);
            setcookie("password", "", time() - 72000, "/", "." . DOMAIN);
            session_destroy();
        }
    }
    ?>
    Код:
    <?php
    require_once(CLASSES_PATH . "SqlItem.php");
    require_once(CLASSES_PATH . "Auth/AuthManager.php");
    class AuthItem extends SqlItem {
       
        var $login;
        var $password;
        var $email;
       
        function AuthItem($record_id, $login, $password, $email) {
            parent::SqlItem($record_id);
            $this->login = $login;
            $this->password = $password;
            $this->email = $email;
        }
       
        function _table() {
            return "auth";
        }
       
        /*function _updateSQL() {
            return "UPDATE " . $this->_table() . " SET " . $this->_updateFields() . " WHERE user_id = " . $this->record_id;
        }
       
        function _removeSQL() {
            return "DELETE FROM " . $this->_table() . " WHERE user_id = " . $this->record_id;
        }*/
       
        function _updateFields() {
            $res = parent::_updateFields();
            if ($res)
                $res .= ", ";
            $res .= "login = " . SqlData::stringVal($this->login)
                  . ", password = " . SqlData::stringVal($this->password)
                  . ", email = " . SqlData::stringVal($this->email);
            return $res;
        }
       
        function &getInstance($user_id) {
            static $ui = array();
            if (!isset($ui[$user_id])) {
                $man = new AuthManager();
                $ui[$user_id] = $man->createById($user_id);
            }
            return $ui[$user_id];
        }
    }
    ?>
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Мдя, нормально разделения прав не замечено...
    Можно попробовать изменить функцию
    PHP:
    function _done() {
            
    $postLink $this->postLink;
            
    $login $this->getLogin();
            
    $userId SimpleAuth::getUserId();
            
    $capthaDomain ppc_substr($_SERVER['HTTP_HOST'], 4);
            include 
    dirname(__FILE__)."/add.tpl";
        }
    а в шаблоне добавить, в необходимое место
    PHP:
    <?php if ($userId == 1) : ?>
    текст для админа
    <?php else : ?>
    текст для всех остальных
    <?php endif ?>

    PS: хранение пароля в куках крайне не секьюрно - SimpleAuth::authenticate()
     
    anadikt нравится это.
  6. anadikt

    anadikt

    Регистр.:
    29 янв 2010
    Сообщения:
    408
    Симпатии:
    63
    Спасибо, с проверкой ID все работает!

    А как сделать, чтоб пользователь сам мог галочкой выбирать сохранить пароль или нет? К примеру как на нулледе сделано ...
     
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    PHP:
            $_SESSION["password"] = $password;
            
    $_SESSION["user_id"] = $auth->record_id;
            
    setcookie("login"$logingmmktime(00012312037), "/""." DOMAIN);
            
    setcookie("password"$passwordgmmktime(00012312037), "/""." DOMAIN);
    Если упрощенно:
    $_SESSION хранится на сервере и там данные хранить безопасно. Для их перехвата надо взломать сервер, что сделать чуть сложнее.
    Если сессия слетает смотри настройки - http://habrahabr.ru/post/28418/

    cookie - это то что можно перехватить десятками разных способов, логирующий прокси, XSS (даже на крупнейших серверах находят), неблагонадежное приложение браузера, и т.п.
     
    anadikt нравится это.