访问控制
访问控制在网站中可以通过两种方式实现:
- 通过用户授权(User Authorization)和
- 通过连接主机(IP address)
通过主机控制, 请按需设置网页服务器(Apache/nginx).
首先, 我们将要谈谈如何通过控制用户访问网站.
用户访问控制
在一些网站上, 有一些网页是任何人都可以访问的, 而一些网页是只能特定的用户访问. 例如, 管理页面只能有特定授权的人才能访问. 这样的例子, 你可以按如下方法禁止访问:
首先, 参考授权(authentication) 并建立一个用户模型(user model)类.
你希望限制访问的页面, 登录授权(login authentication)是需要的.通过这样, 获得一个用户模型(user model)的实例.
然后重写controller()的setAccessRules方法. 通过组(Group)或用户(User ID)设置任意的操作(action)为allow或者deny.User ID和Group*都指向用户模型(user model)类.当用户执行一个操作(action)时,模型类中的identityKey()和groupKey()方法返回当前允许或禁止.
void FooController::setAccessRules()
{
setDenyDefault(true);
QStringList allowed;
allowed << "index" << "show" << "entry" << "create";
setAllowUser("user1", allowed);
:
}
使用allowUser()和allowGroup()来允许访问, 使用denyUser()和denyGroup()来禁止访问. 第一个参数指定组(Group)或者用户(User Id), 第二个参数指定操作的列表(QStringList). 对于没有定义的允许/禁止, 将使用默认的设置. 使用setAllowDefault()和setDenyDefault()方法进行默认设置.
setDenyDefault(true);
这里是使用户可以访问的逻辑. 这下面的方法重写了控制器(controller)的preFilter()方法, 然后在用户被禁止访问的情况下返回false. 控制器preFilter()方法在用户没有授权的情况下返回false.
bool FooController::preFilter()
{
ApplicationController::preFilter();
:
: // 获得用户模型(user model)实例
:
if (!validateAccess(&loginUser)) { // 检查访问规则, 是否被禁止访问
renderErrorResponse(403);
return false;
}
return true;
}
如果preFilter()方法返回false, 操作(action)将不会被执行. 你会希望能看到访问被禁止的信息. 为此, 你可以使用renderErrorRepose()方法显示一个静态的错误页面(如public/403.html).