【问题标题】:Apache permissions based on querystring基于查询字符串的 Apache 权限
【发布时间】:2013-01-16 20:53:26
【问题描述】:

我有一个需要身份验证的 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,我会通过身份验证,但这还不够严格。

有人知道如何配置它来检查查询字符串中的任务参数吗?

我们使用 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/server.foo.local@foo.LOCAL
  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>

【问题讨论】:

    标签: apache configuration kerberos


    【解决方案1】:

    如您所见here:

    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>
    

    更新

    您曾说过:

    如果我只是过滤 ^/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>
    

    【讨论】:

    • 我会调查一下,我应该补充一点,我们正在使用 auth_kerb 进行身份验证,现在我遇到的问题是他先做 auth_kerb,然后再做 mod_rewrite
    • @Frederiek 您的 apache 配置文件中的 AuthType Kerberos 指令是在 LocationMatch 部分内部还是外部?您最终能否提供有关您正在使用的配置的更多详细信息?也许this answer 也可能有用。
    • 查看原始问题中的编辑。我已经包含了conf文件
    • 需要注意的一点是 LocationMatch 不能在 .htaccess 文件中使用 - 只能在服务器配置或虚拟主机上下文中使用,请参阅 stackoverflow.com/questions/6663611/…
    【解决方案2】:

    在 Apache 2.4 中,有一种更简单的方法可以做到这一点,而无需重写。

    您可以使用LocationMatch 匹配QUERY_STRING,然后使用If 块匹配QUERY_STRING 的内容。即,像这样:

    <LocationMatch "^/foo/api.php">
      <If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" >
           Require all granted
      </If>
    </LocationMatch>
    

    【讨论】:

    • &lt;If&gt; 是 apache 2.4 功能,Order/Allow 是 apache 2.2 功能。如果您改用 Require 语法,这可能会起作用,但仅限于 2.4。
    【解决方案3】:

    我们不能使用&lt;If %{QUERY_STRING} /a=b/&gt;不支持

    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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 2020-01-25
      • 1970-01-01
      • 2011-06-02
      • 2018-05-13
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多