请教一些关于权限验证方面的好思路

bangbong 2012-01-29 11:36:00
这是一个很常见的场景和需求:
使用J2EE技术建立的B/S系统,基本上都少不了要进行权限控制,一般都有“用户”、“权限”、“角色”之类的概念。
为了讨论方便,假设系统使用了MVC框架例如Struts2,以.do作为动作请求URL后缀。
问题是这样的:
有两个用户账号,分别是A、B
系统的controller提供有两个可用的动作,分别是add.do、delete.do,用于新增和删除。
但是这两个动作并不是对所有用户账号可用,B的权限设计为只能add,不能delete。
如果服务器不作权限验证,那么B就有可能访问到delete.do(例如直接在浏览器中输入delete.do加参数以GET方式请求),从而删除了数据,而这是不合法的,B做了超出自身账号权限的事情。

一个复杂的系统可能有很多.do动作,如果给每一个账号都设置一套功能集(也就是这个账号可以访问哪些动作),或者设置一些角色/组,将用户设为角色/组,再给每个角色/组设置一套功能集,当每次用户请求时,服务器都检查这个用户请求是否在合法的功能集中,这样感觉不仅要设置非常繁多的功能集配置,而且可能速度还会有一定影响(因为每次请求都要检查权限)。

请教各位达人有没有什么比较好比较方便的方法可以解决这种比较通用的问题,谢谢!
...全文
105 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2012-01-29
  • 打赏
  • 举报
回复
基于RoleBase的权限体系就是这样的,没啥更精简的做法。

只不过具体处理的时候,你可以选择用已有的开源框架来解决这些问题的处理,比如Spring-Security甚至用J2EE标准的JAAS。

当然也可以自己需实现一套框架,但工作量相对大点。一般来说,功能级(页面)权限控制会用Filter来处理,用户的角色和功能权限列表,会保存在Session中;Filter只需要有一套URL-->功能代码的映射就够了。但如果是操作级(按钮)权限控制,就需要更细化的设计了,比如需要跟Filter约定好,每个操作对应的标准命令规则,然后Filter同样能通过查找映射表来完成。

最后,URL、操作 --> 功能代码、操作代码 的映射信息,在系统启动时初始化到内存中;用户的角色和功能权限列表,在用户登录时加载到Session中,如果怕内存不够大,还可以用MemoryCache之类的外部缓存来实现。
朝花夕拾 2012-01-29
  • 打赏
  • 举报
回复
用RBAC的思想吧。。用filter控制就差不多了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