又开始用qeephp开发了,个人感觉这个框架越用越觉得强大,完全不亚于python的django框架。唯一的遗憾是qeephp文档的完整性是如此之差……没办法,国内的。。
不扯没用的,进入正题,今天用了ACL访问控制。就一个字,方便。
默认情况下,所有的访问控制规则都写在acl.yaml.php中,该文件的结构也很简单:
控制器名称: #这里一定要顶格
allow: 允许使用的角色 #缩进一定要使用两个空格,一个朋友的工程里面使用了四个空格,好像也可以的样子。不要使用Tab键。角色名前要使用一个空格分隔,多个角色使用“,”分隔
还可以使用actions语法分别指定各个方法。具体写法见例子。
举个例子:
#起始页面,进入这个页面会被重定向到登陆页面,允许未登录用户和member访问
default:
allow: ACL_NO_ROLE
#用户相关
user:
allow: ACL_HAS_ROLE
actions:
register:
allow: ACL_NO_ROLE
login:
allow: ACL_NO_ROLE
index:
allow: ACL_NO_ROLE
值得一提的是还可以使用deny来只禁止特定用户。
在设置的时候一直遇到一个问题,解决了好久好久,原来这个文件不支持两个allow,必须使用逗号分隔多个用户,写到一条规则里。如:allow: 'MEMBER, ADMIN'
关于角色:
ACL_NO_ROLE 是一个 QeePHP 预定义的值,表示不具备任何角色的用户。
ACL_HAS_ROLE,用来表示任何角色。
还可以使用
ALL_CONTROLLERS:
deny: ACL_EVERYONE
指定一个全局的规则
下面引用下qeephp-quick-start中的配置,因为今天写的配置没有那个例子全。
users:
allow: ACL_HAS_ROLE
actions:
register:
allow: ACL_NO_ROLE
login:
allow: ACL_NO_ROLE
tasks:
allow: ACL_HAS_ROLE
default:
allow: ACL_EVERYONE
ALL_CONTROLLERS:
deny: ACL_EVERYONE
#注:不要复制上面的代码,以免缩进错误。
配置完了千万不要忘记只有启用acluser插件才能够使用acl控制。
下面对acl插件的配置进行简介,在适当地方引用qeephp的API。
启用acluser插件其实很简单,只要稍微修改下自动生成的model文件夹中的类就可以了。需要更改的类就是你的用户类(即:含有用户名和密码的类)
大概在22行附近就可以找到配置代码,做如下就该就可以了(下面的代码是笔者项目里的配置,22-33行):
'behaviors' => 'acluser',
// 指定行为插件的配置
'behaviors_settings' => array
(
# '插件名' => array('选项' => 设置),
'acluser' => array(
'password_prop' => 'password',
'acl_data_props' => 'username, id, level'
),
),
对配置做少许解释:'behaviors' => 'acluser', 指定了使用acluser插件
下面几行就是对插件的设置:
'acluser' => array(
'password_prop' => 'password',
'acl_data_props' => 'userName, id, level'
),
下面引用qeephp的API就可以说明这些设置了,希望对读者有所启发。
acluser 行为插件支持下列设置选项:
该选项可以设置为 cleartext, md5、crypt、sha1、sha2,或任何有效的 PHP 全局函数名。其中,cleartext 表示不加密密码。
如果要使用自定义的加密方法,可以指定 encode_type 设置为一个回调函数,例如:
'encode_type' => array('MyClass', 'encryptString');
由于 acluser 插件需要通过用户名来查询对象,因此需要指定正确的属性名称。
acluser 插件在验证用户登录、更新密码时需要用到该设置指定的属性。
当启用关联角色支持后,可以通过 aclRoles() 方法来获得用户对象关联的角色信息。
关联角色支持需要设置下列选项:
默认值为 uesrname。
要指定多个属性,用“,”分割,例如“username, email”。不过不管指定什么属性,
aclData() 方法返回的数组中总是包含一个名为 id 的键,其键值是用户的 ID。
当 update_login_auto 为 true 时,可以指定下列选项:
当该设置为 true 时,将不允许创建同名用户。
并在尝试创建同名用户时抛出 AclUser_DuplicateUsernameException 异常。
默认情况下,所有的访问控制规则都书写在 acl.yaml 中,该文件的结构如下:
控制器名称:
allow: 允许使用该控制器的角色