权限管理
大部分系统都需要登录及权限管理功能 综合演示中有使用示例
该单点登录便是集成这两大功能并且实现统一登录登出状态的同步
这个模块可以独立部署, 也可通过扩展对接LDAP, 实现帐号全局管理
该单点登录便是集成这两大功能并且实现统一登录登出状态的同步
这个模块可以独立部署, 也可通过扩展对接LDAP, 实现帐号全局管理

- 系统对接时有两种方式, 接口对接 和 跳转对接, 配置 _of.sso 修改对应参数
- 该模块同时拥有用户管理及权限管理 访问路径 OF_URL/include/of/index.php?c=of_base_sso_main&a=index 自动创建数据库 帐号 admin 密码 123456
- 包含对"用户", "域名", "角色", "权限"的"添加(xxxAdd)", "修改(xxxMod)", "删除(xxxDel)", "冻结(xxxIce)" 四个功能
- 四个功能可以如上图在对应的角色中用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"开头 的角色 }
接口对接
- "接口对接" 方式要将权限管理中将域名帐号设为"前后台对接"
- "接口对接" 方式可以自定义登录界面, 但会泄漏密码给对接平台
<?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); } }
跳转对接(推荐)
- "跳转对接" 方式安全快速,所有登录均在SSO系统中完成
- "跳转对接" 方式不需要额外权限,但所有修改功能会受限制
<?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参数) + 域名密码 ) )