主要实现cookie登陆记忆功能,原来acluser只能一次性session,现在是先检验session,找不到session从cookie里读取之前登陆时存入的信息然后新建一个session
将原来里的行为插件由acluser改成acluserauth
// 指定该 ActiveRecord 要使用的行为插件
‚behaviors‘ ⇒ ‚acluserauth‘,
模型行为插件Model_Behavior_AclUserAuth是继承Model_Behavior_AclUser的,
因为qeephp的模型行为插件没办法扩展,为了简便只好这样
其实只是加了验证从cookie登陆的函数
放到model/behavior里
助手Helper_Auth::_authcode($string, $operation = ‚DECODE‘, $key = '', $expiry = 0)
用来加密解密储存到cookie里的数据,使用时需要在environment.yaml里指定acl_cookie_auth防止cookie被修改破译入侵
# 指示 ACL 组件用什么加密cookie中的数据 acl_cookie_auth: aligoloveloli
使用举例在environment.yaml必须有
# 是否自动打开 session runtime_session_start: true
# 在 cookie 中使用什么名字保存应用程序的 session session_cookie_name: todolost_
# 指示 ACL 组件用什么加密cookie中的数据 acl_cookie_auth: todolost_superaligo
# 指示 ACL 组件的cookie作用路径 acl_cookie_path: /todolost/public
# 指示 ACL 组件用什么键名在 session 中保存用户数据 acl_session_key: acl_todolost_userdata
其中这里将session_cookie_name作为cookie前缀使用
App(基于默认生成的myapp)里的的修改在function dispatching(array $args = array())里
// 检查是否有权限访问
if (!$this->authorizedUDI($this->currentUserRoles(), $udi))
的前面加入$this->user = $this->currentUser(); 以后访问$this->currentUser();$this->_app->currentUser();之类的直接用$this->user;$this->_app->user;
4个函数的修改:
changeCurrentUserfunction changeCurrentUser($user, $roles, $password, $cookietime = 0)
{ $user[‚roles‘] = implode(‚,‘, Q::normalize($roles));
$_SESSION[Q::ini(‚acl_session_key‘)] = $user;
if($cookietime){
setcookie(Q::ini(‚session_cookie_name‘).‚cookietime‘, $cookietime, 9999999999, Q::ini(‚acl_cookie_path‘));
setcookie(Q::ini(‚session_cookie_name‘).‚auth‘, Helper_Auth::_authcode(„$password\t$user[username]“, ‚ENCODE‘), $cookietime, Q::ini(‚acl_cookie_path‘));
}
}
function currentUser()
{
$key = Q::ini(‚acl_session_key‘);
if(!isset($this->user)&&(!isset($_SESSION[$key]))){
if&&(isset($_COOKIE[Q::ini(‚session_cookie_name‘).‚cookietime‘]))){
$auth = $_COOKIE[Q::ini(‚session_cookie_name‘).‚auth‘];
if($_COOKIE[Q::ini(‚session_cookie_name‘).‚cookietime‘] > time()){
list($password, $username) = empty($auth) ? array('', '', 0) : explode(„\t“, Helper_Auth::_authcode($auth, ‚DECODE‘));
try{
$user = User::meta()->validateCookieLogin($username,$password);
$users = $user->aclData();
$users[‚roles‘] = implode(‚,‘, Q::normalize($user->aclRoles()));
}catch (Exception $ex){
$this->cleanCurrentUser();
return $ex;
}
if(isset($user->id)){
$_SESSION[$key] = $users;
}
}else{
$this->cleanCurrentUser();
}
}
}
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
function currentUserRoles()
{
$user = $this->user;
return isset($user[‚roles‘]) ? Q::normalize($user[‚roles‘]) : array();
}
function cleanCurrentUser()
{
setcookie(Q::ini(‚session_cookie_name‘).‚cookietime‘, '', 0, Q::ini(‚acl_cookie_path‘));
setcookie(Q::ini(‚session_cookie_name‘).‚auth‘, '', 0, Q::ini(‚acl_cookie_path‘));
unset($_SESSION[Q::ini(‚acl_session_key‘)]);
}
原来验证通过一般是
$this->_app->changeCurrentUser($user->aclData(),$user->aclRoles());
现在需要
$this->_app->changeCurrentUser($user->aclData(),$user->aclRoles(),$user[‚password‘],$cookietime);
其中$user[‚password‘]就是数据库里对应的password字段,是不可方向加密过的,以后还要通过Helper_Auth::_authcode可方向加密的就是这个$cookietime是到期具体的时间戳