Разрешения Apache, основанные на querystring
У меня есть сервер apache, где требуется проверка подлинности, но есть некоторые вызовы, которые должны быть разрешены для всех.
Включение этих вызовов основано на строке запроса, например:
/foo/api.php?Token=123&Task=DoStuff&Result=json
Я учил, что с помощью LocationMatch это будет работать, поэтому я разработал эту конфигурацию:
<LocationMatch ^/foo/api.php\?.*(Task=DoStuff).*>
Order Allow,Deny
Allow from All
</LocationMatch>
Но это не позволяет мне пройти аутентификацию (это означает, что я получаю 401).
Если я просто фильтрую ^/foo/api.php
, я получаю аутентификацию, но это недостаточно строго.
Кто-нибудь знает, как настроить это, чтобы проверить параметр Task в строке запроса?
Для аутентификации мы используем kerberos, это принудительно на всем сайте
Это наш conf для бордюра
LoadModule auth_kerb_module modules/mod_auth_kerb.so
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride All
AuthType Kerberos
Require valid-user
AuthName "Kerberos Login"
KrbMethodNegotiate on
KrbMethodK5Passwd on
KrbAuthRealms FOO.LOCAL
KrbServiceName HTTP/[email protected]
Krb5KeyTab /etc/httpd/conf/http.keytab
Satisfy Any
Order deny,allow
Deny from all
Allow from 192.168.72.90
Allow from 192.168.72.91
Allow from 192.168.72.94
Allow from 192.168.72.95
Allow from 127.0.0.1
</Directory>
Ответы
Ответ 1
Как вы можете прочитать здесь:
< Местоположение > , <LocationMatch> , <Directory> и <DirectoryMatch> Директивы Apache позволяют нам применять аутентификацию/авторизацию для специфические модели ресурсов с высокой степенью специфичности, , но не давайте нам этот контроль до уровня строки запроса.
Поэтому для достижения цели вам нужно использовать mod_rewrite.
Например:
RewriteEngine on
RewriteCond %{QUERY_STRING} Task=DoStuff
RewriteRule ^/foo/api.php - [E=no_auth_required:1]
<LocationMatch ^/foo/api.php>
Order allow,deny
Allow from env=no_auth_required
AuthType Basic
AuthName "Login Required"
AuthUserFile /var/www/foo/.htpasswd
require valid-user
Satisfy Any
</LocationMatch>
UPDATE
Вы заявили, что:
Если я просто фильтрую ^/foo/api.php, я получаю аутентификацию, но это недостаточно строго.
Затем попробуйте добавить следующие строки в вашу конфигурацию:
RewriteEngine on
RewriteCond %{QUERY_STRING} Task=DoStuff
RewriteRule ^/foo/api.php - [E=no_auth_required:1]
<LocationMatch ^/foo/api.php>
Order allow,deny
Allow from env=no_auth_required
</LocationMatch>
Ответ 2
Там более простой способ сделать это без перезаписи.
Вы можете использовать LocationMatch
для соответствия до QUERY_STRING
, а затем использовать блок If
для соответствия содержимому QUERY_STRING
. то есть что-то вроде этого:
<LocationMatch "^/foo/api.php">
<If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" >
Order Allow,Deny
Allow from All
</If>
</LocationMatch>
Ответ 3
мы не можем использовать <If %{QUERY_STRING}/a=b/>
, не поддерживается <apache 2.4
RewriteEngine On
RewriteCond %{QUERY_STRING} test=ok
RewriteRule ^ / - [E=checkParamTest:1]
<LocationMatch "^/"> Order allow,deny Allow from env=checkParamTest Satisfy any </LocationMatch>
<Location/> AuthType openid-connect Require valid-user... </Location>