本人目前尝试把个人网站导航(www.dingstudio.cn)、个人的博客网站(blog.dingstudio.cn)、相册管理系统(album.dingstudio.cn)、心情语录发布站(w.dingstudio.cn)以及网页邮箱系统(mail.dingstudio.cn)都接入自己开发的SSO单点登录系统。SSO所在域名:passport.dingstudio.cn,上述域名均部署了https协议访问,目前各应用均无法检测到由passport系统产生的session,passport的登录认证模块和会话超时、会话续期系统已全部开发完毕。目前设计需求是SSO应用程序通过其他业务应用重定向时携带参数url,如login.php?url=http://www.dingstudio.cn/callback.php 处理登录成功后的跳转。callback.php为各个应用的回调接口,登录成功后的信息同步处理均交给callback.php。(URL参数读取、处理已经开发完毕并封装了一个类)部分passport核心代码:(这些代码都是写在一个php类里,前端入口通过require_once进行调用)public static function SSOCheckExist($special = '0') {
$nowtime = date('Ymdhis',time());
session_start();
if(isset($_SESSION['dingstudio_sso']) && $nowtime - $_SESSION['dingstudio_ssotoken'] <= 600) {
$_SESSION['dingstudio_ssotoken'] = $nowtime;//系统会话自动续期
return "authed";//存在合法会话且处于时效期限内,返回自动登陆
}
else {
return "noauth";//不存在合法会话或有效密钥超时,返回请求登陆
}
}
public static function SSOCheck($username, $password) {
if(isset($username) and isset($password)) {
$sqlconn = MySQLInstance::getInstance()->connect();//通过单例方式建立MySQL数据库连接
if($sqlconn->connect_error) {
return "error-654";//返回数据库服务器宕机错误码
}
else {
$sqlcode = "select * from users where (username='$username') and (password='$password')";//查询数据库检测账户密码是否匹配
$result = $sqlconn->query($sqlcode);//执行上述SQL语句
if($result->num_rows > 0) {//登陆成功后
$dtoken = date('Ymdhis',time());//产生SSO令牌码(使用时间)
$_SESSION['dingstudio_sso'] = $username;//同步用户名到Session
$_SESSION['dingstudio_ssotoken'] = $dtoken;//同步SSO令牌码到Session
$sqlcode = "update users set usertoken='{$dtoken}' where username='$username'";//更新SSO令牌码到数据库
$result = $sqlconn->query($sqlcode);//执行上述SQL语句
return "authed";//返回认证成功
}
else {
return "noauth";//返回认证失败
}
MySQLInstance::getInstance()->disconnect();//关闭数据库连接
}
}
}
1 回答
- 1 回答
- 3 关注
- 3830 浏览
添加回答
举报
0/150
提交
取消