当前位置:

首页 > 编程开发 > 结合Spring Boot和Apache Shiro实现安全验证和权限控制

结合Spring Boot和Apache Shiro实现安全验证和权限控制

在现代Web应用程序中,安全性是至关重要的。为了确保用户数据和隐私的安全,应该优先考虑建立一个强大和可靠的安全认证和授权机制。SpringBoot是Java开发领域最受欢迎的框架之一,而ApacheShiro是一个功能强大的安全框架,它可以帮助我们轻松实现Web应用程序的身份验证和授权。在本文中,我们将介绍如何使用SpringBoot和Apache

在现代Web应用程序中,安全性是至关重要的。为了确保用户数据和隐私的安全,应该优先考虑建立一个强大和可靠的安全认证和授权机制。 Spring Boot是Java开发领域最受欢迎的框架之一,而Apache Shiro是一个功能强大的安全框架,它可以帮助我们轻松实现Web应用程序的身份验证和授权。在本文中,我们将介绍如何使用Spring Boot和Apache Shiro来构建一个完善的认证和授权机制。

  1. 搭建环境和配置依赖项

首先,我们需要为我们的项目配置Spring Boot和Apache Shiro的依赖项。为了使我们的工作更加容易,我们可以使用Spring Initializr来快速开始。在pom.xml文件中,我们需要添加以下依赖项:


   org.springframework.boot
   spring-boot-starter-web


   org.apache.shiro
   shiro-spring
   1.6.0
  1. 编写Shiro配置类

接下来,我们将创建一个配置类来设置Apache Shiro的基本配置。在这个示例中,我们将使用Shiro的INI配置文件来定义权限和角色。我们可以创建一个名为ShiroConfig.java的类来实现Shiro的配置,如下所示:

@Configuration 
public class ShiroConfig { 

   @Value("${shiro.loginUrl}")
   private String loginUrl;

   @Value("${shiro.successUrl}")
   private String successUrl;

   @Value("${shiro.unauthorizedUrl}")
   private String unauthorizedUrl;

   @Bean 
   public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { 
      ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); 
      factoryBean.setSecurityManager(securityManager); 
      Map filterChainDefinitionMap = new LinkedHashMap<>(); 
      filterChainDefinitionMap.put("/logout", "logout"); 
      filterChainDefinitionMap.put("/login", "anon"); 
      filterChainDefinitionMap.put("/static/**", "anon"); 
      filterChainDefinitionMap.put("/user/**", "authc, roles[user]"); 
      filterChainDefinitionMap.put("/admin/**", "authc, roles[admin]"); 
      factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); 
      factoryBean.setLoginUrl(loginUrl); 
      factoryBean.setSuccessUrl(successUrl); 
      factoryBean.setUnauthorizedUrl(unauthorizedUrl); 
      return factoryBean; 
   } 

   @Bean 
   public SecurityManager securityManager() { 
      DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); 
      securityManager.setRealm(shiroRealm()); 
      return securityManager; 
   } 

   @Bean 
   public ShiroRealm shiroRealm() { 
      return new ShiroRealm(); 
   } 
}

在Shiro配置类中,我们定义了三个bean。 首先,我们创建了一个过滤器bean(ShiroFilterFactoryBean),该bean使用了安全管理器bean(SecurityManager)来实现安全认证和授权。 其次,我们创建了一个安全管理器bean,该bean使用我们自己编写的类(ShiroRealm)实现身份验证和授权的逻辑。 最后,我们创建了Shiro Realm bean(ShiroRealm),其中包含我们的用户信息和权限信息。

在上述代码中,我们设置了登录页面的URL,成功页面的URL和未授权页面的URL。 我们还定义了一些URL路径和授权规则,其中“authc”意味着用户必须登录才能访问该页面,“roles [user]”意味着只有拥有“user”角色的用户才能访问,而“roles [admin]”意味着只有拥有“admin”角色的用户才能访问。

  1. 创建Shiro Realm类

接下来,我们将创建一个Shiro Realm类,其中包含了在用户登录时需要向Shiro提供的用户信息。 在我们的示例中,我们将使用简单的IniRealm,该类使用INI文件定义了用户信息和权限信息。

public class ShiroRealm extends IniRealm {

   public ShiroRealm() {
      super();
      setAuthenticationTokenClass(UsernamePasswordToken.class);
   }
}

在我们的示例中,我们实现了Shiro Realm类,并使用了IniRealm构建了一个最简单的身份信息验证类。

  1. 编写控制器类

最后,我们将创建一个控制器类(例如UserController.java和AdminController.java),其中包含了各自需要实现的功能。 在我们的示例中,我们将创建一个名为AuthController.java的类,该类包含了两个简单的请求处理方法。

@RestController 
@RequestMapping("/auth") 
public class AuthController {

   @RequestMapping(value = "/login", method = RequestMethod.POST) 
   public String login(@RequestParam("username") String username, @RequestParam("password") String password) { 
      Subject currentUser = SecurityUtils.getSubject(); 
      if (!currentUser.isAuthenticated()) { 
         UsernamePasswordToken token = new UsernamePasswordToken(username, password); 
         token.setRememberMe(true); 
         try { 
            currentUser.login(token); 
         } catch (UnknownAccountException uae) { 
            return "UnknownAccountException"; 
         } catch (IncorrectCredentialsException ice) { 
            return "IncorrectCredentialsException"; 
         } catch (LockedAccountException lae) { 
            return "LockedAccountException"; 
         } catch (AuthenticationException ae) { 
            return "AuthenticationException"; 
         } 
      } 
      return "success"; 
   } 

   @RequestMapping(value = "/logout", method = RequestMethod.GET) 
   public String logout() { 
      Subject currentUser = SecurityUtils.getSubject(); 
      if (currentUser.isAuthenticated()) { 
         currentUser.logout(); 
      } 
      return "logout"; 
   } 
}

我们的控制器类包含一个需要身份验证的URL和一个需要身份验证和授权的URL。 在登录方法中,我们使用Subject API来实现Shiro的身份验证。如果身份验证失败,则返回相应的错误信息。在注销方法中,我们使用Subject API来实现Shiro的注销操作。

  1. 运行和测试我们的应用程序

在完成了所有的配置和编码之后,现在我们可以运行我们的应用程序并测试它是否能够正确地执行身份验证和授权操作。在启动应用程序之后,我们只需使用Web浏览器访问各自的URL即可进行身份验证和授权。

总结

在本文中,我们介绍了如何使用Spring Boot和Apache Shiro来构建一个完善的安全认证和授权机制。我们展示了使用Shiro的INI配置文件定义权限和角色,同时还创建了一个Shiro Realm类与IniRealm相关联以实现验证操作。我们还创建了两个控制器类,实现了身份验证和授权操作。 最后,在测试了我们的应用程序后,我们发现它能够相当好地运行并实现预期的功能。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。