安全管理框架
这是对于在项目过程中安全管理框架Shiro的知识总结
Shiro 是一个用于 Java 应用程序的安全框架。它提供了身份验证、授权、加密和会话管理等功能,可以帮助开 发人员构建安全可靠的应用程序。
Java 中针对权限管理常见的有 2 个著名的框架:spring security 和 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 :
- 使用 shiro 可以非常快速的完成认证、授权等功能的开发,降低系统成本
- 较之 SpringSecurity,Shiro 在保持强大功能的同时,在简单性和灵活性方面拥有较为明显的优势
Security 安全管理
Spring Security 是一个相对复杂的安全管理框架,权限控制细粒度更高,对 OAuth2 支持更友好,而且可以和 Spring 框架无缝整合。
SpringSecurity 基本配置
依赖:spring-boot-starter-security,添加依赖后项目中所有资源都会被保护起来 默认用户名是 user,默认的登录密码在项目启动时随机生成的配置用户名和密码
application.properties spring.security.user.name=root
spring.security.user.password=123456
spring.security.user.roles=admin
基于内存的认证
密码加密
密码加密会用散列函数,是从任何数据中船舰数字指纹的方法。SpringSecurity 提供了多种密码加密访问,推 荐使用 BCryptPasswordEncoder,使用 BCrypt 强哈希函数,使用时可以选择提供 strength 和 SecureRandom 实例,密钥迭代次数为 2^strength,strength 取值在 4-31 之间,默认为 10 BCryptPasswordEncoder encoder=new
BCryptPasswordEncoder(10);
String pwd=encoder.encode("123456");
System.out.println(pwd);
@Bean PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(10); } 配置 configure(HttpSecurity)参数 auth.inMemoryAuthentication().withUser("yanjun").password(生成的密码).roles("admin","user").and...
方法安全
认证与授权都是基于 URL 的,也可以通过注解来灵活地配置方法安全。首先配置类上添加注解 @EnableGlobalMethodSecurity(prePostEnabled=true, securedEnabled=true)开启基于注解的安全配置
@Secured("ROLE_admin") 访问方法时需要 admin 角色,注意名称前加一个前缀 ROLE_
@PreAuthorize("hasRole('admin') and hasRole('user')") 访问方法就需要 admin 角色又需要 user 角色
@PreAuthorize("hasAnyRole('admin','dba','user')") 方法方法需要 admin、dba 或者 user 角色
基于数据库认证
注意数据库中 tbl_roles 表中 name 名称应该是 ROLE_开头
实体类 public class User implements UserDetails { }
业务类
@Service
public class UserService implements UserDetailsService {
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