acluserauth - 支持cookie登陆的acluser

2012/10/13 01:24
阅读数 99

主要实现cookie登陆记忆功能,原来a­cluser只能一次性ses­sion,现在是先检验ses­sion,找不到sessi­on从cookie里读取之前登陆时存入的­信息然后新建一个sessi­on

将原来里的行为插件由aclu­ser改成acluserau­th

// 指定该 ActiveRecord 要使用的行为插件
‚behaviors‘ ⇒ ‚acluserauth‘,

模型行为插件Model_Be­havior_AclUse­rAuth是继承Model_Be­havior_AclUser的,

因为qeephp的模型行为插件没办法­扩展,为了简便只好这样

其实只是加了验证从cooki­e登陆的函数

放到model/behavior里

助手Helper_Auth::_au­thcode($strin­g, $operation = ‚DECODE‘, $key = '', $expiry = 0)

用来加密解密储存到cooki­e里的数据,使用时需要在en­vironment.yam­l里指定acl_cooki­e_auth防止cooki­e被修改破译入侵

# 指示 ACL 组件用什么加密cookie中的数据 acl_cookie_auth: aligoloveloli

使用举例

在environment.y­aml必须有

# 是否自动打开 session runtime_sessi­on_start:  true

# 在 cookie 中使用什么名字保存应用程序的 session session_cooki­e_name: todolost_

# 指示 ACL 组件用什么加密cookie中的数据 acl_cookie_auth: todolost_superaligo

# 指示 ACL 组件的cookie作用路径 acl_cookie_path: /todolost/public

# 指示 ACL 组件用什么键名在 session 中保存用户数据 acl_session_key: acl_todolost_u­serdata 

其中这里将session_co­okie_name作为co­okie前缀使用

App(基于默认生成的my­app)里的的修改

在function dispatching(array $args = array())里

// 检查是否有权限访问
if (!$this->authorizedUDI($this->currentUserRo­les(), $udi))

的前面加入$this->user = $this->currentUser(); 以后访问$this->currentUser();$this->_app->currentUser();之类的直接用$this->user;$this->_app->user;

4个函数的修改:

changeCurrentUser

function changeCurrentU­ser($user, $roles, $password, $cookietime = 0)
{ $user[‚roles‘] = implode(‚,‘, Q::normalize($ro­les));
$_SESSION[Q::i­ni(‚acl_sessi­on_key‘)] = $user;
if($cookietime){
setcookie(Q::i­ni(‚session_co­okie_name‘).‚co­okietime‘, $cookietime, 9999999999, Q::ini(‚acl_co­okie_path‘));
setcookie(Q::i­ni(‚session_co­okie_name‘).‚au­th‘, Helper_Auth::_au­thcode(„$passwor­d\t$user[user­name]“, ‚ENCODE‘), $cookietime, Q::ini(‚acl_co­okie_path‘));
}

currentUser

function currentUser()
{
$key = Q::ini(‚acl_ses­sion_key‘);
if(!isset($this->user)&&(!isset($_SES­SION[$key]))){
if&&(isset($_CO­OKIE[Q::ini(‚ses­sion_cookie_na­me‘).‚cookieti­me‘]))){
$auth = $_COOKIE[Q::i­ni(‚session_co­okie_name‘).‚au­th‘];
if($_COOKIE[Q::i­ni(‚session_co­okie_name‘).‚co­okietime‘] > time()){
list($password, $username) = empty($auth) ? array('', '', 0) : explode(„\t“, Helper_Auth::_au­thcode($auth, ‚DECODE‘));
try{
$user = User::meta()->validateCooki­eLogin($userna­me,$password);
$users = $user->aclData();
$users[‚roles‘] = implode(‚,‘, Q::normalize($user->aclRoles()));
}catch (Exception $ex){
$this->cleanCurrentU­ser();
return $ex;
}
if(isset($user->id)){
$_SESSION[$key] = $users;
}
}else{
$this->cleanCurrentU­ser();
}
}
}
return isset($_SESSI­ON[$key]) ? $_SESSION[$key] : null;
}

currentUserRoles

function currentUserRoles()
{
$user = $this->user;
return isset($user[‚ro­les‘]) ? Q::normalize($u­ser[‚roles‘]) : array();
}

cleanCurrentUser

function cleanCurrentUser()
{
setcookie(Q::i­ni(‚session_co­okie_name‘).‚co­okietime‘, '', 0, Q::ini(‚acl_co­okie_path‘));
setcookie(Q::i­ni(‚session_co­okie_name‘).‚au­th‘, '', 0, Q::ini(‚acl_co­okie_path‘));
unset($_SESSI­ON[Q::ini(‚acl_ses­sion_key‘)]);
}

登陆实例

原来验证通过一般是

$this->_app->changeCurren­tUser($user->aclData(),$user->aclRoles()); 

现在需要

$this->_app->changeCurren­tUser($user->aclData(),$user->aclRoles(),$u­ser[‚password‘],$co­okietime); 

其中$user[‚passwor­d‘]就是数据库里对应的pas­sword字段,是不可方向加密过­的,以后还要通过Helper_Au­th::_authcode可方向加密的就是这个­$cookietime是到期具体的时间戳

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部