一开始我把控制数据权限写在业务里,以订单管理为例,先讨论一个最简单的情况。管理员可以看所有的订单,而用户只能看自己的订单。这里的管理员是一个角色。我会这么写(一些次要代码都省略了):
java 代码
- List getOrders(String userId){
- String sql;
- Role role=orgService.getRoleForUser(userId);
- if(("admin").equals(role.getName()))
- sql="select * from order";
- else
- sql="select * from order where author="+userId;
- Object o=excuteSql(sql);
- return excute(o);
- }
恩,不错,很好的完成了权限控制。过了没多久,公司发展了,老板增加了人手,老板发话了,我要设置区域管理员分管不同区域的订单。管理员分为北京地区管理员,上海地区管理员,其他地区管理员和总管理员。怎么办?修改代码吧
java 代码
- List getOrders(String userId){
- String sql;
- Role role=orgService.getRoleForUser(userId);
- if(("admin").equals(role.getName()))
- sql="select * from order";
- else if("bjadmin").equals(role.getName()))
- sql="select * from order where area='beijing'";
- else if("shadmin").equals(role.getName()))
- sql="select * from order where area='shanghai'";
- else if("qtadmin").equals(role.getName()))
- sql="select * from order where area='qita'";
- else
- sql="select * from order where author="+userId;
- Object o=excuteSql(sql);
- return excute(o);
- }
恩恩,这就搞定了,可怎么也感觉不爽,也许该做点什么。一堆if/else权限判断让人心烦,再写个类把这些sql管理起来好了,
那就动手吧
java 代码
- public class SqlManager{
- String getSql(String userId){
- String sql;
- Role role=orgService.getRoleForUser(userId);
- if(("admin").equals(role.getName()))
- sql="select * from order";
- else if("bjadmin").equals(role.getName()))
- sql="select * from order where area='beijing'";
- else if("shadmin").equals(role.getName()))
- sql="select * from order where area='shanghai'";
- else if("qtadmin").equals(role.getName()))
- sql="select * from order where area='qita'";
- else
- sql="select * from order where author="+userId;
- return sql;
- }
- }
这样把权限判断移到SqlManager里,业务代码就清爽了很多,再增加管理员就修改SqlManager好了
java 代码
- List getOrders(String userId){
- String sql=sqlManager.getSql(userId);
- Object o=excuteSql(sql);
- return excute(o);
- }
呵呵,看起来还不错。但是等等,我们的业务方法为什么需要userId这个参数呢,是啊是啊,权限判断用到了它,但是那和我业务又有什么关系呢,不爽。现在AOP不是很流行吗,你不用AOP怎么能说明你技术高呢?快用吧快用吧,用不着也要想着方法用。
业务方法简化为
java 代码
- List getOrders(){
- String sql="";
- Object o=excuteSql(sql);
- return excute(o);
- }
对excuteSql方法我们来AOP一下,注入权限判断过的sql.嘿嘿,技术水平又一次得到了显现。业务方法是幸福了,可我的SqlManager倒是很不幸福。咋办?用个配置文件吧,hibernate不是老鼓励我们把sql写在配置文件里吗?
xml 代码
- <xml>
- <sql role="admin">select * from order</sql>
- <sql role="bjadmin">select * from order where area='beijing'</sql>
- <sql role="shadmin">select * from order where area='shanghai'</sql>
- <sql role="qtadmin">select * from order where area='qita'</sql>
- <sql role="none">select * from order where author=?</sql>
- </xml>
这样SqlManager就可以把行数缩小了,就可以敏捷一点了。
java 代码
- public class SqlManager{
- String getSql(String userId){
- String sql;
- Role role=orgService.getRoleForUser(userId);
- sql=getSqlfromXml(role.getName());
- return sql;
- }
-
- String getSqlfromXml(String rolename){
- ....
- }
- }
以后再增加权限连类都不用修改了,改xml好了。等等,你是不是把问题太简单化了。现在不仅仅是订单,货物也要这么分区域管理。不错,我们应该想着通用一下了。这样,把SqlManager抽象一下
java 代码
- String abstract getSqlfromXml(String rolename);
然后做几个子类好了 OrderSqlManager, GoodsSqlManager .
可是,哥们,书上说,要面向接口编程,你这样不太好吧。没事,再接口一下:
java 代码
- public interface SqlManagerInterface{
- String getSql(String userId);
- }
还是没法用啊。也许现在可以看看acegi的provider机制了,把这一大堆SqlManager全部作为provider,根据不同的模块选择不同的provider,统一拦截excuteSql方法,生成不同的sql到数据库执行。xml不爽?db也可以。然后,再然后呢?改你的类名,重构,和acegi整合一下。
呵呵,完全是个人的一些想法,希望多批评提提意见。我想表达的意思是:也许把数据权限再抽象一些,以组件的形式来减少侵入是可以做到的。
分享到:
相关推荐
MATLAB实验一二 数值计算
Java毕业设计-ssm基于SSM的英语学习网站的设计与实现演示录像(高分期末大作业)
平安保险-智富人生A的计算
MATLAB实验五六 图像相关应用
AUTOSAR_SRS_FreeRunningTimer.pdf
onnxruntime-1.7.1-cp39-cp39-linux_armv7l.whl.zip
qwen2 colab代码
885 - Space Scooter.mpd
该资源是软考-信息系统项目管理师 高级考试 相关的论文资源,《论项目整体管理》。项目基于本人在实际的工作中的最佳实践,以软件工程实施为背景,从 制定项目章程、制定项目管理计划、指导与管理项目工作、管理项目知识、监控项目工作、实施整体变更控制、结束项目或阶段的角度介绍了项目资源管理的方法论。 理论框架基于最新的 PMBOK 第6版,核心理念是项目管理是一个综合性工程,不仅要重点关注项目范围、进度、成本、质量四要素,更要关注整体管理、资源管理、风险管理、干系人管理、沟通管理、采购管理、绩效域管理等。在项目新兴实践方面还要注意与敏捷管理的结合,因为现在的大型项目更多使用的是混合型开发模式,主体功能采用预测型生命周期,而分支功能或非主体功能可能采用敏捷生命周期,只有综合运用领导力技能和项目管理的最佳实践,才能使项目最终走向成功。
AUTOSAR_SWS_IntrusionDetectionSystemManager.pdf
python模块onnxruntime版本
AUTOSAR_SRS_SAEJ1939.pdf
AUTOSAR_SRS_CryptoStack.pdf
瑞士轮
cfx
纸片战争Beta压缩试行代码
python模块onnxruntime版本
Java毕业设计-ssm汽车租赁管理演示录像(高分期末大作业)
树状数组-20-子查询.ev4.rar
此资源为完整项目部署后演示效果视频,可参考后再做项目课设决定。 包含:项目源码、数据库脚本、项目说明等,有论文参考,该项目可以直接作为毕设使用。 技术实现: 后台框架:SpringBoot框架 或 SSM框架 数据库:MySQL 开发环境:JDK、IDEA、Tomcat 项目都经过严格调试,确保可以运行! 博主可有偿提供毕设相关的技术支持 如果您的开发基础不错,可以在此代码基础之上做改动以实现更多功能。 其他框架项目设计成品不多,请根据情况选择,致力于计算机专业毕设项目研究开发。