这是布局:
web root
- admin (dir)
- index.php
- js
- img
- other files / dirs
- dir
- files
到目前为止,我使用.htaccess passwd保护了管理员目录,因为我希望对该目录中的所有文件进行完全访问控制(包括js脚本,jpg,pdf等)。另一方面,我的自定义CMS使用PHP sesssion / cookie为其他URL提供身份验证。我想要完成的是对.htaccess受保护的目录使用相同的PHP身份验证,避免为已经过PHP身份验证的用户提供用户/密码的弹出提示。总结:
我读过的大部分内容建议将管理目录移到Web根目录之外,并使用readfile从PHP脚本访问文件,我不想这样做。这个目录上有动态内容,还有静态内容。我知道apache会在加载任何资源之前触发auth弹出窗口,所以问题是如何让apache知道用户已经过身份验证。还有其他建议/解决方法吗?
答案 0 :(得分:8)
您可以使用.htaccess文件中的SetEnvIf
变量来检查是否设置了某个Cookie值。例如(这不是很安全,但只是为了说明):
AuthType Basic
AuthName "Protected Login"
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile "/dev/null"
SetEnvIf Cookie PHPSESSID=.* PASS=1
Order deny,allow
Deny from all
Allow from env=PASS
Require valid-user
Satisfy any
行SetEnvIf Cookie PHPSESSID=.* PASS=1
检查Cookie是否设置了PHP会话ID,如果是,那就足以Satisfy
身份验证过程和Allow from env=PASS
使其跳过登录提示如果这是真的。
同样,这个例子不是很安全,因为在没有成功的身份验证尝试的情况下调用session_start()
时已经设置了PHP会话cookie,因此最好设置一个更难以加密/随机的cookie值。猜测。例如:
SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1
这样,如果您通过PHP成功进行身份验证后设置cookie值AJNC3Z921dmc4O8P2
,这将足以通过身份验证过程。确保设置正确的cookie过期时间,以避免人们长时间通过登录提示。