Redmineのユーザー == SVNのユーザーとする.
SVNの認証をRedmineのDBを見る様にする。
SVNの認証をRedmineのDBを見る様にする。
考え方:
ApacheのBasci認証では、たいていの場合、htpasswd コマンドで認証用のユーザー/PASSを生成し、AuthUserFileでそのファイルを見るようにしますが、
ApacheのBasci認証で、RedmineのDBの usersテーブルをみに行くようにします。
その時、RedmineのDBの usersテーブルとApacheのBasci認証で使われる(htpasswd -s で生成される)パスワードのフォーマットが一致していなければなりませんが、
残念ながら異なります。
RedmineのDBの usersテーブルのパスワードのフォーマットは、SHA-1ダイジェストを16進形式で保存されています。
一方、htpasswd -s で生成されるApacheのBasci認証 パスワードは、SHA-1ダイジェストを Base64 です。
SVNで認証の際に、RedmineのDBを見に行って、SHA-1ダイジェストの16進形式をBase64に変換すればいいわけです。
ApacheのBasci認証 htpasswd -s と同じフォーマット にしてやるのです。
htpasswd で生成可能なフォーマットは
http://httpd.apache.org/docs/trunk/ja/programs/htpasswd.html
を参照
前提:
- 当然ですが、SVN の URLが http~を使う
- SVNの認証は、Apache Basic認証を使う
- Redmine の DBは、MySQL
- mysql Ver 5.1.31
実現方法:
Apache にDB認証させる為に、-enable-authn-dbd オプション付で configure します。
MySQLには16進とBase64を変換する関数はありませんので、UDFで対応します。
そのためMySQLのインストールオプションに、--with-mysqld-ldflags=-rdynamic を付けて configure します。
Apache インストール
./configure \
--prefix=/usr/local/apache2.2\
--enable-so --enable-proxy \
--enable-rewriter \
--enable-deflate \
--enable-ssl \
--enable-dav \
--enable-authn-dbd
MySQLインストール
$ ./configure \
--prefix=/usr/local/mysql \
--enable-assembler \
--enable-local-infile \
--without-readline \
--with-client-ldflags=-all-static \
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static \
--with-innodb \
--with-federated-storage-engine \
--with-archive-storage-engine \
--with-csv-storage-engine \
--with-blackhole-storage-engine \
--with-fast-mutexes \
--with-example-storage-engine \
--with-mysqld-ldflags=-rdynamic
$ make && force=--force make test-ns && make test-pr
c で 16進とBase64変換 が書ければベストですが、ここは得意のPerlでやってしまいます。
次のURLを参考に、MySQLから perl スクリプトを実行出来る様にします。
※ c で 16進とBase64変換するコードだれか下さい。
作成した、UDFのファイル名は、udf_perl.so です。
作成した URF udf_perl.so を、/usr/local/mysql/lib/mysql/plugin/ に置く。
変換するスクリプト
$ cat mysql_udf/sha1_hex2base64.pluse MIME::Base64;sub pfunc{ my $pass = shift; $pass =~ s/\s+$//; $pass = encode_base64(pack("H*",$pass)); chomp $pass; return '{SHA}'.$pass;}
変換するスクリプトは適当な場所に置く(上記の参考URLのCのソースも参照)
mysql> CREATE FUNCTION udf_perl RETURNS STRING SONAME 'udf_perl.so';
※レプリケーションしてる場合は、レプリケーション先にもこのSQLが流れるので注意!
上手くいけば、次のSQLで 「{SHA}~」と結果を取得できます。
mysql> select udf_perl('sha1_hex2base64.pl',hashed_password) from users ; そして、ApacheのConfファイルを設定します。
$ cat mysql_udf/httpd-svn.conf<VirtualHost *:443> ServerName svn.host:443 DocumentRoot /home/httpd/vhost/svn/public ErrorLog "|/usr/local/apache2.2/bin/rotatelogs /home/httpd/vhost/svn/logs/ssl_error_log.%Y%m%d 86400" TransferLog "|/usr/local/apache2.2/bin/rotatelogs /home/httpd/vhost/svn/logs/ssl_access_log.%Y%m%d 86400" CustomLog "|/usr/local/apache2.2/bin/rotatelogs /home/httpd/vhost/svn/logs/ssl_request_log.%Y%m%d 86400" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile "/usr/local/apache2.2/conf/extra/vhost/ssl_svn_dav.crt" SSLCertificateKeyFile "/usr/local/apache2.2/conf/extra/vhost/ssl_svn_dav.key" <Directory /home/httpd/vhost/svn/public> Order allow,deny Allow from all </Directory> Driver mysql
Params "dbname=redmine user=redmineadmin"
Min 1
Keep 2
Max 10
Exptime 60 <Location /repos> Order Allow,Deny Allow from all Dav On DAV svn SVNParentPath /home/svn/repository AuthzSVNAccessFile /home/svn/access/svnauth-file AuthType Basic AuthName "Subversion repository" AuthBasicProvider dbd Require valid-user AuthDBDUserPWQuery "select udf_perl('sha1_hex2base64.pl',hashed_password) from users where login = %s" </Location></VirtualHost> 以上、これでSVNとRedmineのユーザーが同期され,RedmineのユーザーIDとパスワードでSVNにアクセスできる。