用户授权,简单理解为访问控制,在用户认证通过后,系统对用户访问资源进行控制,用户具有资源的访问权限方可访问.
授权的过程理解为:who对what(which)进行how操作。 who:主体即subject,subject在认证通过后系统进行访问控制。 what(which):资源(Resource),subject必须具备资源的访问权限才可访问该 资源。资源比如:系统用户列表页面、商品修改菜单、商品id为001的商品信息。 资源分为资源类型和资源实例: 系统的用户信息就是资源类型,相当于java类。 系统中id为001的用户就是资源实例,相当于new的java对象。 how:权限/许可(permission) ,针对资源的权限或许可,subject具有permission访问资源,如何访问/操作需要定义permission,权限比如:用户添加、用户修改、商品删除。
主体(账号、密码) 资源(资源名称、访问地址) 权限(权限名称、资源id) 角色(角色名称) 角色和权限关系(角色id、权限id) 主体和角色关系(主体id、角色id)
如下图:
通常企业开发中将资源和权限表合并为一张权限表,如下: 资源(资源名称、访问地址) 权限(权限名称、资源id) 合并为: 权限(权限名称、资源名称、资源访问地址)
上图常被称为权限管理的通用模型,不过企业在开发中根据系统自身的特点还会对上图进行修改,但是用户、角色、权限、用户角色关系、角色权限关系是需要去理解的。
用户需要分配相应的权限才可访问相应的资源。权限是对于资源的操作许可。通常给用户分配资源权限需要将权限信息持久化,比如存储在关系数据库中。把用户信息、权限管理、用户分配的权限信息写到数据库(权限数据模型)
RBAC(role based access control),基于角色的访问控制。 比如: 系统角色包括 :部门经理、总经理。。(角色针对用户来划分) 系统代码中实现: //如果该user是部门经理则可以访问if中的代码 if(user.hasRole('部门经理')){ //系统资源内容 //用户报表查看 } 问题: 角色针对人划分的,人作为用户在系统中属于活动内容,如果该 角色可以访问的资源出现变更,需要修改你的代码了,比如:需要变更为部门经理和总经理都可以进行用户报表查看,代码改为: if(user.hasRole('部门经理') || user.hasRole('总经理') ){ //系统资源内容 //用户报表查看 } 基于角色的访问控制是不利于系统维护(可扩展性不强)。
RBAC(Resource based access control),基于资源的访问控制。 资源在系统中是不变的,比如资源有:类中的方法,页面中的按钮。 对资源的访问需要具有permission权限,代码可以写为: if(user.hasPermission ('用户报表查看(权限标识符)')){ //系统资源内容 //用户报表查看 } 上边的方法就可以解决用户角色变更不用修改上边权限控制的代码。 如果需要变更权限只需要在分配权限模块去操作,给部门经理或总经理增或删除权限。 建议使用基于资源的访问控制实现权限管理。
总结:
在想要对shiro有很好的了解,这些基础知识是必须了解的.下篇博客将讲解权限管理解决方案.如果您喜欢博文,请点击末尾的"顶"
