Commit 3a433cf8 authored by hujun's avatar hujun

角色页面显示

parent ff3bd825
......@@ -8,7 +8,7 @@
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614> 
// +----------------------------------------------------------------------
namespace app\index\untils;
namespace app\index\util;
use think\Db;
use think\Config;
......@@ -72,145 +72,90 @@ DROP TABLE IF EXISTS `think_auth_group_access`;
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/
class AuthUntils
{
/**
* @var object 对象实例
*/
protected static $instance;
/**
* 当前请求实例
* @var Request
*/
protected $request;
class Auth {
//默认配置
protected $config = [
'auth_on' => 1, // 权限开关
protected $_config = array(
'auth_on' => true, // 认证开关
'auth_type' => 1, // 认证方式,1为实时认证;2为登录认证。
'auth_group' => 'auth_group', // 用户组数据表名
'auth_group' => '__AUTH_GROUP__', // 用户组数据表名
'auth_group_access' => 'auth_group_access', // 用户-用户组关系表
'auth_rule' => 'auth_rule', // 权限规则表
'auth_user' => 'agents', // 用户信息表
];
/**
* 类架构函数
* Auth constructor.
*/
public function __construct()
{
//可设置配置项 auth, 此配置项为数组。
if ($auth = Config::get('auth')) {
$this->config = array_merge($this->config, $auth);
}
// 初始化request
$this->request = Request::instance();
}
'auth_user' => 'member' // 用户信息表
);
/**
* 初始化
* @access public
* @param array $options 参数
* @return \think\Request
*/
public static function instance($options = [])
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
public function __construct() {
$t = config('auth_config');
if (config('auth_config')) {
//可设置配置项 auth_config, 此配置项为数组。
$this->_config = array_merge($this->_config, config('auth_config'));
}
return self::$instance;
}
/**
* 检查权限
* @param $name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
* @param $uid int 认证用户的id
* @param int $type 认证类型
* @param string $mode 执行check的模式
* @param string $relation 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
* @return bool 通过验证返回true;失败返回false
* @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
* @param uid int 认证用户的id
* @param string mode 执行check的模式
* @param relation string 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
* @return boolean 通过验证返回true;失败返回false
*/
public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or')
{
if (!$this->config['auth_on']) {
return true;
}
$count = Db::name($this->config['auth_rule'])->where('name',$name)->count();
if ($count == 0) {
public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or') {
if (!$this->_config['auth_on'])
return true;
}
// 获取用户需要验证的所有有效规则列表
$authList = $this->getAuthList($uid, $type);
$authList = $this->getAuthList($uid, $type); //获取用户需要验证的所有有效规则列表
if (is_string($name)) {
$name = strtolower($name);
if (strpos($name, ',') !== false) {
$name = explode(',', $name);
} else {
$name = [$name];
$name = array($name);
}
}
$list = []; //保存验证通过的规则名
if ('url' == $mode) {
$REQUEST = unserialize(strtolower(serialize($this->request->param())));
$list = array(); //保存验证通过的规则名
if ($mode == 'url') {
$REQUEST = unserialize(strtolower(serialize($_REQUEST)));
}
foreach ($authList as $auth) {
$query = preg_replace('/^.+\?/U', '', $auth);
if ('url' == $mode && $query != $auth) {
if ($mode == 'url' && $query != $auth) {
parse_str($query, $param); //解析规则中的param
$intersect = array_intersect_assoc($REQUEST, $param);
$auth = preg_replace('/\?.*$/U', '', $auth);
if (in_array($auth, $name) && $intersect == $param) {
//如果节点相符且url参数满足
if (in_array($auth, $name) && $intersect == $param) { //如果节点相符且url参数满足
$list[] = $auth;
}
} else {
if (in_array($auth, $name)) {
} else if (in_array($auth, $name)) {
$list[] = $auth;
}
}
}
if ('or' == $relation && !empty($list)) {
if ($relation == 'or' and ! empty($list)) {
return true;
}
$diff = array_diff($name, $list);
if ('and' == $relation && empty($diff)) {
if ($relation == 'and' and empty($diff)) {
return true;
}
return false;
}
/**
* 根据用户id获取用户组,返回值为数组
* @param $uid int 用户id
* @param uid int 用户id
* @return array 用户所属的用户组 array(
* array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
* ...)
*/
public function getGroups($uid = '')
{
static $groups = [];
if (isset($groups[$uid])) {
public function getGroups($uid) {
static $groups = array();
if (isset($groups[$uid]))
return $groups[$uid];
}
// 转换表名
$auth_group_access = Loader::parseName($this->config['auth_group_access'], 0);
$auth_group = Loader::parseName($this->config['auth_group'], 0);
// 执行查询
// $user_groups = Db::view($auth_group_access, 'uid,group_id')
// ->view($auth_group, 'title,rules', "{$auth_group_access}.group_id={$auth_group}.id", 'LEFT')
// ->where("{$auth_group_access}.uid='{$uid}' and {$auth_group}.status='1'")
// ->select();
$user_groups = Db::name($auth_group_access)
$user_groups = \think\Db::name($this->_config['auth_group_access'])
->alias('a')
->join($this->_config['auth_group'] . " g", "g.id=a.group_id")
->where("a.uid='$uid' and g.status='1'")
->join($auth_group. ' g', 'a.group_id=g.id')
->select();
$groups[$uid] = $user_groups ?: [];
->field('uid,group_id,title,rules')->select();
$groups[$uid] = $user_groups ? $user_groups : array();
return $groups[$uid];
}
......@@ -218,43 +163,41 @@ class AuthUntils
* 获得权限列表
* @param integer $uid 用户id
* @param integer $type
* @return array
*/
protected function getAuthList($uid, $type)
{
static $_authList = []; //保存用户验证通过的权限列表
$t = implode(',', (array)$type);
protected function getAuthList($uid, $type) {
static $_authList = array(); //保存用户验证通过的权限列表
$t = implode(',', (array) $type);
if (isset($_authList[$uid . $t])) {
return $_authList[$uid . $t];
}
if (2 == $this->config['auth_type'] && Session::has('_auth_list_' . $uid . $t)) {
return Session::get('_auth_list_' . $uid . $t);
if ($this->_config['auth_type'] == 2 && isset($_SESSION['_auth_list_' . $uid . $t])) {
return $_SESSION['_auth_list_' . $uid . $t];
}
//读取用户所属用户组
$groups = $this->getGroups($uid);
$ids = []; //保存用户所属用户组设置的所有权限规则id
$ids = array(); //保存用户所属用户组设置的所有权限规则id
foreach ($groups as $g) {
$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
}
$ids = array_unique($ids);
if (empty($ids)) {
$_authList[$uid . $t] = [];
return [];
}
$map = [
'id' => ['in', $ids],
'type' => $type
];
$_authList[$uid . $t] = array();
return array();
}
$map = array(
'id' => array('in', $ids),
'type' => $type,
'status' => 1,
);
//读取用户组所有权限规则
$rules = Db::name($this->config['auth_rule'])->where($map)->field('condition,name')->select();
$rules = \think\Db::name($this->_config['auth_rule'])->where($map)->field('condition,name')->select();
//循环规则,判断结果。
$authList = []; //
$authList = array(); //
foreach ($rules as $rule) {
if (!empty($rule['condition'])) {
//根据condition进行验证
if (!empty($rule['condition'])) { //根据condition进行验证
$user = $this->getUserInfo($uid); //获取用户信息,一维数组
$command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);
//dump($command);//debug
@(eval('$condition=(' . $command . ');'));
if ($condition) {
$authList[] = strtolower($rule['name']);
......@@ -265,30 +208,22 @@ class AuthUntils
}
}
$_authList[$uid . $t] = $authList;
if (2 == $this->config['auth_type']) {
if ($this->_config['auth_type'] == 2) {
//规则列表结果保存到session
Session::set('_auth_list_' . $uid . $t, $authList);
$_SESSION['_auth_list_' . $uid . $t] = $authList;
}
return array_unique($authList);
}
/**
* 获得用户资料
* @param $uid
* @return mixed
* 获得用户资料,根据自己的情况读取数据库
*/
protected function getUserInfo($uid)
{
static $user_info = [];
$user = Db::name($this->config['auth_user']);
// 获取用户表主键
$_pk = is_string($user->getPk()) ? $user->getPk() : 'uid';
if (!isset($user_info[$uid])) {
$user_info[$uid] = $user->where($_pk, $uid)->find();
protected function getUserInfo($uid) {
static $userinfo = array();
if (!isset($userinfo[$uid])) {
$userinfo[$uid] = \think\Db::name($this->_config['auth_user'])->where(array('uid' => $uid))->find();
}
return $user_info[$uid];
return $userinfo[$uid];
}
}
......@@ -8,7 +8,7 @@
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614> 
// +----------------------------------------------------------------------
namespace app\index\util;
namespace app\index\untils;
use think\Db;
use think\Config;
......@@ -72,90 +72,145 @@ DROP TABLE IF EXISTS `think_auth_group_access`;
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/
class Auth {
class AuthUntils
{
/**
* @var object 对象实例
*/
protected static $instance;
/**
* 当前请求实例
* @var Request
*/
protected $request;
//默认配置
protected $_config = array(
'auth_on' => true, // 认证开关
protected $config = [
'auth_on' => 1, // 权限开关
'auth_type' => 1, // 认证方式,1为实时认证;2为登录认证。
'auth_group' => '__AUTH_GROUP__', // 用户组数据表名
'auth_group' => 'auth_group', // 用户组数据表名
'auth_group_access' => 'auth_group_access', // 用户-用户组关系表
'auth_rule' => 'auth_rule', // 权限规则表
'auth_user' => 'member' // 用户信息表
);
'auth_user' => 'agents', // 用户信息表
];
/**
* 类架构函数
* Auth constructor.
*/
public function __construct()
{
//可设置配置项 auth, 此配置项为数组。
if ($auth = Config::get('auth')) {
$this->config = array_merge($this->config, $auth);
}
// 初始化request
$this->request = Request::instance();
}
public function __construct() {
$t = config('auth_config');
if (config('auth_config')) {
//可设置配置项 auth_config, 此配置项为数组。
$this->_config = array_merge($this->_config, config('auth_config'));
/**
* 初始化
* @access public
* @param array $options 参数
* @return \think\Request
*/
public static function instance($options = [])
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
return self::$instance;
}
/**
* 检查权限
* @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
* @param uid int 认证用户的id
* @param string mode 执行check的模式
* @param relation string 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
* @return boolean 通过验证返回true;失败返回false
* @param $name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
* @param $uid int 认证用户的id
* @param int $type 认证类型
* @param string $mode 执行check的模式
* @param string $relation 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
* @return bool 通过验证返回true;失败返回false
*/
public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or') {
if (!$this->_config['auth_on'])
public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or')
{
if (!$this->config['auth_on']) {
return true;
}
$count = Db::name($this->config['auth_rule'])->where('name',$name)->count();
if ($count == 0) {
return true;
$authList = $this->getAuthList($uid, $type); //获取用户需要验证的所有有效规则列表
}
// 获取用户需要验证的所有有效规则列表
$authList = $this->getAuthList($uid, $type);
if (is_string($name)) {
$name = strtolower($name);
if (strpos($name, ',') !== false) {
$name = explode(',', $name);
} else {
$name = array($name);
$name = [$name];
}
}
$list = array(); //保存验证通过的规则名
if ($mode == 'url') {
$REQUEST = unserialize(strtolower(serialize($_REQUEST)));
$list = []; //保存验证通过的规则名
if ('url' == $mode) {
$REQUEST = unserialize(strtolower(serialize($this->request->param())));
}
foreach ($authList as $auth) {
$query = preg_replace('/^.+\?/U', '', $auth);
if ($mode == 'url' && $query != $auth) {
if ('url' == $mode && $query != $auth) {
parse_str($query, $param); //解析规则中的param
$intersect = array_intersect_assoc($REQUEST, $param);
$auth = preg_replace('/\?.*$/U', '', $auth);
if (in_array($auth, $name) && $intersect == $param) { //如果节点相符且url参数满足
if (in_array($auth, $name) && $intersect == $param) {
//如果节点相符且url参数满足
$list[] = $auth;
}
} else if (in_array($auth, $name)) {
} else {
if (in_array($auth, $name)) {
$list[] = $auth;
}
}
if ($relation == 'or' and ! empty($list)) {
}
if ('or' == $relation && !empty($list)) {
return true;
}
$diff = array_diff($name, $list);
if ($relation == 'and' and empty($diff)) {
if ('and' == $relation && empty($diff)) {
return true;
}
return false;
}
/**
* 根据用户id获取用户组,返回值为数组
* @param uid int 用户id
* @param $uid int 用户id
* @return array 用户所属的用户组 array(
* array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
* ...)
*/
public function getGroups($uid) {
static $groups = array();
if (isset($groups[$uid]))
public function getGroups($uid = '')
{
static $groups = [];
if (isset($groups[$uid])) {
return $groups[$uid];
$user_groups = \think\Db::name($this->_config['auth_group_access'])
}
// 转换表名
$auth_group_access = Loader::parseName($this->config['auth_group_access'], 0);
$auth_group = Loader::parseName($this->config['auth_group'], 0);
// 执行查询
// $user_groups = Db::view($auth_group_access, 'uid,group_id')
// ->view($auth_group, 'title,rules', "{$auth_group_access}.group_id={$auth_group}.id", 'LEFT')
// ->where("{$auth_group_access}.uid='{$uid}' and {$auth_group}.status='1'")
// ->select();
$user_groups = Db::name($auth_group_access)
->alias('a')
->join($this->_config['auth_group'] . " g", "g.id=a.group_id")
->where("a.uid='$uid' and g.status='1'")
->field('uid,group_id,title,rules')->select();
$groups[$uid] = $user_groups ? $user_groups : array();
->join($auth_group. ' g', 'a.group_id=g.id')
->select();
$groups[$uid] = $user_groups ?: [];
return $groups[$uid];
}
......@@ -163,41 +218,43 @@ class Auth {
* 获得权限列表
* @param integer $uid 用户id
* @param integer $type
* @return array
*/
protected function getAuthList($uid, $type) {
static $_authList = array(); //保存用户验证通过的权限列表
$t = implode(',', (array) $type);
protected function getAuthList($uid, $type)
{
static $_authList = []; //保存用户验证通过的权限列表
$t = implode(',', (array)$type);
if (isset($_authList[$uid . $t])) {
return $_authList[$uid . $t];
}
if ($this->_config['auth_type'] == 2 && isset($_SESSION['_auth_list_' . $uid . $t])) {
return $_SESSION['_auth_list_' . $uid . $t];
if (2 == $this->config['auth_type'] && Session::has('_auth_list_' . $uid . $t)) {
return Session::get('_auth_list_' . $uid . $t);
}
//读取用户所属用户组
$groups = $this->getGroups($uid);
$ids = array(); //保存用户所属用户组设置的所有权限规则id
$ids = []; //保存用户所属用户组设置的所有权限规则id
foreach ($groups as $g) {
$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
}
$ids = array_unique($ids);
if (empty($ids)) {
$_authList[$uid . $t] = array();
return array();
}
$map = array(
'id' => array('in', $ids),
'type' => $type,
'status' => 1,
);
$_authList[$uid . $t] = [];
return [];
}
$map = [
'id' => ['in', $ids],
'type' => $type
];
//读取用户组所有权限规则
$rules = \think\Db::name($this->_config['auth_rule'])->where($map)->field('condition,name')->select();
$rules = Db::name($this->config['auth_rule'])->where($map)->field('condition,name')->select();
//循环规则,判断结果。
$authList = array(); //
$authList = []; //
foreach ($rules as $rule) {
if (!empty($rule['condition'])) { //根据condition进行验证
if (!empty($rule['condition'])) {
//根据condition进行验证
$user = $this->getUserInfo($uid); //获取用户信息,一维数组
$command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);
//dump($command);//debug
@(eval('$condition=(' . $command . ');'));
if ($condition) {
$authList[] = strtolower($rule['name']);
......@@ -208,22 +265,30 @@ class Auth {
}
}
$_authList[$uid . $t] = $authList;
if ($this->_config['auth_type'] == 2) {
if (2 == $this->config['auth_type']) {
//规则列表结果保存到session
$_SESSION['_auth_list_' . $uid . $t] = $authList;
Session::set('_auth_list_' . $uid . $t, $authList);
}
return array_unique($authList);
}
/**
* 获得用户资料,根据自己的情况读取数据库
* 获得用户资料
* @param $uid
* @return mixed
*/
protected function getUserInfo($uid) {
static $userinfo = array();
if (!isset($userinfo[$uid])) {
$userinfo[$uid] = \think\Db::name($this->_config['auth_user'])->where(array('uid' => $uid))->find();
}
return $userinfo[$uid];
protected function getUserInfo($uid)
{
static $user_info = [];
$user = Db::name($this->config['auth_user']);
// 获取用户表主键
$_pk = is_string($user->getPk()) ? $user->getPk() : 'uid';
if (!isset($user_info[$uid])) {
$user_info[$uid] = $user->where($_pk, $uid)->find();
}
return $user_info[$uid];
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment