ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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: Эта часть сообщения подписана цифровой подписью



 




Copyright © Lexa Software, 1996-2009.