权限管理
大部分系统都需要登录及权限管理功能 综合演示中有使用示例
该单点登录便是集成这两大功能并且实现统一登录登出状态的同步
这个模块可以独立部署, 也可通过扩展对接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参数) + 域名密码 ) )