权限管理:实现对用户访问系统的控制,按照安全规则或策略控制用户只能访问自己被授权的资源。
用户认证:验证用户身份合法性。
关键对象:
subject:主体(用户/程序),访问系统资源
principal:身份信息,唯一性。一个主体可拥有多个身份信息,但是都有一个主身份信息(primary principal)
credential:凭证信息,密码/指纹/证书
主体在进行身份认证时需要提供相应的身份信息和凭证信息。
用户授权:用户认证通过后,对用户访问的资源进行控制,具有访问权限才可访问。 -- 访问控制
授权过程:who 对 what/which 进行 how 操作
who:主体subject,subject在认证通过后系统进行访问控制
what/which:资源resource,subject必须几倍资源的访问权限才可以访问该资源
资源Resource:对比类与实例
资源类型:系统的用户信息
资源实例:系统中id为001的用户 -- 资源类型的具体化
how:权限/许可permission,subject必须具有permisson才可以访问资源。permission权限比如:CURD
分配权限:
用户需要分配相应的权限才可访问相应的资源,权限是对资源的操作许可。资源权限需要持久化存储,存储在关系数据库中。
权限模型:
权限控制:授权核心
基于角色的访问控制:不利于系统维护,拓展。
基于资源的访问控制:
资源在系统中是不变的,对资源的访问需要permission。变更权限只需要分配在权限模块上去操作。
权限管理解决方案:
粗粒度和细粒度权限:
粗粒度权限管理,是对资源类型的权限管理
细粒度权限管理,是对资源实例的权限管理 -- 数据级别的权限管理
如何实现粗粒度的权限管理?
将权限管理的代码抽取出来,在系统架构级别进行统一处理。 例如:通过springmvc拦截器实现授权
如何实现细粒度的权限管理?
在数据级别的是没有共性的细粒度的权限管理就是业务逻辑的一部分,在业务层进行处理。
解决方案:
基于URL拦截的方式实现:springmvc配置拦截器
拦截器模式下,将需要拦截进行判断处理的url进行集中处理,每次请求均会拦截,此时对用户身份认证(登录)会产生多次的数据库查询请求,这里的解决方案一方面是将用户的信息(基本信息,权限信息 -- 可访问的url等)存入Session/cache。
基于权限管理框架的实现:shiro权限管理框架
小结:
使用基于url拦截的方式,实现起来比较简单,不依赖框架,仅适用web容器提供的filter即可(springmvc下是interceptor),需要将所有的url进行登记配置。但是配置繁琐,不易于维护,url和权限的表示方式不规范。