Shiro 框架
Shiro 是一个用于 Java 应用程序的安全框架。它提供了身份验证、授权、加密和会话管理等功能,可以帮助开发人员构建安全可靠的应用程序。
Java 中针对权限管理常见的有 2 个著名的框架:spring security 和 shiro
shiro 基本概念
-
credentials 资格证书
-
Principal 当事人
-
Authentication 认证
-
Authorization 授权
Shiro 工作原理
Shiro 的工作原理主要包括身份验证和授权两个方面。
在身份验证方面,Shiro 提供了一种简单的方式来验证用户的身份。它可以通过用户名和密码、轻量目录访问协议 LDAP、OAuth 等多种方式进行身份验证。当用户提供身份凭证后,Shiro 会验证凭证的有效性,并返回验证结果。
在授权方面,Shiro 提供了一种灵活的授权机制。开发人员可以定义角色和权限,并将其与用户关联起来。当用户尝试进行某个操作时,Shiro 会根据用户的角色和权限来判断是否允许该操作。
Shiro 还提供了会话管理功能,可以跟踪和管理用户的会话状态。它支持将会话信息存储在内存、数据库或其他存储介质中,并提供了一些常见的会话管理操作,如创建、销毁、过期等。
总的来说,Shiro 的工作原理是通过身份验证来确认用户的身份,并通过授权机制来管理用户的角色和权限,从而确保应用程序的安全性和可靠性。
身份认证是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件 Key 等刷卡系统,则需要刷卡。
授权就是访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的
shiro 运行时异常
AuthenticationException 异常是 Shiro 在登录认证过程中,认证失败需要抛出的异常
CredentitalsException 凭证异常
IncorrectCredentialsException 不正确的凭证
ExpiredCredentialsException 凭证过期
AccountException 账号异常
ConcurrentAccessException 并发访问异常(多个用户同时登录时抛出)
UnknownAccountException 未知的账号
ExcessiveAttemptsException 认证次数超过限制
DisabledAccountException 禁用的账号
LockedAccountException 账号被锁定
pportedTokenException 使用了不支持的 Token
AuthorizationException 鉴权操作异常
UnauthorizedException: 抛出以指示请求的操作或对请求的资源的访问是不允许的
UnanthenticatedException:当尚未完成成功认证时,尝试执行授权操作时引发异常
shiro 核心组件
-
Authentication 身份认证/登录,验证用户是不是拥有相应的身份。
-
Authorization 授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限。
-
SessionManagement 对用户的会话信息进行管理,使 Session 不再仅限于 JavaEE 应用,同时扩展了 Session数据的存储途径及缓存方式,更易于实现 Session 数据的集群共享
-
Cryptography 加密,保护数据的安全性,以简洁的 API 提供常用的加密算法和数据摘要算法。
shiro 选用:
1、使用 shiro 可以非常快速的完成认证、授权等功能的开发,降低系统成本
2、较之 SpringSecurity,Shiro 在保持强大功能的同时,在简单性和灵活性方面拥有较为明显的优势
Kaptcha
Kaptcha 是一个用于生成和验证验证码的 Java 库,提供了丰富的生成和验证功能,并支持自定义配置。它可以用于增加应用程序的安全性,防止机器人和恶意攻击。
Kaptcha 可以生成各种类型的验证码,包括数字、字母、数字字母组合等。生成的验证码图片可以以图片流或Base64 编码的形式输出,方便在 Web 应用程序中使用。
在验证码验证方面,Kaptcha 提供了验证器接口,可以用于验证用户输入的验证码是否正确。开发人员可以根据需要自定义验证逻辑,以满足特定的业务需求。
Cookie 的使用
Cookie 是一种在 Web 开发中使用客户端数据存储实现跟踪用户状态的机制。所谓的跟踪用户是指记录用户操作信息并隔离不同用户数据访问的方法,常见的用户跟踪方法有隐藏域、URL 重写、客户端跟踪用户 Cookie
和服务器端跟踪用户 Session 四种不同方式。
理论上来说关于 cookie 的大小实际上没有明确的限制。Cookie 是由网站在用户浏览器中存储的小型文本文件,用于跟踪用户的活动和提供个性化的服务。然而浏览器对于每个域名和每个 cookie 的大小都有一些限制。大多数现代浏览器对于单个 cookie 的大小限制在 4KB 到 10KB 之间,例如 chrome 的限制就是 4KB。同时每个域名在浏览器中可以存储的 cookie 数量也有一定限制,一般在几十到几百个之间。
需要注意的是,这些限制可能因不同的浏览器和版本而有所不同。此外虽然 cookie 的大小限制较小,但网站可以通过将数据存储在服务器上,并在 cookie 中使用标识符来处理更大量的数据。 总的来说,虽然 cookie的大小有一定限制,但对于大多数常见的用途和数据跟踪来说,这些限制通常是足够的。如果有特定的需求,可能需要考虑其他的数据存储方式。
setMaxAge(int expiry) 正值表示 cookie 将在经过该值表示的秒数后过期,负值意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除,默认是-1,0 值表示马上删除 cookie。
setPath(String)指定路径下的请求才会传递该 cookie 数据Cookie 中的中文乱码可以使用 URLDecoder.decode(value,“UTF-8”)解决
Session 的使用
Session 是一种在 Web 开发中用于跟踪用户状态的机制。它通过在服务器上存储用户数据,并为每个用户分配一个唯一的标识符来实现。 在使用 Session 时,服务器会为每个用户创建一个唯一的 Session ID,并将该 ID
存储在用户的浏览器中的 Cookie 中。当用户发送请求时,服务器会根据 Session ID 来检索和存储与该用户相关的数据。这使得服务器能够跟踪用户的状态和信息,例如登录状态、购物车内容等。Session 的使用有四方面需要注意:
- 安全性:由于 Session ID 存储在用户的 Cookie 中,需要采取适当的安全措施来保护 Session 数据。这包括
使用加密传输、限制 Session ID 的有效期等。
- 存储容量:Session 数据存储在服务器上,因此需要考虑服务器的存储容量和性能。过多或过大的 Session数据可能会对服务器造成压力。
- 生命周期:Session 可以有不同的生命周期设置,例如在用户关闭浏览器后立即过期,或者在一定时间段内保持活动状态。开发人员需要根据应用需求来配置 Session 的生命周期。
- 分布式环境:在分布式环境中,需要确保 Session 数据在不同服务器之间的共享和同步,以便用户在不同服务器间切换时能够保持会话状态。
server.servlet.session.timeout=30m 表示 Session 将在 30 分钟后超时
SpringSession
在传统单机 web 应用中,用户的 session 都是由容器管理。浏览器使用 cookie 中记录 sessionId,容器根据sessionId 判断用户是否存在会话 session。限制是 session 存储在 web 容器中,被单台服务器容器管理。如果需要实现 session 共享的方式有 5 种:1、通过 nginx 的 ip_hash 负载均衡策略根据 ip 将请求分配到对应的服务器。2、基于关系型数据库存储共享数据。3、基于 cookie 客户端数据存储。4、某些服务器内置的有 session
复制域功能。5、可以基于 NoSQL 数据库系统实现
Spring Session 是一个用于在分布式环境中管理和跟踪用户会话的框架。它提供了多种用户会话存储的实现方式,支持会话共享和跨域请求,具有良好的扩展性和自定义能力。主要是依赖于 SessionRepositoryFilter 实现,它就是Servlet 规范中 Filter 的实现,用来切换HttpSession 至Spring Session,重新定义包装 HttpServletRequest和 HttpServletResponse
使用 Spring Session 功能
-
创建和管理会话:Spring Session 可以创建和管理用户会话。它提供了 API 来创建新会话、获取当前会话、设置会话属性等。
-
共享会话数据:在分布式环境中,Spring Session 可以将会话数据存储在共享的存储介质中,以便不同的服务器可以访问和共享相同的会话数据。
-
跨域请求支持:Spring Session 提供了跨域请求支持,使得在多个域名或子域名下共享会话变得更加容易。
-
扩展性和自定义:Spring Session 具有良好的扩展性,可以根据需要自定义会话存储、会话管理和会话策略等。