user_can() cancel use set cache

This commit is contained in:
xiaomlove
2022-08-24 13:36:14 +08:00
parent 434e42e942
commit f91a7597bd
6 changed files with 24 additions and 55 deletions

View File

@@ -15,9 +15,8 @@ class Setting extends NexusModel
public static array $permissionMustHaveClass = ['defaultclass', 'staffmem'];
const CLASS_PERMISSION_SET_KEY_PREFIX = 'nexus_class_permissions_';
const DIRECT_PERMISSION_SET_KEY_PREFIX = 'nexus_direct_permissions_';
const ROLE_PERMISSION_SET_KEY_PREFIX = 'nexus_role_permissions_';
const DIRECT_PERMISSION_CACHE_KEY_PREFIX = 'nexus_direct_permissions_';
const ROLE_PERMISSION_CACHE_KEY_PREFIX = 'nexus_role_permissions_';
/**
* get setting autoload = yes with cache

View File

@@ -365,49 +365,39 @@ class ToolRepository extends BaseRepository
return $result;
}
public static function listUserClassPermissions($uid): array
public static function listUserClassPermissions($class): array
{
$userInfo = get_user_row($uid);
$settings = Setting::get('authority');
$result = [];
foreach ($settings as $permission => $minClass) {
if ($minClass >= User::CLASS_PEASANT && $minClass <= $userInfo['class']) {
if ($minClass >= User::CLASS_PEASANT && $minClass <= $class) {
$result[] = $permission;
}
}
return $result;
}
public static function listUserAllPermissions($uid, $class = null): array
public static function listUserAllPermissions($uid): array
{
static $uidPermissionsCached = [];
if (isset($uidPermissionsCached[$uid])) {
return $uidPermissionsCached[$uid];
}
$log = "uid: $uid";
if ($class === null) {
$userInfo = get_user_row($uid);
$class = $userInfo['class'];
}
$redis = NexusDB::redis();
$setKeys = [];
//Class permission, use push mechanism, already prepared,see settings.php
$key = Setting::CLASS_PERMISSION_SET_KEY_PREFIX . $class;
$setKeys[] = $key;
$userInfo = get_user_row($uid);
$class = $userInfo['class'];
//Role permission, use push mechanism, already prepared, see plugin role saving
$setKeys = apply_filter("role_permission_set_keys", $setKeys, $uid);
//Class permission
$classPermissions = self::listUserClassPermissions($class);
//Direct permission, use pull mechanism
$key = Setting::DIRECT_PERMISSION_SET_KEY_PREFIX . $uid;
$setKeys[] = $key;
if (!$redis->exists($key)) {
$log .= ", init direct permissions";
$userPermissionsArr = apply_filter("user_direct_permissions", [], $uid);
$redis->sAddArray($key, $userPermissionsArr);
}
$allPermissions = $redis->sUnion($setKeys);
do_log("$log, allSetKeys: " . json_encode($setKeys) . ", allPermissions: " . json_encode($allPermissions));
//Role permission
$rolePermissions = apply_filter("user_role_permissions", [], $uid);
//Direct permission
$directPermissions = apply_filter("user_direct_permissions", [], $uid);
$allPermissions = array_merge($classPermissions, $rolePermissions, $directPermissions);
do_log("$log, allPermissions: " . json_encode($allPermissions));
$result = array_combine($allPermissions, $allPermissions);
$uidPermissionsCached[$uid] = $result;
return $result;

View File

@@ -958,7 +958,7 @@ function clear_user_cache($uid, $passkey = '')
\Nexus\Database\NexusDB::cache_del("user_{$uid}_content");
\Nexus\Database\NexusDB::cache_del("user_{$uid}_roles");
\Nexus\Database\NexusDB::cache_del("announce_user_passkey_$uid");//announce.php
\Nexus\Database\NexusDB::cache_del(\App\Models\Setting::DIRECT_PERMISSION_SET_KEY_PREFIX . $uid);
\Nexus\Database\NexusDB::cache_del(\App\Models\Setting::DIRECT_PERMISSION_CACHE_KEY_PREFIX . $uid);
if ($passkey) {
\Nexus\Database\NexusDB::cache_del('user_passkey_'.$passkey.'_content');//announce.php
}
@@ -977,25 +977,6 @@ function clear_staff_message_cache()
\App\Repositories\MessageRepository::updateStaffMessageCountCache(false);
}
function build_class_permission_cache()
{
$redis = \Nexus\Database\NexusDB::redis();
$results = [];
$settings = get_setting_from_db("authority");
foreach (\App\Models\User::$classes as $class => $info) {
foreach ($settings as $permission => $minClass) {
if ($class >= $minClass) {
$results[$class][] = $permission;
}
}
}
foreach ($results as $class => $permissions) {
$classKey = \App\Models\Setting::CLASS_PERMISSION_SET_KEY_PREFIX . $class;
$redis->del($classKey);
$redis->sAddArray($classKey, $permissions);
}
}
function user_can($permission, $fail = false, $uid = 0, $class = null): bool
{
$log = "permission: $permission, fail: $fail, user: $uid";
@@ -1022,7 +1003,7 @@ function user_can($permission, $fail = false, $uid = 0, $class = null): bool
$userCanCached[$permission][$uid] = true;
return true;
}
$userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid, $class);
$userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid);
$result = isset($userAllPermissions[$permission]);
if ($sequence == 0) {
$sequence++;

View File

@@ -245,7 +245,6 @@ class Update extends Install
/**
* @since 1.7.23
*/
build_class_permission_cache();
}

9
public/js/nexus.js vendored
View File

@@ -22,18 +22,19 @@ jQuery(document).ready(function () {
return {left, top}
}
var previewEle = jQuery('#nexus-preview')
var imgEle
jQuery(".preview").hover(function (e) {
var imgEle, selector = '.preview'
jQuery("body").on("mouseover", selector, function (e) {
imgEle = jQuery(this);
let position = getPosition(e, imgEle)
let src = imgEle.attr("src")
if (src) {
previewEle.attr("src", src).css(position).fadeIn("fast");
}
}, function (e) {
}).on("mouseout", selector, function (e) {
previewEle.fadeOut("fast");
}).on("mousemove", function (e) {
}).on("mousemove", selector, function (e) {
let position = getPosition(e, imgEle)
previewEle.css(position)
})
})

View File

@@ -237,7 +237,6 @@ elseif ($action == 'savesettings_authority') // save user authority
saveSetting('authority', $AUTHORITY);
$actiontime = date("F j, Y, g:i a");
write_log("Tracker USER AUTHORITY settings updated by {$CURUSER['username']}. $actiontime",'mod');
build_class_permission_cache();
go_back();
}
elseif ($action == 'savesettings_tweak') // save tweak