大家今天跟大家聊聊我最近搞的一个挺有意思的实践,就叫它“黑暗王朝”,听起来是不是有点中二?哈哈,别急,听我慢慢道来。
事情是这样的,前段时间我不是迷上权限管理嘛然后就想着能不能自己搞一套权限系统出来。一开始想的挺简单,就是用户、角色、权限这老三样,但是真上手才发现,里面的门道可多去。
我搭个框架,用的SpringBoot,这玩意儿熟手,搭起来快。然后就开始建表,用户表、角色表、权限表、用户角色关联表、角色权限关联表,噼里啪一顿操作,数据库就有。表是建好,但是数据怎么进去?总不能手动一条一条的录?那不得累死我?
我就开始研究怎么初始化数据。最开始想的是写个SQL脚本,然后启动的时候自动执行一下。但是后来觉得这样不太灵活,万一以后要修改数据,还得改脚本,太麻烦。然后就想着能不能用Java代码来初始化数据,这样就可以动态的修改数据。于是我就写一个DataInitializer类,实现ApplicationRunner接口,在run方法里面初始化数据。这样,每次启动的时候,就会自动执行初始化数据的逻辑。
数据初始化完,接下来就是权限验证。我用的是Spring Security,这玩意儿用起来挺方便的,但是配置起来也挺麻烦的。我定义一个UserDetailsService,用于从数据库中加载用户信息。然后,配置HttpSecurity,定义哪些URL需要认证,哪些URL不需要认证。我实现一个AccessDecisionManager,用于判断用户是否有权限访问某个URL。这个AccessDecisionManager是整个权限验证的核心,所有的权限判断逻辑都在这里面。
在AccessDecisionManager里面,我获取当前用户的角色列表,然后获取当前URL需要的权限列表。如果用户有任何一个角色拥有访问该URL的权限,就允许访问。否则,就拒绝访问。这里的权限判断逻辑比较简单,就是判断用户的角色是否包含URL需要的权限。但是,实际情况可能更复杂,可能需要根据用户的具体情况来判断是否有权限访问。比如,某个用户只能访问某个URL的某个参数,或者只能访问某个URL的某个时间段等等。这些复杂的权限判断逻辑,都需要在AccessDecisionManager里面实现。
权限验证搞定,接下来就是权限管理。我写一个权限管理界面,可以添加、修改、删除用户、角色、权限。这个界面比较简单,就是一些CRUD操作。但是,这个界面是整个权限系统的入口,所有的权限管理操作都要通过这个界面来进行。这个界面一定要设计要简单易用,要功能完善。
做到这里,基本的权限系统就差不多。但是,我觉得还不够完善,还缺少一些功能。比如,权限的继承、权限的委托、权限的动态修改等等。这些功能都需要进一步的完善和优化。而且这个权限系统还缺少一些安全性方面的考虑。比如,防止SQL注入、防止XSS攻击等等。这些安全性问题都需要进一步的加强。
这回“黑暗王朝”的实践,让我对权限管理有更深入的解。也让我意识到,一个完善的权限系统,需要考虑的东西太多。不仅仅是技术上的问题,还有业务上的问题,还有安全性上的问题。路漫漫其修远兮,吾将上下而求索!
给大家分享一下这回实践的一些心得:
- 先把框架搭起来: 不要一开始就想着把所有细节都搞清楚,先把框架搭起来,跑起来,然后再慢慢的完善细节。
- 多看文档: Spring Security的文档写的很详细,多看文档可以解决很多问题。
- 多思考: 权限管理是一个复杂的领域,需要多思考,多实践,才能真正理解其中的奥妙。
好,今天的分享就到这里,希望对大家有所帮助!
还没有评论,来说两句吧...