Spring Boot与Shiro集成实践详解

需积分: 3 0 下载量 98 浏览量 更新于2024-10-11 收藏 30KB RAR 举报
资源摘要信息:"SpringBoot整合Shiro实践操作" Shiro(发音为"shee-roe")是一个功能强大的安全框架,用于实现身份验证、授权、密码学以及会话管理。Shiro可以轻松地集成到任何Java应用程序中,无论其大小和复杂性如何。Spring Boot是一个流行的Java框架,旨在简化新的Spring应用的初始搭建以及开发过程。当Spring Boot与Shiro结合时,可以迅速构建一个安全的、生产级的Spring应用。 ### 一、整合Shiro前的准备工作 #### 1. 项目结构 在整合Shiro之前,我们需要准备一个标准的Spring Boot项目结构。通常包含以下部分: - `src/main/java`:存放Java源代码,包括实体类、服务类、控制器等。 - `src/main/resources`:存放配置文件、模板文件、静态资源等。 - `src/test/java`:存放测试代码。 #### 2. 添加依赖 在`pom.xml`文件中,需要添加Spring Boot和Shiro相关的依赖,例如: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Shiro Core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <!-- Shiro Spring Boot Starter --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency> <!-- 其他依赖... --> </dependencies> ``` ### 二、Shiro配置 #### 1. 创建Shiro配置类 创建一个配置类来配置Shiro的各个组件。 ```java @Configuration public class ShiroConfig { // 创建SecurityManager @Bean public SecurityManager securityManager(UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } // 创建Realm @Bean public UserRealm userRealm() { return new UserRealm(); } // ShiroFilterFactoryBean处理拦截资源文件问题 @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 配置访问权限 Map<String, String> filterChainDefinitionMap = new HashMap<>(); filterChainDefinitionMap.put("/login", "anon"); // 表示可以匿名访问 filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/admin/**", "authc"); // 表示需要认证才可以访问 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } // Shiro的会话管理 // Shiro的会话管理 @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); // 设置session超时时间 sessionManager.setGlobalSessionTimeout(1800000); return sessionManager; } // 其他配置... } ``` ### 三、用户认证与授权 #### 1. 创建自定义的Realm 在Shiro中,Realm负责与安全数据源交互,进行身份验证和授权。 ```java public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; // 自定义的用户服务 // 用户授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 获取当前登录的用户 User user = (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 添加角色和权限 authorizationInfo.addRole(user.getRole()); authorizationInfo.addStringPermission(user.getPermission()); return authorizationInfo; } // 用户认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 获取登录用户名 UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; String username = token.getUsername(); // 根据用户名查询用户信息 User user = userService.findByUsername(username); if (user == null) { throw new UnknownAccountException("用户名或密码错误!"); } // 密码匹配 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user, // 用户对象 user.getPassword(), // 密码 getName() // realm name ); return authenticationInfo; } } ``` #### 2. 控制器中使用Shiro注解 在控制器中,我们可以通过Shiro提供的注解来控制访问权限。 ```java @RestController @RequestMapping("/admin") public class AdminController { @GetMapping("/info") @RequiresPermissions("user:list") public String getInfo() { return "用户信息展示"; } @GetMapping("/login") public String login() { return "登录页面"; } @GetMapping("/logout") @RequiresAuthentication public String logout() { return "退出登录"; } // 其他方法... } ``` ### 四、运行测试 #### 1. 运行Spring Boot应用 在完成了以上配置和编码后,我们可以运行Spring Boot应用,并通过浏览器访问不同的路径来测试认证与授权是否按预期工作。 ### 五、问题排查 #### 1. 日志配置 Shiro的日志配置对于调试和问题排查非常有帮助,确保在`application.properties`或`application.yml`中配置了日志级别。 ### 总结 通过本实践操作的介绍,我们了解了如何将Spring Boot和Shiro框架进行整合,并实现用户的认证与授权。整合后,我们能够保护应用的安全,只有具备相应权限的用户才能访问特定的资源。Shiro提供的简单易用的API和灵活的配置方式,使其成为Java应用中实现安全的不二选择。