权限控制
让指定的用户,只能操作指定的资源(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的功能模块
- 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架构
- Subject:主体,一般是用户或者要访问当前应用的程序
- Security Manager:安全管理器,Subject的认证、授权都要在安全管理器中进行
- Authenticator:认证器,主要负责Subject的认证
- Realm:数据域,一般是从数据库获取安全数据(认证信息),保存在Realm中,Shiro将用户信息与Realm中的安全数据进行比较,确定该用户是否具有某些权限
- Authorizer:授权器,负责Subject的授权, 控制Subject拥有的角色或者权限
- Cryptography:加密、解密,Shiro提供了很多数据加密、解密的方法
- Cache Manager:缓存管理器,缓存认证、授权信息,提高性能
shiro的认证原理、流程