AccessController.doPrivileged的理解备忘
程序员文章站
2022-05-20 13:46:19
...
有了doPrivileged,低权限的代码就可以调用高权限的代码来做一些需要高特权才能做的事情,是这样吗?那低权限的代码岂不是啥权限都有了?
按相关文档理解,doPrivileged 这个特权操作是为解决一个奇怪现象:高权限代码被低权限代码调用时,它的高权限竟然失效了。就好比,一个公司员工被亲戚委托问问公司HR最近还招不招人,结果,从接受委托的那一刻起,这个员工的行为处处受到约束,连在公司喝杯咖啡,都要被连带检查他的亲戚是否有喝咖啡的权限,如果亲戚没有权限,他这咖啡就喝不成了;而这员工有个习惯,不喝杯咖啡就没精神办事,那完了,亲戚委托的事情办不了了。。。
其实该员工在公司的权限挺大的,咋会这样呢,那能不能这样:凡是接受委托办事,就宣告做特权处理(doPrivileged),喝咖啡的事情就不受影响了。那不行!亲戚委托你把公司电脑带回家给他,难道你就给带回去了,那只说明你这个“高权限代码”实现不当。 你应该这么干:人家委托你的事情呢,碰到公司有人检查你做该事情的权限,该怎么检查就怎么检查(会连带检查委托人的权限),而在办理委托事项的过程中的其他行为,你尽可以宣告以你自己的权限处理(跟委托人无关),也就是说喝咖啡和办事情是两个调用分支。嗯,你就是个“高权限代码”。
按相关文档理解,doPrivileged 这个特权操作是为解决一个奇怪现象:高权限代码被低权限代码调用时,它的高权限竟然失效了。就好比,一个公司员工被亲戚委托问问公司HR最近还招不招人,结果,从接受委托的那一刻起,这个员工的行为处处受到约束,连在公司喝杯咖啡,都要被连带检查他的亲戚是否有喝咖啡的权限,如果亲戚没有权限,他这咖啡就喝不成了;而这员工有个习惯,不喝杯咖啡就没精神办事,那完了,亲戚委托的事情办不了了。。。
其实该员工在公司的权限挺大的,咋会这样呢,那能不能这样:凡是接受委托办事,就宣告做特权处理(doPrivileged),喝咖啡的事情就不受影响了。那不行!亲戚委托你把公司电脑带回家给他,难道你就给带回去了,那只说明你这个“高权限代码”实现不当。 你应该这么干:人家委托你的事情呢,碰到公司有人检查你做该事情的权限,该怎么检查就怎么检查(会连带检查委托人的权限),而在办理委托事项的过程中的其他行为,你尽可以宣告以你自己的权限处理(跟委托人无关),也就是说喝咖啡和办事情是两个调用分支。嗯,你就是个“高权限代码”。