Page 1 of 1

Аутентификация на вебсервере

Posted: 26 Feb 2013 08:11
by koch
Заметил, что при включенной аутентификации на сервисе Webserver, данные о пользователях берутся из файла .websrv_htpasswd лежащего в корневой директории веб-сервера. При этом в данный файл попадают все пользователи, зарегистрированные в NAS4Free и все они могут логиниться в директорию, требующую авторизации. За формирование данного файла отвечает скрипт сервиса /etc/rc.d/websrv_htpasswd. Я немного доработал данный скрипт, теперь он выгружает для авторизации только пользователей, которые включены в группу www. Может кому и пригодится.

Code: Select all

#!/bin/sh
#
# Part of NAS4Free (http://www.nas4free.org).
# Copyright (c) 2012-2013 The NAS4Free Project <info@nas4free.org>.
# All rights reserved.
#
# Portions of freenas (http://www.freenas.org).
# Copyright (c) 2005-2011 Olivier Cochard-Labbe <olivier@freenas.org>.
# All rights reserved.
#

# PROVIDE: websrv_htpasswd
# REQUIRE: userdb DAEMON
# XQUERY: -i "count(//websrv/enable) > 0 and count(//websrv/authentication) > 0" -o "0" -b
# RCVAR: websrv_htpasswd

. /etc/rc.subr
. /etc/configxml.subr

if configxml_isset //websrv/authentication; then
        # Defaults
        documentroot=`configxml_get "//websrv/documentroot"`
        htpasswdfile=".websrv_htpasswd"
        htpasswd="${documentroot}/${htpasswdfile}"

        echo "Generating ${htpasswdfile}."

        # Generate the htpasswd file used by websrv.
        /bin/cat /dev/null > "${htpasswd}"

        # Add configured users.
        /usr/local/bin/xml sel -t -m "//access/user" \
                -v "concat(login,' ',password)" \
                -i "position() <= last()" -n -b \
                ${configxml_file} | /usr/local/bin/xml unesc | \
                while read _login _password; do
                        # select only www group
                        if /usr/bin/id "${_login}" | /usr/bin/grep -q "\(www\)"
                        then
                                if [ "${_password}" != "" ]; then
                                        _password_md5=`/usr/sbin/mkpw -e md5 "${_password}"`
                                else
                                        _password_md5="*"
                                fi
                                echo "${_login}:${_password_md5}" >> "${htpasswd}"
                        fi
                done

        /bin/chmod 0600 "${htpasswd}"
        /usr/sbin/chown www:www "${htpasswd}"
fi