单点登录SSO

权限管理

大部分系统都需要登录及权限管理功能 综合演示中有使用示例
该单点登录便是集成这两大功能并且实现统一登录登出状态的同步
这个模块可以独立部署, 也可通过扩展对接LDAP, 实现帐号全局管理
  1. 系统对接时有两种方式, 接口对接 和 跳转对接, 配置 _of.sso 修改对应参数
  2. 该模块同时拥有用户管理及权限管理 访问路径 OF_URL/include/of/index.php?c=of_base_sso_main&a=index 自动创建数据库 帐号 admin 密码 123456
  3. 包含对"用户", "域名", "角色", "权限"的"添加(xxxAdd)", "修改(xxxMod)", "删除(xxxDel)", "冻结(xxxIce)" 四个功能
  4. 四个功能可以如上图在对应的角色中用json和RegEx来自定义权限范围,其中"name"为分页中的数据键,还包含如下信息
用户 : 用户ID(id) 帐号(name) 昵称(nick) 标签(lable)
域名 : 域名ID(id) 帐号(name) 简称(note)
角色 : 角色ID(id) 键值(name) 名称(lable)
权限 : 权限ID(id) 键值(name) 名称(lable)

权限演示 :
{
    "packMod" : {"range":[{"name":"/^oa/", "lable":"/^oa/"}]},    //只能编辑键值为"oa"开头 并且 名称为"oa"开头 的角色
    "funcMod" : {"range":[{"name":"/^oa/"}, {"name":"/^oa/"}]}    //只能编辑键值为"oa"开头 或者 名称为"oa"开头 的角色
}

接口对接

  1. "接口对接" 方式要将权限管理中将域名帐号设为"前后台对接"
  2. "接口对接" 方式可以自定义登录界面, 但会泄漏密码给对接平台
<?php
if ($temp = of_base_sso_tool::check(true)) {
    echo '登录帐号: ', $temp, "<br>\n";
    echo '拥有权限: ', of_base_sso_tool::role('test') ? '有权' : '无权', "<br>\n";
    echo '后台退出: ', of_base_sso_tool::logout();
//未登录
} else {
    echo '后台登录: '; 
    //登录帐号
    $temp = of_base_sso_tool::login(array('user' => 'admin', 'pwd' => '123456'));
    if ($temp === true) {
        echo '成功';
    } else if ($temp === false) {
        echo '失败';
    } else {
        echo '错误'; print_r($temp);
    }
}

跳转对接(推荐)

  1. "跳转对接" 方式安全快速,所有登录均在SSO系统中完成
  2. "跳转对接" 方式不需要额外权限,但所有修改功能会受限制
<?php
if ($temp = of_base_sso_tool::check(false)) {
    echo '登录帐号: ', $temp, "<br>\n";
    //echo '拥有权限: ', sso::role('demo') ? '有权' : '无权', "<br>\n";
    echo '后台退出: ', of_base_sso_tool::logout();
//未登录
} else {
    //跳转登录
    header('Location: ' . of_base_sso_tool::login());
}

内置方法 下载php单文件封装包

of_base_sso_tool::check($isApi = true, $space = '')检查登录状态

isApibool
登录类型, false = 跳转登录, true = 接口登录
spacestring
验证的空间, 指定时会更改默认空间, 默认default
<?php
of_base_sso_tool::check();      //已登录返回登录帐号 未登录返回false

of_base_sso_tool::login($args = '', $space = '')登录用户

argsnull string true array
null = 验证当前用户是否登录
string = 生成跳转模式下跳转的连接
array = 接口模式下的登录帐号 需要 "接口对接" 权限 { "user" : 用户名 "pwd" : 登录密码 }
spacestring
指定空间, 默认使用"default"或check设置的值
<?php
of_base_sso_tool::login();      //true=成功,false=失败,数组=出错{"state" : 状态码, "msg" : 错误信息}

of_base_sso_tool::logout($space = '')退出登录用户

spacestring
指定空间, 默认使用"default"或check设置的值
<?php
of_base_sso_tool::logout();      //已登录 true 未登录 false

&of_base_sso_tool::user($key = null, $space = '')获取当前登录用户信息

