Hook_init () вызывает проблемы входа в систему
Вопрос
Я создал пользовательский модуль, который имеет следующее hook_init()
реализация.
function gate_init() {
$curr_uri = check_plain(request_uri());
if (strpos($curr_uri, 'admin') === FALSE) {
if (strcmp($curr_uri, '/gate') != 0) {
if (!sess_read(GATE_SESSION_NAME)) {
if (!isset($_COOKIE[GATE_COOKIE_NAME])) {
drupal_goto('gate');
}
else {
sess_write(GATE_SESSION_NAME, TRUE);
}
}
}
else {
if (sess_read(GATE_SESSION_NAME) || isset($_COOKIE[GATE_COOKIE_NAME])) {
if (!sess_read(GATE_SESSION_NAME)) {
sess_write(GATE_SESSION_NAME, TRUE);
}
drupal_goto('/');
}
}
}
}
Это безумие, но этот код вызывает проблемы входа в систему для аутентифицированных пользователей. Я не могу войти в систему, я не вижу ошибок, я просто не могу войти в систему, если я предоставлю правильное имя пользователя и пароль.
Если я прокомментирую эти строки, я могу войти в систему.
if (!sess_read(GATE_SESSION_NAME)) {
if (!isset($_COOKIE[GATE_COOKIE_NAME])) {
drupal_goto('gate');
}
else {
sess_write(GATE_SESSION_NAME, TRUE);
}
}
Я проверяю дальше и if (!sess_read(GATE_SESSION_NAME))
это часть, вызывающая проблемы входа в систему. Кто -нибудь может дать мне совет?
Решение
sess_read () не следует использовать в модуле, так как эта функция передается в session_set_save_handler () из _drupal_bootstrap (), которая является функцией, которая называется во время начальной загрузки Drupal.
Цель функции - не считывать значения из сеанса PHP; Если вам нужно это сделать, вы можете просто прочитать контент из $_SESSION[]
.
Чтобы заметить это session_start () вызывается из Drupal во время начальной загрузки; Это означает, что после полной начальной загрузки (или любой начальной загрузки, которая проходит мимо DRUPAL_BOOTSTRAP_SESSION
фаза) сеанс инициализируется, и $_SESSION[]
может быть использован.