1.权限

概述

权限管理是实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

权限管理包括用户认证和授权两部分。

用户认证

用户去访问系统,系统要验证用户身份的合法性。

最常用的用户身份验证的方法:1、用户名密码方式、2、指纹打卡机、3、基于证书验证方法。

subject:主体,用户要去访问系统的资源,系统需要对subject进行身份认证。

principal:身份信息,通常是唯一的,一个主体还有多个身份信息,但是都有一个主身份信息。

credential:凭证信息,可以是密码 、证书、指纹。

用户授权

简单理解为访问控制。用户认证通过后,系统对用户访问资源进行控制,用户具有资源的访问权限方可访问。

权限模型

六张表模型

主体(账号、密码)

资源(资源名称、访问地址)

权限(权限名称、资源id)

角色(角色名称)

角色和权限关系(角色id、权限id)

主体和角色关系(主体id、角色id)

shiro - 图1

通常企业开发中将资源和权限表合并为一张权限表,权限(权限名称、资源名称、资源访问地址)

权限控制

权限控制一般有两种模式:一种是基于角色来分配权限。另一种是基于资源来分配权限。

基于角色的访问控制

基于角色的访问控制是不利于系统维护(可扩展性不强)。

  1. //如果该user是部门经理则可以访问if中的代码
  2. if(user.hasRole('部门经理')){
  3. //系统资源内容
  4. //用户报表查看
  5. }

基于资源的访问控制

资源是可以在数据库中配置,可以通过页面的权限模块来操作。建议使用基于资源的访问控制实现权限管理。

//这里的权限标识符可以理解你在数据库配置了uri权限资源,那这里可以理解判断该用户有没有该页面的访问权限
if(user.hasPermission ('权限标识符(比如url)')){
    //系统资源内容
    //用户报表查看
}

解决方案

粗粒度权限

对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、页面中按钮。

将权限管理的代码抽取出来在系统架构级别统一处理。比如:通过springmvc的拦截器实现授权。

细粒度管理

对资源实例的权限管理,资源实例是资源类型的具体化。

业务层控制细粒度权限。

2.Shiro

Apache Shiro是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理,令行应用程序。

3.架构

Subject

Subject:主体,用来与用户交互的对象。比如认证用户信息, subject.login(用户信息);判断用户是否有相关的角色 subject.hasRole(“小学生”)

SecurityManager

SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等

Authenticator

Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口。

Authorizer

Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

Realm

Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据。

SessionManager

sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

CacheManager

CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

Cryptography

Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

shiro - 图2

认证

授权