权限模型
		
		
				把权限模型划分为页面访问控制权限和数据权限
				(
				商业逻辑权限
				)
				。其中,页面访问控制权限主要在于控制页面是否可以被访问,比如,管理员可以访问权限设置页面。数据权限主要是指是否有操作某个数据的权限,比如说组织机构中的部分问题,一个部门应该只看到本部门的数据,这就是数据权限,这个应该在业务逻辑中控制,而不是页面中。
		
		
				本权限模型专注于页面访问控制,不涉及数据操作权限。使用用户、角色、资源和操作来控制实际的页面访问。同时,区别于一般的页面权限模型,本模型采用细粒度的权限控制,可以控制到页面的具体操作,很不是整个页面不加区分。所以,这样就可以在一个页面放置多个操作,方便于用户,同时又不失安全性。
		
		
				考虑到权限在实际中很少变动,使用数据库的冗余设计,还有数据缓存等来提高效率。
		
		
				
						
						 
				
		
		
				用户:
				User
		
		
				
						       Id
				、
				name
		
		
				用户角色表(
				1
				对多):
		
		
				
						       Id
				、
				userID
				、
				roleID
		
		
				角色
				: Role
		
		
				
						       Id
				、
				name
				、
				description
				、
				defaultPage
				(系统初始化时,使用的登陆页?)
		
		
				权限
				(Role-Resource-Operation)
				:
				Authority
		
		
				
						       Id
				、
				role
				、
				resource
				、
				resourceURL
				(为效率考虑采用的冗余,等同
				Resource
				中的
				url
				,在实际验证中将使用该
				url
				来验证)、
				operationID
				、
				operationName
				(为效率考虑,采用冗余,等同
				Operation
				中的
				name
				,实际验证中使用该操作名称来做验证)
		
		
				资源:
				Resource
		
		
				
						       Id
				、
				name
				、
				description
				、
				url
		
		
				操作:
				Operation
		
		
				
						       Id
				、
				name(
				一般应改为英文,对应方法的名字
				)
				、
				description
		
		
				
						 
				
		
		
				BaseAction
				中应该有一个
				getMethodAuthMap
				(),得到方法和可用操作的映射。如果映射中找不到,则直接使用该方法名当作操作名称。如果方法映射找到了,但是为空,这意味着该方法对于任何用户都是可以访问的,不要求验证。子类可以继承和覆盖该方法,来实现特殊的权限逻辑。
		
		
				
						 
				
		
		
				权限操作应该允许复制已有的权限来生成新的权限。
		
		
				在前端控制器中设置已有的对于某个资源的操作,放到
				hashtable
				中,比如
				auth
				。对于页面,使用表达式语言
				EL
				来限制实际的逻辑,比如如下要求对于当前页面要有
				delete
				权限:
		
		
				
						       <c:if test=”auth.delete”>
		
		
				
						       </c:if>
		
		
				同时,在整体页面中,使用
				struts
				的
				dispathAction
				来做分发,
				url
				形如
				url?method=delete 
				在执行该方法之前,首先检查当前页面的这个权限
				delete
				,如果可以,则导向到正确的页面,否则导向到
				accessDenied.do
				页面(注意,该页面比较特殊,对于任何用户都应该是可以访问的,也就是前面的
				getMethodAuthMap
				返回为
				NULL
				)