keynull string
null = 返回完整的用户信息
string = 指定返回的信息 "user"=SSO中的用户ID, "name"=用户名, "role"=角色权限包
spacestring
指定空间, 默认使用"default"或check设置的值
<?php
/**
 * null=未登录, 数组=登录结构 {
 *     "user"   : SSO中的用户ID
 *     "name"   : 用户名
 *     "nick"   : 用户昵称
 *     "notes"  : 用户备注
 *     "role"   : 角色权限包, 如果登录了存在 {
 *         "allow" : 允许访问接口,当获取拥有权限时存在 {
 *             "pack" : {
 *                 角色名 : {
 *                     "data" : 角色自带的数据
 *                     "func" : {功能名1:功能名1, 功能名2:功能名2...}
 *                 }
 *             }
 *             "func" : {
 *                 功能名 : {
 *                     "data" : 功能自带的数据
 *                 }
 *             }
 *         },
 *         "deny"  : 拒绝访问接口,当获取没有权限时存在 {
 *             "pack" : {
 *                 角色名 : {
 *                     "data" : 角色自带的数据
 *                     "func" : {功能名1:功能名1, 功能名2:功能名2...}
 *                 }
 *             }
 *             "func" : {
 *                 功能名 : {
 *                     "data" : 功能自带的数据
 *                 }
 *             }
 *         }
 *     }
 * }
 */
of_base_sso_tool::user();      //已登录 返回详细数据 未登录 null

of_base_sso_tool::role($role, $space = '')验证权限

rolestring
验证权限的键值 推进使用 类名::方法@定位 的方式
spacestring
指定空间, 默认使用"default"或check设置的值
<?php
of_base_sso_tool::role('testRole');      //有权true 无权false

of_base_sso_tool::func($func, $data = array(), $space = '')集成功能 需要 "接口对接" 权限

funcstring
功能名
dataarray
对应功能的数据参数
spacestring
指定空间, 默认使用"default"或check设置的值
<?php
/**
 * 功能参数 : {
 *      "getUser" : 获取用户数据 {
 *          "user" : 要获取的用户
 *      }
 *      "setUser" : 修改用户数据时 {
 *          "user"     : 要修改的用户,可以按照 oAnswer oPwd space 三个任意条件修改数据
 *          "space"    : 按照当前用户修改数据
 *          "oPwd"     : 按照密码修改数据
 *          "oAnswer"  : 按照回答修改数据
 *          "pwd"      : 密码
 *          "nick"     : 昵称
 *          "notes"    : 用户备注
 *          "state"    : 可用状态,0=冻结,1=启用
 *          "question" : 问题
 *          "answer"   : 回答
 *      }
 *      "addUser" : 添加用户数据时 {
 *          "user"     : 要添加的用户
 *          "pwd"      : 密码
 *          "nick"     : 昵称
 *          "notes"    : 用户备注
 *          "state"    : 可用状态,0=冻结,1=启用
 *          "question" : 问题
 *          "answer"   : 回答
 *      }
 * }
 * 返回结构 : {
 *      "getUser" : 获取用户数据 {
 *          "state"    : 200
 *          "name"     : 用户名
 *          "nick"     : 昵称
 *          "notes"    : 用户备注
 *          "question" : 问题
 *      }
 *      "setUser" : 修改用户数据时 {
 *          "state" : 200
 *          "msg"   : 操作成功
 *      }
 *      "addUser" : 添加用户数据时 {
 *          "state" : 200
 *          "msg"   : 操作成功
 *      }
 * }
 */
print_r(of_base_sso_tool::func('getUser',array(     //获取用户找回信息
    'user' => 'admin'
)));

底层接口 请求参数均为GET

单点登录系统网址/?c=of_base_sso_main&a=index跳转对接: 用户登录

