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
+2 -3
View File
@@ -15,9 +15,8 @@ class Setting extends NexusModel
public static array $permissionMustHaveClass = ['defaultclass', 'staffmem']; public static array $permissionMustHaveClass = ['defaultclass', 'staffmem'];
const CLASS_PERMISSION_SET_KEY_PREFIX = 'nexus_class_permissions_'; const DIRECT_PERMISSION_CACHE_KEY_PREFIX = 'nexus_direct_permissions_';
const DIRECT_PERMISSION_SET_KEY_PREFIX = 'nexus_direct_permissions_'; const ROLE_PERMISSION_CACHE_KEY_PREFIX = 'nexus_role_permissions_';
const ROLE_PERMISSION_SET_KEY_PREFIX = 'nexus_role_permissions_';
/** /**
* get setting autoload = yes with cache * get setting autoload = yes with cache
+15 -25
View File
@@ -365,49 +365,39 @@ class ToolRepository extends BaseRepository
return $result; return $result;
} }
public static function listUserClassPermissions($uid): array public static function listUserClassPermissions($class): array
{ {
$userInfo = get_user_row($uid);
$settings = Setting::get('authority'); $settings = Setting::get('authority');
$result = []; $result = [];
foreach ($settings as $permission => $minClass) { foreach ($settings as $permission => $minClass) {
if ($minClass >= User::CLASS_PEASANT && $minClass <= $userInfo['class']) { if ($minClass >= User::CLASS_PEASANT && $minClass <= $class) {
$result[] = $permission; $result[] = $permission;
} }
} }
return $result; return $result;
} }
public static function listUserAllPermissions($uid, $class = null): array public static function listUserAllPermissions($uid): array
{ {
static $uidPermissionsCached = []; static $uidPermissionsCached = [];
if (isset($uidPermissionsCached[$uid])) { if (isset($uidPermissionsCached[$uid])) {
return $uidPermissionsCached[$uid]; return $uidPermissionsCached[$uid];
} }
$log = "uid: $uid"; $log = "uid: $uid";
if ($class === null) { $userInfo = get_user_row($uid);
$userInfo = get_user_row($uid); $class = $userInfo['class'];
$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;
//Role permission, use push mechanism, already prepared, see plugin role saving //Class permission
$setKeys = apply_filter("role_permission_set_keys", $setKeys, $uid); $classPermissions = self::listUserClassPermissions($class);
//Direct permission, use pull mechanism //Role permission
$key = Setting::DIRECT_PERMISSION_SET_KEY_PREFIX . $uid; $rolePermissions = apply_filter("user_role_permissions", [], $uid);
$setKeys[] = $key;
if (!$redis->exists($key)) { //Direct permission
$log .= ", init direct permissions"; $directPermissions = apply_filter("user_direct_permissions", [], $uid);
$userPermissionsArr = apply_filter("user_direct_permissions", [], $uid);
$redis->sAddArray($key, $userPermissionsArr); $allPermissions = array_merge($classPermissions, $rolePermissions, $directPermissions);
} do_log("$log, allPermissions: " . json_encode($allPermissions));
$allPermissions = $redis->sUnion($setKeys);
do_log("$log, allSetKeys: " . json_encode($setKeys) . ", allPermissions: " . json_encode($allPermissions));
$result = array_combine($allPermissions, $allPermissions); $result = array_combine($allPermissions, $allPermissions);
$uidPermissionsCached[$uid] = $result; $uidPermissionsCached[$uid] = $result;
return $result; return $result;
+2 -21
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}_content");
\Nexus\Database\NexusDB::cache_del("user_{$uid}_roles"); \Nexus\Database\NexusDB::cache_del("user_{$uid}_roles");
\Nexus\Database\NexusDB::cache_del("announce_user_passkey_$uid");//announce.php \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) { if ($passkey) {
\Nexus\Database\NexusDB::cache_del('user_passkey_'.$passkey.'_content');//announce.php \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); \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 function user_can($permission, $fail = false, $uid = 0, $class = null): bool
{ {
$log = "permission: $permission, fail: $fail, user: $uid"; $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; $userCanCached[$permission][$uid] = true;
return true; return true;
} }
$userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid, $class); $userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid);
$result = isset($userAllPermissions[$permission]); $result = isset($userAllPermissions[$permission]);
if ($sequence == 0) { if ($sequence == 0) {
$sequence++; $sequence++;
-1
View File
@@ -245,7 +245,6 @@ class Update extends Install
/** /**
* @since 1.7.23 * @since 1.7.23
*/ */
build_class_permission_cache();
} }
+5 -4
View File
@@ -22,18 +22,19 @@ jQuery(document).ready(function () {
return {left, top} return {left, top}
} }
var previewEle = jQuery('#nexus-preview') var previewEle = jQuery('#nexus-preview')
var imgEle var imgEle, selector = '.preview'
jQuery(".preview").hover(function (e) { jQuery("body").on("mouseover", selector, function (e) {
imgEle = jQuery(this); imgEle = jQuery(this);
let position = getPosition(e, imgEle) let position = getPosition(e, imgEle)
let src = imgEle.attr("src") let src = imgEle.attr("src")
if (src) { if (src) {
previewEle.attr("src", src).css(position).fadeIn("fast"); previewEle.attr("src", src).css(position).fadeIn("fast");
} }
}, function (e) { }).on("mouseout", selector, function (e) {
previewEle.fadeOut("fast"); previewEle.fadeOut("fast");
}).on("mousemove", function (e) { }).on("mousemove", selector, function (e) {
let position = getPosition(e, imgEle) let position = getPosition(e, imgEle)
previewEle.css(position) previewEle.css(position)
}) })
}) })
-1
View File
@@ -237,7 +237,6 @@ elseif ($action == 'savesettings_authority') // save user authority
saveSetting('authority', $AUTHORITY); saveSetting('authority', $AUTHORITY);
$actiontime = date("F j, Y, g:i a"); $actiontime = date("F j, Y, g:i a");
write_log("Tracker USER AUTHORITY settings updated by {$CURUSER['username']}. $actiontime",'mod'); write_log("Tracker USER AUTHORITY settings updated by {$CURUSER['username']}. $actiontime",'mod');
build_class_permission_cache();
go_back(); go_back();
} }
elseif ($action == 'savesettings_tweak') // save tweak elseif ($action == 'savesettings_tweak') // save tweak