功能需求:web项目用户权限问题,不同用户拥有不同权限。用户不能越权访问资源须要验证用户权限。
用户每一次访问都必须验证用户此次请求的URL地址与用户所拥有权限的URL地址是否一致,验证时就须要查询数据库。当数据访问频繁或访问量
比较大时增加了数据库的压力。界面反应较慢,用户体验差。以下为解决方案:
将项目所以URL地址映射为一个int值,此值为权限值。将多个URL地址映射的权限值通过(2^n+2^m)式运算组成角色。再将角色赋与用户。
例:
url请求地址 权限值
url :http://rowsTest/add**.action authorityValue: 1
url :http://rowsTest/del**.action authorityValue: 2
role权限和
roleAuthorityValue: 2^1+2^2 = 6 此角色可访问以上两个URL地址
userAuthority: 6 此用户拥有此角色可访问以上两个URL地址
当用户登陆时将用户的角色值放到session。每一个求地址后传本请求地址权限值(url?authorityValue=1)
验证用户是否拥有访问http://rowsTest/add**.actionURL地址的权限。
(userAuthority & ((int)Math.pow(2, 1))) == ((int)Math.pow(2, 1)) ? true:false
如何返回true通过否则绝决访问。
优点:位运算速度快,资源消耗少,用户UI反应快。用户体验好。用户可根据功能自定义角色。
缺点:多个开发人员自定义权限值可能重复。数据库必须有功能对应的URL地址表与角色表。有一定的依赖关系。