PafNutY
@PafNutY
Люблю кодить в своё удовольствие

Есть ли готовое решение для авторизации на странице только по паролю?

Имеется небольшой скрипт (самописная сборка из нескольких готовых классов), выводящий из БД страницы.
Вывод основан на GET запросах типа index.php?do=layout&name=project, где project - это значение поля name в БД.
Структура БД:
4d1e84a734f74e0f97602f47f670fcf9.png
Есть необходимость закрыть некоторые страницы от постороннего взгляда, для этого было создано поле pass, куда вносится пароль.
Предполагаю проверять его при обращении к странице, если не совпадает - редиректить на форму ввода пароля, но вот как реализовать это всё в коде - пока слабо представляю.
Есть ли какое-нибудь готовое решение для подобной цели?
  • Вопрос задан
  • 2710 просмотров
Решения вопроса 1
PafNutY
@PafNutY Автор вопроса
Люблю кодить в своё удовольствие
Решил проблему на сессиях и куках, написав вот такой класс:
class PassAuth extends core {
	private $project_id;
	private $password;
	private $is_authorized = false;

	function __construct() {
		$this->db_config = $this->getConfig('db_config');
		$this->db = $this->getDb();
	}

	public static function validProjectPass()
	{
		if (!empty($_SESSION["project_id"])) {
			return (bool) $_SESSION["project_id"];
		}
		return false;
	}

	public function checkPass($password, $remember=false)
	{
		$pass = $this->passwordHash($password);

		$select = "SELECT name, pass FROM ?n WHERE pass = ?s";

		$ret = $this->db->getOne($select, 'projects', $pass);

		if (!$ret) {
			$this->is_authorized = false;
		} else {
			$this->is_authorized = true;
			$this->project_id = $ret['name'];
			$this->saveSession($remember);
		}

		return $this->is_authorized;
	}

	public function saveSession($remember = false, $http_only = true, $days = 7)
	{
		$_SESSION["project_id"] = $this->project_id;

		if ($remember) {
			// Save session id in cookies
			$sid = session_id();

			$expire = time() + $days * 24 * 3600;
			$domain = ""; // default domain
			$secure = false;
			$path = "/";

			$cookie = setcookie('project_id', $sid, $expire, $path, $domain, $secure, $http_only);
		}
	}

	public static function passwordHash($password, $iterations = 2)
	{
		$hash = md5(md5($password));

		for ($i = 0; $i < $iterations; ++$i) {
			$hash = md5(md5(sha1($hash)));
		}

		return $hash;
	}
}

теперь осталось отладить)), но это уже дело техники.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@angry_bender
PHP, JS
Ну... Очень странная "хотелка". Конкатенируйте логин и пароль в один "пароль".
Ответ написан
@naneri
PHP разработчик.
Сделайте обычную авторизацию, только вместо проверки на совпадение логина и пароля просто проверка на наличие пароля в базе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы