权限控制

让指定的用户,只能操作指定的资源(CRUD),eg. 功能权限、数据权限、管理权限等。

可以使用Filter拦截请求、校验用户权限,但在大型系统中一般使用专业的权限框架来实现权限控制。

 

ACL、RBAC

常用的权限设计模式有2种

  • ACL:Access Control List 访问控制列表,用户、权限挂钩,需要单独对每个用户进行授权,简单但是分散、繁琐,不便于集中管理
  • RBAC:Role Based Access Control 基于角色的访问控制,角色、权限挂钩,对特定的觉得授予特定的权限,开发起来比ACL复杂,但对用户分类管理,可以集中管理特定类型用户的权限。

不要设置太多规则,规则过多会导致维护性、性能会下降。

 

Apache Shiro、Spring Security

  • Shiro:提供了身份验证、授权、加密、会话管理等功能,虽然没有Spring Security功能强大,但很多时候都不需要十分复杂的安全验证,使用Shiro就够了,且Shiro比Spring Security使用更简单
  • Spring Security:前身是 Acegi Security ,在Spring 项目中提供安全认证
     

二者的对比

  • Shiro使用更简单,Spring Security 功能更强大
  • Shiro可以单独使用,Spring Security 对Spring 体系支持较好,脱离Spring体系则很难开发
  • Spring Security支持OAuth鉴权,Shiro则需要自己实现

 

Shiro的功能模块

Shiro简介_shiro

  • Authentication:身份认证,验证用户是不是拥有相应的身份,一般是登录时进行身份认证
  • Authorization:授权,给用户分配角色或者访问某些资源的权限
  • Session Manager:会话(session)管理,一般使用session管理用户会话信息
  • Cryptography:数据加密、解密,保护数据的安全性,eg. 密码加密后存储到数据库

以上是Shiro提供的基础功能,以下是Shiro提供的特性,根据需要使用

  • Web Support:提供对web项目的支持,使shiro可以被集成到web项目中
  • Caching:缓存,eg. 用户登录后,缓存用户信息、拥有的角色/权限,不必每次都去数据库查询,提高效率
  • Concurrency:提供对多线程应用的并发验证支持,eg. 在一个线程中启动另一个线程,会自动把用户权限传播过去
  • Testing:提供测试支持
  • Run As:允许一个用户以另一个用户的身份进行操作、访问
  • Remember Me:登录后会记住该用户

 

Shiro架构

Shiro简介_权限控制_02

  • Subject:主体,一般是用户或者要访问当前应用的程序
  • Security Manager:安全管理器,Subject的认证、授权都要在安全管理器中进行
  • Authenticator:认证器,主要负责Subject的认证
  • Realm:数据域,一般是从数据库获取安全数据(认证信息),保存在Realm中,Shiro将用户信息与Realm中的安全数据进行比较,确定该用户是否具有某些权限
  • Authorizer:授权器,负责Subject的授权, 控制Subject拥有的角色或者权限
  • Cryptography:加密、解密,Shiro提供了很多数据加密、解密的方法
  • Cache Manager:缓存管理器,缓存认证、授权信息,提高性能

 

shiro的认证原理、流程

Shiro简介_shiro_03