- 会话
用户认证通过后,为了避免用户的每次操作都进行认证可将用户的信息保证在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制,常见的有基于session方式,基于token方式等。
基于session的认证方式:
用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话)中,发给客户端的session_id存放到cookie中,这样用户客户端请求时带上session_id就可以验证服务器端是否存在session数据,以此完成用户的合法校验,当前用户退出系统或session过期销毁时,客户端的session_id也就无效了
基于session的认证机制由servelt规范制定,Servlet容器已实现,用户通过HttpSession的操作方法即可实现,如下是HttpSession的相关的API
HttpSession getSession(Boolean create) 获取当前httpsession对象
void setAttribute(String name,Object value) 向session中存放对象
object getAttribute(String name) 从session中获取对象
void removeAttribute(String name) 移除session中的对象
void invalidate() 使HttpSession失效
基于token的认证方式:
用户认证成功后,服务端生成一个token发给客户端,客户端可以放到cookie或localStorage等存储中,每次请求时带上token,服务端接收到token通过验证后即可确认用户身份
- 授权的数据模型
授权可以简单理解为Who对What(Which)进行How操作,包括如下:
Who,即主体(Subject),主体一般是指用户,也可以是程序,需要访问系统中的资源
What,即资源(Resource),如系统菜单、页面、按钮、代码方法、系统商品信息、系统订单信息等。系统菜单,页面、按钮、代码方法都属于系统功能资源,对于web系统每个功能资源通常对应一个url;系统商品信息、系统订单信息都属于实体资源(数据资源),实体资源由资源类型和资源实例组成,比如商品信息为资源类型,商品编号为001的商品为资源实例
How,权限/许可(Permission),规定了用户对资源的操作许可,权限离开了资源没有意义。如用户查询权限,用户添加权限,某个代码方法的调用权限,编号为001的用户的修改权限等,通过权限可知用户对哪些资源都有哪些操作许可。
主体(用户id,账号,密码、…)
资源(资源id,资源名称、访问地址。。。。。)
权限(权限id,权限标识,权限名称,资源id)
角色(角色id,角色名称。。。)
角色和权限的关系(角色id,权限id)
主体(用户)和角色的关系(用户id,角色id,。。。。)
通常企业开发中将资源和权限合并为一张权限表:
资源(资源id,资源名称,访问地址、…)
权限(权限id、权限标识、权限名称、资源id…)
合并为
权限(权限id,权限标识,权限名称,资源名称,资源访问地址)
RBAC:
1、基于角色的访问控制(Role-Based Access Control)是按角色进行授权,比如:主体的角色为总经历可以查询运行报表,查询员工工资信息,访问控制流程如下:
根据上图中的判断逻辑,授权代码可以标识如下:
if(主体.hasRole("总经历角色id")){
查询工资
}
如果上图中查询工资所需要的角色变化为总经理和部门经理,此时就需要修改判断逻辑为“判断用户的角色是否是总经历或部门经历”,修改代码如下:
if(主体.hasRole("总经理角色id") || 主体.hasRole("部门经历角色id")){
查询工资
}
2、基于资源的访问控制
基于资源的访问控制是按资源或权限进行授权,比如:用户必须具有查询工资权限才可以查询员工工资信息等,访问控制流程如下:
if(主体.hasPermission("查询工资权限标识")){
查询工资
}
```