Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: доступ к каталогу для определенного юзера
В Чтв, 19/07/2007 в 00:56 +0700, Leonid Evdokimov пишет:
> Alexander Simonov wrote:
>
> > 1) у меня есть внутренняя часть сайта, для которой скриптом генеряться
> > определенные подкаталоги и для этих подкаталогов создаються .htaccess
> > следующего формата:
>
> В моем случае имя юзера совпадало с именем генерируемой директории,
> поэтому удалось решить задачу с использованием переменных и ряда
> внутренних редиректов.
> Например, юзера с /foo внутренне редирекило на /$auth_name/$foo, после
> успешной аутентефикации.
>
не не подходит так делать. Потому дописал функционал.
появляется новый строковый параметр auth_basic_valid_user в котором
задаем имя пользователя.
патч в аттаче.
версия nginx - 0.5.27.
ЗЫ на сях не писал давно, потому прошу не матюкаться на реализацию.
--- src/http/modules/ngx_http_auth_basic_module.c.orig 2007-07-23
13:06:53.000000000 +0300
+++ src/http/modules/ngx_http_auth_basic_module.c 2007-07-23
15:39:35.000000000 +0300
@@ -20,12 +20,13 @@
typedef struct {
ngx_str_t realm;
ngx_str_t user_file;
+ ngx_str_t valid_user;
} ngx_http_auth_basic_loc_conf_t;
static ngx_int_t ngx_http_auth_basic_handler(ngx_http_request_t *r);
static ngx_int_t ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,
- ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm);
+ ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm,
ngx_str_t *valid_user, ngx_int_t chk_user);
static ngx_int_t ngx_http_auth_basic_set_realm(ngx_http_request_t *r,
ngx_str_t *realm);
static void ngx_http_auth_basic_close(ngx_file_t *file);
@@ -56,6 +57,14 @@
offsetof(ngx_http_auth_basic_loc_conf_t, user_file),
NULL },
+ { ngx_string("auth_basic_valid_user"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF
+ |NGX_CONF_TAKE1,
+ ngx_conf_set_str_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_auth_basic_loc_conf_t, valid_user),
+ NULL },
+
ngx_null_command
};
@@ -100,6 +109,7 @@
ngx_int_t rc;
ngx_str_t pwd;
ngx_uint_t i, login, left, passwd;
+ ngx_int_t chk_user;
ngx_file_t file;
ngx_http_auth_basic_ctx_t *ctx;
ngx_http_auth_basic_loc_conf_t *alcf;
@@ -109,18 +119,25 @@
sw_passwd,
sw_skip
} state;
-
+
alcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_basic_module);
if (alcf->realm.len == 0 || alcf->user_file.len == 0) {
return NGX_OK;
}
+ if (alcf->valid_user.len == 0) {
+ chk_user = 0;
+ }
+ else {
+ chk_user = 1;
+ }
+
ctx = ngx_http_get_module_ctx(r, ngx_http_auth_basic_module);
if (ctx) {
return ngx_http_auth_basic_crypt_handler(r, ctx, &ctx->passwd,
- &alcf->realm);
+ &alcf->realm,
&alcf->valid_user, chk_user);
}
rc = ngx_http_auth_basic_user(r);
@@ -201,7 +218,7 @@
pwd.data = &buf[passwd];
return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd,
- &alcf->realm);
+ &alcf->realm,
&alcf->valid_user, chk_user);
}
break;
@@ -230,6 +247,7 @@
ngx_http_auth_basic_close(&file);
+
if (state == sw_passwd) {
pwd.len = i - passwd;
pwd.data = ngx_palloc(r->pool, pwd.len + 1);
@@ -239,7 +257,7 @@
ngx_cpystrn(pwd.data, &buf[passwd], pwd.len + 1);
- return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd, &alcf->realm);
+ return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd, &alcf->realm,
&alcf->valid_user, chk_user );
}
return ngx_http_auth_basic_set_realm(r, &alcf->realm);
@@ -248,7 +266,7 @@
static ngx_int_t
ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,
- ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm)
+ ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm,
ngx_str_t *valid_user, ngx_int_t chk_user)
{
ngx_int_t rc;
u_char *encrypted;
@@ -257,11 +275,19 @@
&encrypted);
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
- "rc: %d user: \"%V\" salt: \"%s\"",
- rc, &r->headers_in.user, passwd->data);
+ "rc: %d user: \"%V\" salt: \"%s\" valid user \"%V\"",
+ rc, &r->headers_in.user, passwd->data, valid_user);
if (rc == NGX_OK) {
- if (ngx_strcmp(encrypted, passwd->data) == 0) {
+ if (ngx_strcmp(encrypted, passwd->data) == 0 ) {
+ if ( chk_user == 1 ) {
+ if ( ngx_strcmp(valid_user,&r->headers_in.user) == 0 ) {
+ return NGX_OK;
+ }
+ else {
+ return ngx_http_auth_basic_set_realm(r, realm);
+ }
+ }
return NGX_OK;
}
Attachment:
signature.asc
Description: Эта часть сообщения подписана цифровой подписью
|