概述
Apache Shiro 是一个功能强大且灵活的开源安全框架,可以干净地处理身份验证,授权,企业会话 Management 和加密。
Apache Shiro 的首要目标是易于使用和理解。安全有时可能非常复杂,甚至会很痛苦,但不一定如此。框架应尽可能掩盖复杂性,并公开干净直观的 API,以简化开发人员确保其应用程序安全的工作。
您可以使用 Apache Shiro 进行以下操作:
-
验证用户身份以验证其身份
-
对用户执行访问控制,例如:
-
确定是否为用户分配了特定的安全角色
- 确定是否允许用户做某事
-
即使在没有 Web 或 EJB 容器的情况下,也可以在任何环境中使用 Session API。
-
在身份验证,访问控制或会话的生存期内对事件做出反应。
-
汇总 1 个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图”。
-
启用单点登录(SSO)功能
-
启用“记住我”服务以进行用户关联而无需登录
…
以及更多-所有这些都集成到一个易于使用的内聚 API 中。
Shiro 尝试在所有应用程序环境中实现这些目标-从最简单的命令行应用程序到最大的企业应用程序,而不必强加对其他第三方框架,容器或应用程序服务器的依赖。当然,该项目旨在尽可能地集成到这些环境中,但是可以在任何环境中直接使用它。
架构
-
Subject: org.apache.shiro.subject.Subject
当前与软件交互的实体(用户,第三方服务,cron 作业等)
-
SecurityManager:org.apache.shiro.mgt.SecurityManager
shiro的核心框架,管理整个shiro组件
-
Authenticator: org.apache.shiro.authc.Authenticator
负责执行用户的身份验证,默认使用org.apache.shiro.authc.pam.ModularRealmAuthenticator实例
-
AuthenticationStrategy:org.apache.shiro.authc.pam.AuthenticationStrategy
认证策略,当存在多个realm时,将调用认证策略发起多次realm身份验证
-
Authorizer:org.apache.shiro.authz.Authorizer
授权,负责用户是否允许执行某些动作
-
SessionManager:org.apache.shiro.session.mgt.SessionManager
会话管理
-
Realm:org.apache.shiro.realm.Realm
- 充当 Shiro 与应用程序安全数据之间的“桥梁”或“连接器”。当需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro 会从一个或多个为应用程序配置的领域中查找许多此类内容。可以根据需要配置多个
Realms
(通常每个数据源一个),并且 Shiro 会根据需要与它们进行协调,以进行身份验证和授权。 - Realm实现是与数据源(RDBMS,LDAP 等)进行通信的对象
- 充当 Shiro 与应用程序安全数据之间的“桥梁”或“连接器”。当需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro 会从一个或多个为应用程序配置的领域中查找许多此类内容。可以根据需要配置多个
-
SessionManager:org.apache.shiro.session.mgt.SessionManager
-
SessionDAO:org.apache.shiro.session.mgt.eis.SessionDAO
-
CacheManager:org.apache.shiro.cache.CacheManager
开发时常用流程
常用核心组件
- SecuritManager:管理整个shiro框架
- 在springboot中使用:org.apache.shiro.web.mgt.DefaultWebSecurityManager
- DefaultWebSecurityManager中可以设置Session、Cookie等
- Subject:主体(可以理解为用户信息,即与服务器交互的主题)
- 当执行Subject.login时会最终执行Realm.doGetAuthenticationInfo
- Realm:认证时执行对应的代码逻辑
- 内置了一些Realm(可以自行查看AuthorizingRealm的实现类),但实际使用时最好自定义。
- 认证时会调用:doGetAuthenticationInfo
- 授权时会调用:doGetAuthorizationInfo
- CredentialsMatcher:身份匹配器
- 默认的身份匹配器:org.apache.shiro.authc.credential.SimpleCredentialsMatcher
- 默认的Realm在调用doGetAuthenticationInfo时会调用CredentialsMatcher.doCredentialsMatch
- Filter:过滤器
- 默认的过滤器:在
org.apache.shiro.web.filter.mgt.DefaultFilter
里面定义的;名字 类型 描述 anon(AnonymousFilter.class) 认证 不需要认证,便可以访问资源 authc(FormAuthenticationFilter.class) 认证 需要对应的form表单认证才能访问对应的资源,适用于前后端不分离的情况(安全性不高) authcBasic(BasicHttpAuthenticationFilter.class) 认证 需要登录才能访问对应的资源,认证方式为http中Basic的认证方式(安全性一般) authcBearer(BearerHttpAuthenticationFilter.class) 认证 需要登录才能访问对应的资源,认证方式为OAuth2的认证方式(安全性好) logout(LogoutFilter.class) 认证 用于处理用户登出操作。当用户访问登出URL时,将执行登出操作并重定向到指定的页面,适用于前后端不分离的情况 noSessionCreation(NoSessionCreationFilter.class) 认证 添加这个过滤器后,就会处于无状态的模式,即禁止创建会话 perms(PermissionsAuthorizationFilter.class) 授权 需要特定的权限才能访问 port(PortFilter.class) 授权 需要指定的端口才能访问 rest(HttpMethodPermissionFilter.class) 授权 用于处理RESTful风格的请求 roles(RolesAuthorizationFilter.class) 授权 用于检查用户是否具有特定的角色 ssl(SslFilter.class) 其他 需要https的请求 user(UserFilter.class) 授权 需要已登录或者“记住我”的用户才能访问 invalidRequest(InvalidRequestFilter.class) 授权 过滤无效的请求,并返回400, “Invalid request”; - 默认的过滤器链:org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition
- 在springboot中:使用ShiroFilterChainDefinition配置过滤链并将其与SecuritManager关联:org.apache.shiro.spring.web.ShiroFilterFactoryBean
- 默认的过滤器:在
认证授权流程
快速入门
-
官方文档如下连接:
-
源码地址:
https://github.com/apache/shiro.git
-
官网文档:
-
中文文档:
-
-
本人整理的快速入门案例详见如下链接:【使用了imi配置文件模拟了用户、角色、权限配置】