Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

采坑了:Enforcer 不能持久容器化,因为对应的数据也被持久化了 #5

Closed
laojiu opened this issue Jul 2, 2021 · 12 comments

Comments

@laojiu
Copy link

laojiu commented Jul 2, 2021

Enforcer 不能持久容器化,因为对应的数据也被持久化了,导致数据无法实时对权限数据更新

vendor/donjan-deng/hyperf-casbin/src/Enforcer.php
public static function __callStatic($method, $parameters) { return ApplicationContext::getContainer()->get(Enforcer::class)->{$method}(...$parameters); }

想了下解决办法有好几种方式:
第一种是把这个容器注入的方式改成make(类似new操作,但是依赖会继续注入)
第二种就是我PR的方式直接不给成员变量赋值,每次都会重新获取,如果觉得每次查询很麻烦,可以开启缓存,实际也是读取的实时的缓存数据
第三种就是在模型操作事件中 再调用一个处理清除clean的方法(目前只是清除了缓存的key)---- 这种方式只适合单机应用

@hsluoyz
Copy link

hsluoyz commented Jul 2, 2021

@laojiu can you make a PR to fix it?

@laojiu
Copy link
Author

laojiu commented Jul 2, 2021

ok 已经提交 这个问题主要是长生命周期成员属性变量赋值的问题

@hsluoyz
Copy link

hsluoyz commented Jul 2, 2021

PR: #6

@donjan-deng
Copy link
Owner

@laojiu 单个实例应该不会出现这种问题,集群环境中,多个实例间权限数据不同步?

@hsluoyz
Copy link

hsluoyz commented Jul 6, 2021

@techoner @basakest

@laojiu
Copy link
Author

laojiu commented Jul 7, 2021

@laojiu 单个实例应该不会出现这种问题,集群环境中,多个实例间权限数据不同步?

单应用也会有问题,不会更新数据 $this->guards[$name]下的model, 这个对象不会随着cache的变更重新获取,因为他已经被放进了长生命周期里面了;咱们虽在在模型更新或者保存时已经清理了cache,但是修改不到$this->guards[$name];可以尝试通过debug工具就看到了;

@donjan-deng
Copy link
Owner

@laojiu 单个实例应该不会出现这种问题,集群环境中,多个实例间权限数据不同步?

单应用也会有问题,不会更新数据 $this->guards[$name]下的model, 这个对象不会随着cache的变更重新获取,因为他已经被放进了长生命周期里面了;咱们虽在在模型更新或者保存时已经清理了cache,但是修改不到$this->guards[$name];可以尝试通过debug工具就看到了;

参见https://github.com/php-casbin/php-casbin/blob/44028c74dba3a8fbff8f51436692e7969ce488d4/src/InternalEnforcer.php#L16addPolicyInternal方法,调用API更改权限时,都是先调用adapter操作数据库,后直接更新model

@laojiu
Copy link
Author

laojiu commented Jul 7, 2021

@laojiu 单个实例应该不会出现这种问题,集群环境中,多个实例间权限数据不同步?

单应用也会有问题,不会更新数据 $this->guards[$name]下的model, 这个对象不会随着cache的变更重新获取,因为他已经被放进了长生命周期里面了;咱们虽在在模型更新或者保存时已经清理了cache,但是修改不到$this->guards[$name];可以尝试通过debug工具就看到了;

参见https://github.com/php-casbin/php-casbin/blob/44028c74dba3a8fbff8f51436692e7969ce488d4/src/InternalEnforcer.php#L16addPolicyInternal方法,调用API更改权限时,都是先调用adapter操作数据库,后直接更新model

我刚看了源码 确实是会更新model;我上次在本地就是类似集群操作的,我当时误以为model没有更新,那我上面的结论还有待验证,我明天继续调试测试下,多谢了;如果是集群这个model的更新是不是就会有问题呢?

@donjan-deng
Copy link
Owner

@laojiu 单个实例应该不会出现这种问题,集群环境中,多个实例间权限数据不同步?

单应用也会有问题,不会更新数据 $this->guards[$name]下的model, 这个对象不会随着cache的变更重新获取,因为他已经被放进了长生命周期里面了;咱们虽在在模型更新或者保存时已经清理了cache,但是修改不到$this->guards[$name];可以尝试通过debug工具就看到了;

参见https://github.com/php-casbin/php-casbin/blob/44028c74dba3a8fbff8f51436692e7969ce488d4/src/InternalEnforcer.php#L16addPolicyInternal方法,调用API更改权限时,都是先调用adapter操作数据库,后直接更新model

我刚看了源码 确实是会更新model;我上次在本地就是类似集群操作的,我当时误以为model没有更新,那我上面的结论还有待验证,我明天继续调试测试下,多谢了;如果是集群这个model的更新是不是就会有问题呢?

针对多实例是通过单独的watcher实现的,目前还没有PHP版本的watcher,你可以在应用级事件执行Enforcer::loadPolicy(); 重新加载策略

@liminworks
Copy link

你可以在应用级事件执行Enforcer::loadPolicy(); 重新加载策略?是在每次调用Enforcer::enforce()前,调用Enforcer::loadPolicy()方法吗?

1 similar comment
@liminworks
Copy link

你可以在应用级事件执行Enforcer::loadPolicy(); 重新加载策略?是在每次调用Enforcer::enforce()前,调用Enforcer::loadPolicy()方法吗?

@liminworks
Copy link

@laojiu 单个实例应该不会出现这种问题,集群环境中,多个实例间权限数据不同步?

单应用也会有问题,不会更新数据 $this->guards[$name]下的model, 这个对象不会随着cache的变更重新获取,因为他已经被放进了长生命周期里面了;咱们虽在在模型更新或者保存时已经清理了cache,但是修改不到$this->guards[$name];可以尝试通过debug工具就看到了;

参见https://github.com/php-casbin/php-casbin/blob/44028c74dba3a8fbff8f51436692e7969ce488d4/src/InternalEnforcer.php#L16addPolicyInternal方法,调用API更改权限时,都是先调用adapter操作数据库,后直接更新model

我刚看了源码 确实是会更新model;我上次在本地就是类似集群操作的,我当时误以为model没有更新,那我上面的结论还有待验证,我明天继续调试测试下,多谢了;如果是集群这个model的更新是不是就会有问题呢?

你可以在应用级事件执行Enforcer::loadPolicy(); 重新加载策略?是在每次调用Enforcer::enforce()前,调用Enforcer::loadPolicy()方法吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants