MySQLにユーザー認証をさせる

ファイルの準備

  • mysql.conf.php.exampleをmysql.conf.phpにリネーム
  • mysql.conf.phpを編集

SQLを実行

CREATE TABLE `users` (
  `uid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `login` VARCHAR(20) NOT NULL DEFAULT '',
  `pass` VARCHAR(60) NOT NULL DEFAULT '',
  `firstname` VARCHAR(255) NOT NULL DEFAULT '',
  `lastname` VARCHAR(255) NOT NULL DEFAULT '',
  `email` VARCHAR(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`uid`),
  UNIQUE KEY `login` (`login`)
) TYPE = MYISAM;
 
CREATE TABLE `groups` (
  `gid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL DEFAULT '',
  PRIMARY KEY  (`gid`),
  UNIQUE KEY `name` (`name`)
) TYPE = MYISAM;
 
CREATE TABLE `usergroup` (
  `uid` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `gid` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY  (`uid`,`gid`)
) TYPE = MYISAM;
  • local.protected.phpに
<?php
require_once('mysql.conf.php');
?>

パスワードをチェックさせる

ユーザー名が存在すると、パスワードが違っていてもログインができてしまいます。

conf/mysql.conf.php

$conf['auth']['mysql']['checkPass']   = "SELECT pass
                                         FROM usergroup AS ug
                                         JOIN users AS u ON u.uid=ug.uid
                                         JOIN groups AS g ON g.gid=ug.gid
                                         WHERE login='%{user}'
                                         AND name='%{dgroup}'";

最後の1行をAND pass='%{pass}'“;に置換。

inc/auth/mysql.class.php

    FUNCTION checkPass($user,$pass){
      $rc  = FALSE;
 
      IF($this->_openDB()) {
        $sql    = str_replace('%{user}',$this->_escape($user),$this->cnf['checkPass']);
        $sql    = str_replace('%{pass}',$this->_escape($pass),$sql);
        $sql    = str_replace('%{dgroup}',$this->_escape($this->defaultgroup),$sql);
        $result = $this->_queryDB($sql);

の後ろに if($result) $rc = true; を挿入。

xreaの文字化け対策

inc/auth/mysql.class.php

$con = @mysql_connect ($this->cnf['server'], $this->cnf['user'], $this->cnf['password']);

という行の後ろに

mysql_query("SET NAMES utf8", $con);

を挿入

登録する

MySQLに切り替えると、ユーザーが空になるので、登録し直す。