一、简介
- Spring Boot
- Spring Boot 是一个用于简化 Spring 应用开发的框架。它通过自动配置等特性,让开发者能够快速搭建基于 Spring 的应用程序。例如,当你添加了 Web 依赖后,Spring Boot 会自动配置一个嵌入式的 Tomcat 服务器,减少了繁琐的配置过程。
- 它遵循 “约定优于配置” 的原则,使得开发人员可以将更多精力放在业务逻辑上,而不是复杂的配置文件上。
- Shiro
- Shiro 是一个强大的 Java 安全框架,它主要用于身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Management)。
- 身份验证是验证用户是否是他们声称的身份;授权是确定已认证的用户是否有权访问特定的资源;加密功能可以对数据进行加密处理,保证数据的安全性;会话管理则用于管理用户的会话状态。
二、整合步骤
- 创建 Spring Boot 项目
- 可以使用 Spring Initializr(https://start.spring.io/)来创建一个基本的 Spring Boot 项目。在创建过程中,添加 Web 依赖,因为 Shiro 通常用于 Web 应用的权限管理。
- 下载项目压缩包并解压后,用 IDE(如 IntelliJ IDEA 或 Eclipse)打开项目。
- 添加 Shiro 依赖
- 在项目的
pom.xml
文件(如果是 Maven 项目)中添加 Shiro 依赖。
- 在项目的
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro - spring</artifactId><version>1.9.1</version>
</dependency>
- 对于 Gradle 项目,则在
build.gradle
文件中添加依赖。
implementation 'org.apache.shiro:shiro - spring:1.9.1'
配置 Shiro
- 创建一个 Shiro 配置类,例如
ShiroConfig.java
。 - 配置安全管理器(SecurityManager),这是 Shiro 的核心组件
@Configuration
public class ShiroConfig {@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 设置Realm,用于认证和授权securityManager.setRealm(myRealm());return securityManager;}// 配置自定义的Realm@Beanpublic MyRealm myRealm() {return new MyRealm();}// 配置Shiro过滤器链@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();chainDefinition.addPathDefinition("/public/**", "anon");chainDefinition.addPathDefinition("/admin/**", "authc");return chainDefinition;}// 配置Shiro过滤器工厂@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, ShiroFilterChainDefinition shiroFilterChainDefinition) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, String> filterChainDefinitionMap = shiroFilterChainDefinition.getFilterChainMap();shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}
}
在上述配置中,SecurityManager
是核心,Realm
用于从数据源(如数据库)获取用户信息进行认证和授权。ShiroFilterChainDefinition
定义了哪些 URL 需要进行认证(authc
),哪些可以匿名访问(anon
)
创建 Realm 实现类
自定义Realm
类,例如MyRealm.java
,继承自AuthorizingRealm
public class MyRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 从 principals获取用户信息,如用户名String username = (String) principals.getPrimaryPrincipal();// 根据用户名从数据库或其他数据源获取用户的角色和权限信息List<String> roles = new ArrayList<>();List<String> permissions = new ArrayList<>();// 假设从数据库查询角色和权限的方法roles = userService.getRolesByUsername(username);permissions = userService.getPermissionsByUsername(username);SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();authorizationInfo.setRoles(roles);authorizationInfo.setStringPermissions(new LinkedHashSet<>(permissions));return authorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 从 token获取用户名String username = (String) token.getPrincipal();// 根据用户名从数据库获取用户密码String password = userService.getPasswordByUsername(username);if (password == null) {return null;}SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, password, getName());return authenticationInfo;}
}
- 在
doGetAuthorizationInfo
方法中,根据用户信息获取用户的角色和权限,用于授权。在doGetAuthenticationInfo
方法中,根据用户名获取密码用于认证用户身份。
总结
Spring Boot 与 Shiro 的结合为 Java 应用提供了强大且便捷的权限管理解决方案。Shiro 作为安全框架,在身份验证、授权、加密和会话管理方面表现卓越,而 Spring Boot 简化了配置和开发流程,二者相辅相成。
- 身份验证方面:通过自定义 Realm 从数据源(如数据库)获取用户信息,验证用户输入的用户名和密码是否匹配,确保用户是其声称的身份。例如,在用户登录过程中,Shiro 会根据用户输入的凭证在 Realm 中进行查找和验证。
- 授权方面:依据用户的角色和权限信息,确定已认证用户是否有权访问特定资源。可以基于角色(如
@RequiresRoles
注解)或权限(如@RequiresPermissions
注解)来控制对 Controller 方法的访问,精细地划分系统功能的访问权限。 - 加密方面:Shiro 支持多种加密算法,可对用户密码等敏感信息进行加密存储和处理,保障数据在传输和存储过程中的安全性,如使用 BCrypt 算法对密码加密。
- 会话管理方面:负责管理用户的会话状态,包括会话的创建、维护和销毁,确保用户在整个交互过程中的状态一致性。性能优化
- 缓存机制:当系统用户量和权限规则较多时,为了避免频繁地从数据库查询用户权限信息,可以引入缓存机制。例如,对用户的角色和权限信息进行缓存,减少数据库查询次数,提高系统性能。
- 合理设计数据库查询:在 Realm 中查询用户信息时,优化数据库查询语句和逻辑,避免复杂的查询和不必要的查询操作,提高查询效率。
总之,Spring Boot + Shiro 权限管理方案为 Java 应用开发提供了一个可靠、灵活且高效的权限管理途径,但在实际应用中需要充分考虑安全和性能等多方面因素,以确保系统的稳定运行和数据安全。