上一章说的认证与会话管理,这章是访问控制,刚看访问控制这章的时候,感觉跟上章的“授权”没什么区别,第一感受就是“授权”。
之后看了才进一步了解,“授权”是好比屋子的主人进来了,那么他可以坐在客厅,也可以进到卧室睡觉,这种情况下就可以说他具有屋子的“最高权限”。如果进来的是客人,那么他可能就仅仅被允许在客厅的了。“授权”在这层上面可以理解的就是被允许做的事情,但是在一个系统中,怎么去限制一个客人只能够待在客厅里面的。这就是“访问控制”来做的事情了,“访问控制”也即是“权限控制”。抽象地说,都是某个主体对某个客体需要实施某种操作,而系统对这种操作的限制就是权限控制。
举个例子:在Linux操作系统中,对文件的访问控制。此时“主体”是系统的用户,“客体”是被访问的文件,能否访问成功,将由操作系统给文件设置的ACL(访问控制列表)决定。一个文件可以执行的操作分为“读”、“写”、“执行”三种,分别由 r、w、x表示。这三种操作同时对应着三种主体:文件拥有者、文件拥有者所在的用户组、其他用户。
在一个安全系统中,确定主体的身份是“认证”解决的问题;而客体是一种资源,是主体发起的请求的对象。在主体对客体进行操作的过程中,系统主体不能“无限制”地对客体进行操作,这个过程就是“访问控制”。
在web应用中,根据访问客体的不同,常见的访问控制可以分为“基于URL的访问控制”、“基于方法的访问控制”和“基于数据的访问控制”。
只是自己平时遇到的在访问控制环节可能的漏洞:
- 未授权访问,这个是指web网页的未授权访问
- 垂直越权
- 登录界面会遇到的多,修改用户名
- 登录时,修改可能POST的角色ID
- 访问其它权限网页时,修改URL中某个参数
- 水平越权
- 同一级的角色,可以获取别人的信息,修改URL中参数ID
以上是暂时想到的,之后再扩展补充。
对于垂直越权,提出的“基于角色的访问控制”来限制,spring security 中的两种权限管理方式,“基于URL的访问控制”、“基于方法的访问控制”。都是以RBAC模型来实现的,在spring security中都是验证该用户所属的角色,以决定是否授权。
对于“基于URL的访问控制”,spring security使用配置文件对访问URL的用户权限进行设定,如下:
<sec:http> <sec:intercept-url pattern="/president_portal.do**" access="ROLE_PRESIDENT" /> <sec:intercept-url pattern="/manager_portal.do**" access="ROLE_MANAGER" /> <sec:intercept-url pattern="/**" access="ROLE_USER" /> <sec:form-login /> <sec:logout /> </sec:http>
不同的URL对于能访问其的角色有着不同的要求。