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

anadikt

Гуру форума
Регистрация
28 Янв 2010
Сообщения
433
Реакции
86
Подскажите, пожалуйста, как сделать так, чтобы сделать проверку пользователя по 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 ?>
 
Приведённым вами код класса не возможно проверить...
Для начало делайте тупо проверки if перед каждым полем, а там уже видно будет как можно оптимизировать через else... Для просмотра ссылки Войди или Зарегистрируйся
 
Выложите код классов SimpleAuth и AuthItem, вполне реально что там уже реализованы эти методы.
 
Выложите код классов SimpleAuth и AuthItem, вполне реально что там уже реализованы эти методы.
Код:
<?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];
    }
}
?>
 
Мдя, нормально разделения прав не замечено...
Можно попробовать изменить функцию
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()
 
PS: хранение пароля в куках крайне не секьюрно - SimpleAuth::authenticate()
Спасибо, с проверкой ID все работает!

А как сделать, чтоб пользователь сам мог галочкой выбирать сохранить пароль или нет? К примеру как на нулледе сделано ...
 
А как сделать, чтоб пользователь сам мог галочкой выбирать сохранить пароль или нет? К примеру как на нулледе сделано ...
PHP:
        $_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);

Если упрощенно:
$_SESSION хранится на сервере и там данные хранить безопасно. Для их перехвата надо взломать сервер, что сделать чуть сложнее.
Если сессия слетает смотри настройки - Для просмотра ссылки Войди или Зарегистрируйся

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