referer
登录成功后回调地址
space
一般 "default" 登录空间
name
域名帐号
role
获取权限(0=不获取权限, 1=拥有的权限, 2=没有的权限, 3=所有的权限)
check
校验信息(如: 当前SESSION的md5, 有此值返回数据将带有md5字段, 获取 role 必须的选项)
notify
回调路径(当 space 的帐号登录或退出时, 会调用此帐号通知回调)
cookie
一般为 session_name=session_id 作为 notify 回调时附带的 cookie
返回 : POST 数据
md5  : 校验摘要(name有效并且check存在时生成: md5(data + check + 域名密码)
data : 响应 json 数据 {
    "state"  : 200,
    "ticket" : 下次使用的票据,
    "msg"    : 提示信息,
    "user"   : 用户ID, 如果登录了存在
    "name"   : 用户名, 如果登录了存在
    "nick"   : 用户昵称, 如果登录了存在
    "notes"  : 用户备注, 如果登录了存在
    "role"   : 角色包, 如果登录了存在 {
        "deny"   : 拒绝访问接口,当获取没有权限时存在 {
            "pack" : {
                "角色名" : {
                    "data" : 角色自带的数据
                    "func" : {功能名1:功能名1,功能名2;功能名2...}
                }
            }
            "func" : {
                "功能名" : {
                    "data" : 功能自带的数据
                }
            }
        },
        "allow" : 允许访问接口,当获取拥有权限时存在 {
            "pack" : {
                "角色名" : {
                    "data" : 角色自带的数据
                    "func" : {功能名1:功能名1,功能名2;功能名2...}
                }
            }
            "func" : {
                "功能名" : {
                    "data" : 功能自带的数据
                }
            }
        }
    }
}

单点登录系统网址/?c=of_base_sso_main&a=logout跳转对接: 用户退出

referer
登录成果后回调地址
space
一般 "default" 登录空间
name
域名帐号

单点登录系统网址/?c=of_base_sso_api&a=ticket接口对接: 获取ticket 必须由jsonp方式发起请求

callback
一般 "callback" jsonp 回调 函数
space
一般 "default" 登录空间
name
域名帐号
返回js代码
callback({
    "state"  : 200, 200为成功
    "ticket" : 下次使用的票据,
    "msg"    : 提示信息, state 非 200 时存在
});

单点登录系统网址/?c=of_base_sso_api&a=check接口对接: 服务器校验ticket, 并且可以通过其进行登录

space
一般 "default" 登录空间
name
域名帐号
role
获取权限(0=不获取权限, 1=拥有的权限, 2=没有的权限, 3=所有的权限)
check
校验信息(如: 当前SESSION的md5, 有此值返回数据将带有md5字段, 获取 role 必须的选项)
notify
回调路径(当 space 的帐号登录或退出时, 会调用此帐号通知回调)
cookie
一般为 session_name=session_id 作为 notify 回调时附带的 cookie
user
登录帐号(同 pwd 一起, 登录 space 空间, 不填=检验当前帐号)
pwd
登录密码(同 user 一起, 登录 space 空间, 不填=检验当前帐号)
md5
校验摘要( md5(join(get参数) + 域名密码 ) )
返回json数据 {
    "state"  : 200,
    "ticket" : 下次使用的票据,
    "msg"    : 提示信息,
    "user"   : 用户ID, 如果登录了存在
    "name"   : 用户名, 如果登录了存在
    "nick"   : 用户昵称, 如果登录了存在
    "notes"  : 用户备注, 如果登录了存在
    "role"   : 角色包, 如果登录了存在 {
        "deny"   : 拒绝访问接口,当获取没有权限时存在 {
            "pack" : {
                "角色名" : {
                    "data" : 角色自带的数据
                    "func" : {功能名1:功能名1,功能名2;功能名2...}
                }
            }
            "func" : {
                "功能名" : {
                    "data" : 功能自带的数据
                }
            }
        },
        "allow" : 允许访问接口,当获取拥有权限时存在 {
            "pack" : {
                "角色名" : {
                    "data" : 角色自带的数据
                    "func" : {功能名1:功能名1,功能名2;功能名2...}
                }
            }
            "func" : {
                "功能名" : {
                    "data" : 功能自带的数据
                }
            }
        }
    }
}

单点登录系统网址/?c=of_base_sso_api&a=logout接口对接: 用户退出

space
一般 "default" 登录空间
name
域名帐号
md5
校验摘要( md5(join(get参数) + 域名密码 ) )
通用的返回结构为 {
    "state"  : 200, 200为成功
    "ticket" : 下次使用的票据,
    "msg"    : 提示信息, state 非 200 时存在
}

单点登录系统网址/?c=of_base_sso_api&a=func&type=getUser接口对接: 获取用户找回信息

space
一般 "default" 登录空间
name
域名帐号
user
找回的用户名
md5
校验摘要( md5(join(get参数) + 域名密码 ) )

单点登录系统网址/?c=of_base_sso_api&a=func&type=setUser接口对接: 修改用户数据

space
一般 "default" 登录空间
name
域名帐号
user
要修改的用户,可以按照 oAnswer oPwd space 三个任意条件修改数据
oPwd
按照密码修改数据
oAnswer
按照回答修改数据
pwd
密码
nick
昵称
state
可用状态,0=冻结,1=启用
question
问题
md5
校验摘要( md5(join(get参数) + 域名密码 ) )