使用正则表达式根据 url 对用户进行身份验证


Authenticate users based on url with regular expressions

我正在构建一个PHP用户登录和管理系统。每个用户都有一个由管理员指定的角色。

假设角色 A 具有价值url=/users/*。这意味着具有角色 A 的用户应访问目录 /users 中的每个网页。例如,用户应该访问mydomain.com/users/myprofile.phpmydomain.com/users/friends/index.php但不能mydomain.com/foo/index.php

我认为一个好的解决方案是使用正则表达式来实现这一点。

例如。我有url=/users/*的规则。我用正则表达式替换*符号,删除规则开头的url=,然后我得到用户访问的页面的 URL,并执行 preg_match(rule,url(,如果返回是,则用户已通过身份验证,如果不是,我重定向他。

问题:

1. *符号应该用什么正则表达式替换?我在想[a-zA-Z0-9'-'#]+.

2. 使用$_SERVER['REQUEST_URI']获取用户访问的当前 URL 是否安全。为此目的使用它是否安全?

3. 还有其他方法可以实现这一目标吗?

你可以从不同的角度看待这个问题。通常,每个页面都有一个检查用户凭据的方法 - 您要做的是确认他拥有的权限允许他访问该页面。因此,例如,users/目录中的每个页面都会调用一个函数来检查用户的 cookie 并确认他在用户组中。

您无需检查$_SERVER['REQUEST_URI']因为页面知道它在哪里(如果没有,请使用__DIR__等(

如果您需要更复杂的功能,您可以设置用户功能并检查所有页面添加的内容,例如

if ($visitor->hascapability(X) {
    showlink(); //etc. etc.
}