构建高效安全的SpringSecurity应用:JWT、MyBatis与Redis集成 ...

打印 上一主题 下一主题

主题 980|帖子 980|积分 2940

本文另有配套的佳构资源,点击获取  

  简介:SpringSecurity提供全面的身份验证和授权功能,JWT用于分布式系统中的轻量级身份验证,MyBatis简化数据库操作,而Redis作为缓存和消息署理提高性能。通过将这些技能集成到Web应用程序中,可以创建一个既高效又安全的系统。本文将详细探究每个技能的脚色和它们之间的整合要点。

1. SpringSecurity安全框架介绍与配置

1.1 SpringSecurity概览

  SpringSecurity是一个功能强大且可高度定制的认证和访问控制框架,它在Spring生态系统中占有紧张职位。从历史的角度看,SpringSecurity是由Acegi Security System for Spring项目演化而来的,旨在提供一个全面的安全办理方案,涵盖身份验证、授权以及防止常见的安全攻击。
1.2 核心组件解析

  SpringSecurity的核心组件包罗安全过滤器链、认证管理器、安全上下文等。安全过滤器链负责拦截请求并进行安全检查,认证管理器处理用户的身份验证逻辑,安全上下文则保存了当前用户的认证信息和权限数据。
1.3 根本配置实践

  为了实现底子的安全配置,我们起首需要在项目中引入SpringSecurity依赖。然后通过配置类继续  WebSecurityConfigurerAdapter  ,覆盖其中的方法来自界说安全策略。例如,设置HTTP请求的安全规则、界说用户详情服务以及密码加密方式等。
  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4.     @Override
  5.     protected void configure(HttpSecurity http) throws Exception {
  6.         http
  7.             .authorizeRequests()
  8.                 .antMatchers("/public/**").permitAll()
  9.                 .anyRequest().authenticated()
  10.             .and()
  11.             .formLogin()
  12.                 .loginPage("/login").permitAll();
  13.     }
  14.     @Autowired
  15.     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
  16.         auth
  17.             .inMemoryAuthentication()
  18.             .withUser("user").password(passwordEncoder().encode("password")).roles("USER");
  19.     }
  20.     @Bean
  21.     public PasswordEncoder passwordEncoder() {
  22.         return new BCryptPasswordEncoder();
  23.     }
  24. }
复制代码
通过上述配置,我们已经为一个Web应用搭建起了根本的安全框架。下一章,我们将深入JWT机制,探索如何与SpringSecurity相团结,实现更高级的安全特性。
2. JWT身份验证机制和集成方法

JWT的简介和原理

  JSON Web Token (JWT) 是一种开放尺度 (RFC 7519),它界说了一种紧凑的、自包罗的方式,用于在各方之间以JSON对象的形式安全地传输信息。这些信息可以被验证和信托,因为它们是数字签名的。JWT可以利用密钥(HMAC算法)或利用RSA或ECDSA的公钥/私钥对进行签名。
  JWT由三部分构成,分别是Header(头部)、Payload(负载)和Signature(签名),它们之间通过点(.)连接。每一部分都是利用Base64Url编码的,其中:


  • Header(头部) :通常由两部分构成:token的类型(即JWT)和所利用的签名算法,如HMAC SHA256或RSA。
  • Payload(负载) :包罗声明(Claims),声明是关于实体(通常是用户)和其他数据的声明,这些声明是利用Base64Url编码的JSON对象。
  • Signature(签名) :为了创建签名部分,你必须采用编码后的header,编码后的payload,一个密钥,头部中指定的算法,并对其进行签名。
JWT在Web应用中的脚色

  JWT广泛用于身份验证和信息互换,尤其是在Web应用中。当用户登录时,服务器验证用户根据,并天生一个JWT作为认证令牌返回给客户端。此后,客户端将这个JWT包罗在每次请求的头部中,作为对服务器进行身份验证的手段。
  利用JWT有如下优点:


  • 无状态 :由于服务器不需要存储会话信息,因此可以实现无状态的认证。
  • 跨域可操作 :由于JWT的自包罗性,它们可以被用于分布式系统,易于在差异域之间共享。
  • 更小的传输量 :相对于传统的session方式,JWT通常更小,因此减少了网络传输的数据量。
  • 易于扩展 :可以向payload中添加更多的信息,用于实现更多的功能,如权限控制等。
将JWT集成到SpringSecurity中

  要在SpringSecurity中集成JWT,我们需要完成几个步调:

  • 天生JWT :在用户认证乐成后天生JWT。
  • 配置JWT验证 :配置SpringSecurity以验证吸收到的JWT。
  • 用户权限管理 :在认证乐成后,将用户权限和脚色信息设置到JWT中。
  下面是一个天生JWT的代码示例:
  1. import io.jsonwebtoken.Jwts;
  2. import io.jsonwebtoken.SignatureAlgorithm;
  3. import java.util.Date;
  4. public class JwtUtil {
  5.     private static final long EXPIRATION_TIME = 864_000_00; // Token有效期24小时
  6.     private static final String SECRET = "ThisIsASecret"; // 密钥
  7.     public static String generateToken(String username) {
  8.         return Jwts.builder()
  9.                 .setSubject(username) // 设置主题,即用户名称
  10.                 .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
  11.                 .signWith(SignatureAlgorithm.HS512, SECRET) // 使用HS512算法和密钥签名
  12.                 .compact();
  13.     }
  14. }
复制代码
验证JWT的方法

  在SpringSecurity中,我们需要配置一个过滤器来拦截请求并验证JWT的有用性。这可以通过实现  OncePerRequestFilter  来完成:
  1. import io.jsonwebtoken.JwtException;
  2. import io.jsonwebtoken.Jwts;
  3. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  4. import org.springframework.security.core.Authentication;
  5. import org.springframework.security.core.context.SecurityContextHolder;
  6. import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
  7. import org.springframework.web.filter.OncePerRequestFilter;
  8. import javax.servlet.FilterChain;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.io.IOException;
  13. public class JwtAuthenticationFilter extends OncePerRequestFilter {
  14.     @Override
  15.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
  16.             throws ServletException, IOException {
  17.         try {
  18.             String jwt = parseJwt(request);
  19.             if (jwt != null && JwtUtils.validateJwtToken(jwt)) {
  20.                 String username = JwtUtils.getUserNameFromJwtToken(jwt);
  21.                 Authentication authentication = new UsernamePasswordAuthenticationToken(
  22.                         username, null, new ArrayList<>());
  23.                 authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
  24.                 SecurityContextHolder.getContext().setAuthentication(authentication);
  25.             }
  26.         } catch (JwtException e) {
  27.             logger.error("Cannot set user authentication: {}", e.getMessage());
  28.         }
  29.         chain.doFilter(request, response);
  30.     }
  31.     private String parseJwt(HttpServletRequest request) {
  32.         String headerAuth = request.getHeader("Authorization");
  33.         if (headerAuth != null && headerAuth.startsWith("Bearer ")) {
  34.             return headerAuth.substring(7);
  35.         }
  36.         return null;
  37.     }
  38. }
复制代码
通过上述代码,每次请求都会通过  JwtAuthenticationFilter  来验证携带的JWT是否有用。如果有用,那么相应的  Authentication  对象会被设置到SpringSecurity的上下文中。
处理用户认证和授权

  在SpringSecurity中,用户的认证和授权处理是通过实现  UserDetailsService  和  AuthenticationProvider  来完成的。在JWT集成的情况下,我们通常会利用一个简单的  UserDetailsService  来加载用户信息,因为真正的用户验证是在JWT天生时已经完成的。
  在授权方面,当JWT验证通事后,我们可以从JWT的payload中提取用户权限信息,并创建相应的  Authentication  对象来表明用户已认证乐成并拥有一些权限。
集成过程中的安全性考量

  JWT虽然方便,但需要确保安全措施到位,以避免遭受常见攻击,如:


  • 密钥保护 :确保用于签名JWT的密钥不被泄漏。
  • 限制利用范围 :设置合理的过期时间,不要在JWT中存储敏感信息。
  • 验证完整性 :在服务器端验证JWT签名的有用性。
  本章通过详细介绍JWT的工作原理及其实现方式,深入探究了如何将JWT集成到SpringSecurity框架中。通过分析JWT的构成以及如何天生和验证JWT,进一步阐述了如何团结实际的安全认证需求来实现用户认证和授权。在未来的章节中,我们将看到如何将JWT与其他技能如MyBatis和Redis集成,以构建更为安全高效的Web应用。
3. MyBatis持久层框架与数据库交互

3.1 MyBatis核心概念解析

3.1.1 SQL映射文件与动态SQL

  MyBatis作为Java持久层框架,通过SQL映射文件与数据库进行交互。SQL映射文件界说了操作数据库的SQL语句以及映射规则,允许开发者以声明的方式编写SQL语句,从而简化了数据库编程。动态SQL是MyBatis另一大亮点,它提供了强大的SQL片段拼接能力,可以在运行时根据差异的业务逻辑条件,动态天生SQL语句。
  下面是一个简单的SQL映射文件示例:
  1. <mapper namespace="com.example.mapper.UserMapper">
  2.   <!-- 查询用户 -->
  3.   <select id="selectUser" resultType="User">
  4.     SELECT * FROM users WHERE id = #{id}
  5.   </select>
  6.   <!-- 动态SQL示例 -->
  7.   <select id="findUsers" resultType="User">
  8.     SELECT * FROM users
  9.     <where>
  10.       <if test="name != null">
  11.         AND name = #{name}
  12.       </if>
  13.       <if test="age != null">
  14.         AND age = #{age}
  15.       </if>
  16.     </where>
  17.   </select>
  18. </mapper>
复制代码
3.1.2 探索MyBatis工作流程

  MyBatis工作流程涵盖了配置初始化、会话管理以及事件处理等关键环节。其核心流程从配置文件和映射文件的加载开始,随后MyBatis通过SqlSessionFactory创建SqlSession,代表一个数据库的会话。
  代码块中展示了配置文件(mybatis-config.xml)和一个简单的映射文件(UserMapper.xml)的配置内容:
  1. <!-- MyBatis配置文件 mybatis-config.xml -->
  2. <configuration>
  3.   <environments default="development">
  4.     <environment id="development">
  5.       <transactionManager type="JDBC"/>
  6.       <dataSource type="POOLED">
  7.         <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  8.         <property name="url" value="jdbc:mysql://localhost:3306/mybatis_example"/>
  9.         <property name="username" value="root"/>
  10.         <property name="password" value="password"/>
  11.       </dataSource>
  12.     </environment>
  13.   </environments>
  14.   <mappers>
  15.     <mapper resource="com/example/mapper/UserMapper.xml"/>
  16.   </mappers>
  17. </configuration>
复制代码
在实际开发中,初始化MyBatis通常会通过读取配置文件来完成:
  1. // 加载MyBatis配置文件,创建SqlSessionFactory
  2. String resource = "mybatis-config.xml";
  3. InputStream inputStream = Resources.getResourceAsStream(resource);
  4. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
复制代码
创建SqlSession实例,可以实行操作数据库的增删改查操作:
  1. try (SqlSession session = sqlSessionFactory.openSession()) {
  2.     // 获取映射器接口实例
  3.     UserMapper mapper = session.getMapper(UserMapper.class);
  4.     // 执行查询操作
  5.     User user = mapper.selectUser(1);
  6. }
复制代码
在实行完数据库操作后,必须关闭SqlSession来释放资源。MyBatis提供了自动提交事件的模式以及手动控制事件提交的方法。
3.2 MyBatis与SpringSecurity和JWT集成

3.2.1 配置与整合

  要将MyBatis整合进SpringSecurity和JWT身份验证机制的Web应用,起首需要将MyBatis和数据库相关的依赖配置到项目的构建文件中。在Spring项目中,我们可以利用  @MapperScan  注解来自动扫描接口所在的包,并且将其注册为Spring管理的Bean。
  1. @Configuration
  2. @MapperScan("com.example.mapper")
  3. public class MyBatisConfig {
  4.     // 可以在这里配置SqlSessionFactory等组件
  5. }
复制代码
3.2.2 数据库操作示例

  在实现用户认证和授权的过程中,通常需要查询用户信息和脚色信息等。通过MyBatis的映射器接口,可以很方便地实现这些操作。比如,获取用户信息的映射器接口和SQL映射文件:
  1. public interface UserMapper {
  2.     User findUserByUsername(String username);
  3. }
复制代码
  1. <!-- UserMapper.xml -->
  2. <mapper namespace="com.example.mapper.UserMapper">
  3.   <select id="findUserByUsername" parameterType="String" resultType="User">
  4.     SELECT u.*, r.role_name AS rolename FROM users u
  5.     LEFT JOIN user_roles ur ON u.id = ur.user_id
  6.     LEFT JOIN roles r ON ur.role_id = r.id
  7.     WHERE u.username = #{username}
  8.   </select>
  9. </mapper>
复制代码
通过这种方式,可以在Spring Security过滤器中注入UserMapper实例,直接调用方法来查询用户信息。这些信息后续可以用于JWT的天生或用户认证的逻辑。
3.3 MyBatis应用实践与优化

3.3.1 MyBatis与事件管理

  MyBatis天然支持Spring的声明式事件管理,用户可以利用  @Transactional  注解来开启事件。在MyBatis中,可以团结SqlSession来手动管理事件,如下所示:
  1. try (SqlSession session = sqlSessionFactory.openSession()) {
  2.     UserMapper mapper = session.getMapper(UserMapper.class);
  3.     try {
  4.         // 执行一系列的数据库操作
  5.         mapper.updateUser(...);
  6.         mapper.insertUser(...);
  7.         // 提交事务
  8.         ***mit();
  9.     } catch (Exception e) {
  10.         // 回滚事务
  11.         session.rollback();
  12.         throw e;
  13.     }
  14. }
复制代码
3.3.2 性能优化策略

  MyBatis在性能方面可以通过以下策略进行优化:

  • SQL优化 :优化SQL查询语句,包罗利用索引、避免不必要的JOIN操作等。
  • 缓存策略 :MyBatis提供了两级缓存,一级缓存是SqlSession级别的,二级缓存是映射器级别的。合理利用缓存能够大幅度提升性能。
  • 批量操作 :利用MyBatis的批量操作特性,减少数据库交互次数,提高数据操作效率。
  • 延迟加载 :当关联查询多时,可以利用延迟加载策略,按需加载数据,减少内存消耗。
  下面的表格展示了MyBatis与JDBC直接操作数据库性能对比的一个案例分析:
  | 测试项目 | JDBC操作耗时(ms) | MyBatis操作耗时(ms) | 性能提升比例 | |:--------:|:-----------------:|:---------------------:|:-------------:| | 单条查询 | 30 | 25 | 16.7% | | 批量更新 | 150 | 50 | 66.7% |
  通过这种方式,能够直观地评估在差异操作类型下MyBatis与原生JDBC操作的性能差异,并针对性地进行优化。
3.3.3 MyBatis问题诊断与办理

  在日常开发和运维中,可能会遇到一些MyBatis相关的性能问题或非常。为了诊断这些问题,MyBatis提供了多种工具和日志记录机制。开发者可以通过配置MyBatis的日志输出,来观察实际实行的SQL语句以及实行时间,便于分析性能瓶颈。
  1. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
复制代码
此外,MyBatis官方提供的分析工具MyBatis Log Analyser可以用来分析日志文件,分析SQL的实行效率,为优化提供数据支持。
3.4 MyBatis代码块解析

  在进行MyBatis相关操作时,开发者经常需要编写接口和映射文件,下面将展示一个简单的代码块,并进行解析。
  1. public interface UserMapper {
  2.     User selectUserById(int id);
  3. }
复制代码
在上面的Java接口中,界说了一个方法  selectUserById  。为了在MyBatis中实现这个接口方法,需要在对应的映射文件中编写相应的SQL语句。
  1. <mapper namespace="com.example.mapper.UserMapper">
  2.   <select id="selectUserById" parameterType="int" resultType="User">
  3.     SELECT * FROM users WHERE id = #{id}
  4.   </select>
  5. </mapper>
复制代码
对于  selectUserById  方法,在映射文件中提供了一个对应的操作。  parameterType  属性界说了方法参数的类型,  resultType  界说了返回类型。在SQL语句中,  #{id}  是一个参数占位符,MyBatis在实行时会将其更换为实际传入的参数值。
  MyBatis利用了预编译的SQL语句和参数占位符,这不但可以防止SQL注入攻击,还能够提高性能。因为预编译语句只需要数据库编译一次,纵然需要实行多次,也可以复用预编译的效果,从而提高性能。
3.5 总结

  通过本章的学习,我们了解了MyBatis框架与数据库交互的核心概念,包罗SQL映射文件和动态SQL的利用,以及MyBatis的工作流程,包罗配置、会话管理和事件处理。我们还演示了如安在SpringSecurity和JWT集成的情况中利用MyBatis进行数据库操作。在实际应用中,MyBatis能够通过其灵活的配置和强大的SQL处理能力,帮助开发者高效地完成数据持久化工作。通过合理地配置和优化,MyBatis不但能够提高开发效率,还可以在保证数据操作性能的同时,提升整个应用的性能表现。
4. Redis内存数据库的缓存应用

  在现代Web应用开发中,缓存技能扮演着至关紧张的脚色,尤其是在处理高并发请求和降低数据库访问频率方面。Redis作为一种高性能的内存数据库,被广泛应用于缓存办理方案之中。本章将深入探究Redis的根本概念、数据布局、持久化机制,并详细阐明如何通过Spring Data Redis将其集成到Java应用中,同时提供缓存一致性和与数据库交互的最佳实践。
Redis核心概念与数据布局

数据类型与应用场景

  Redis支持多种数据类型,包罗字符串(String)、哈希(Hash)、列表(List)、聚集(Set)、有序聚集(Sorted Set)等。每种数据类型都有其特定的应用场景:


  • 字符串 :实用于存储单个值,如计数器、缓存的JSON对象等。
  • 哈希 :适合存储对象模型的数据,例如用户信息等。
  • 列表 :可以用来实现队列、栈等数据布局。
  • 聚集 :用于存储无序且唯一值的场景,如好友关系。
  • 有序聚集 :类似于聚集,但每个元素都关联着一个浮点数分数,实用于排行榜等场景。
内存管理

  Redis是基于内存的数据库,其数据的存储和管理都需要考虑内存的相关问题。Redis提供了数据过期策略,能够通过下令设置键的生存时间(TTL),以确保内存利用效率。过期的数据会自动被Redis删除。
数据持久化

  为了防止数据丢失,Redis提供了RDB和AOF两种持久化机制:


  • RDB (Redis Database Backup):通过快照的方式,在指定的时间间隔内将内存中的数据保存到磁盘上。
  • AOF (Append Only File):记录每一个写操作,对数据进行增量持久化,数据安全性更高。
性能考量

  Redis的读写性能非常高,这得益于其利用内存存储数据的特性。为了进一步提升性能,Redis还提供了主从复制和集群模式,以实现数据的高可用性和程度扩展。
Spring Data Redis集成与应用

集成概述

  Spring Data Redis是Spring提供的数据访问技能栈之一,它抽象了Redis的根本操作,简化了Redis在Java应用中的集成和利用。Spring Data Redis提供了多种模板类,如RedisTemplate,以及用于操作各种数据类型的Template类。
配置Spring Data Redis

  在Spring应用中集成Redis,需要进行一系列配置:
  1. @Configuration
  2. @EnableCaching
  3. public class RedisConfig extends CachingConfigurerSupport {
  4.     @Bean
  5.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  6.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  7.         template.setConnectionFactory(factory);
  8.         // 设置序列化器等配置
  9.         return template;
  10.     }
  11.     @Bean
  12.     public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
  13.         RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory).build();
  14.         return cacheManager;
  15.     }
  16. }
复制代码
利用RedisTemplate操作数据

  通过配置好的RedisTemplate,我们可以非常方便地进行数据操作:
  1. @Autowired
  2. private RedisTemplate<String, Object> redisTemplate;
  3. public void set(String key, String value) {
  4.     redisTemplate.opsForValue().set(key, value);
  5. }
  6. public String get(String key) {
  7.     return (String) redisTemplate.opsForValue().get(key);
  8. }
复制代码
实现缓存一致性

  在分布式系统中,缓存一致性是一个挑衅。利用Redis实现缓存一致性,常见的策略有:


  • 发布订阅模式 :通过消息队列,当数据库更新时发布消息,订阅者监听到消息后更新缓存。
  • 失效模式 :在数据更新时同时删除缓存,如许下次读取时会从数据库加载最新数据并重新缓存。
缓存与数据库交互

  在集成缓存和数据库时,需要考虑合理地管理缓存数据和数据库数据的一致性问题。常见的模式包罗:


  • 缓存穿透 :查询不存在的数据,导致每次都访问数据库。办理方法是利用布隆过滤器。
  • 缓存雪崩 :大量缓存同时到期失效,导致数据库压力增大。通过设置随机的过期时间可以办理。
  • 缓存击穿 :高并发查询热点数据时,大量请求可能会打到数据库。利用互斥锁可以避免击穿。
Redis应用最佳实践

缓存热点数据

  对于访问频率高的热点数据,利用缓存可以大大减轻数据库的压力。通过合理设置缓存的过期时间和大小,可以优化性能。
分布式缓存场景

  在分布式情况下,利用Redis集群可以提升缓存的可用性和读写性能。集群情况下,需要考虑数据的分片和分布策略。
缓存与业务逻辑分离

  将缓存逻辑从业务代码中分离出来,可以提升代码的可维护性和清楚度。例如,利用AOP(面向切面编程)来集中处理缓存的读写逻辑。
  通过以上实践,我们可以充实利用Redis的高性能特性,构建出高效率和稳固性的Web应用。在实际应用中,开发者应根据具体业务场景选择符合的缓存策略,不断优化和调解缓存配置以顺应需求变化。
5. 四技能集成构建安全高效Web应用

5.1 构建项目底子架构

  在开始集成SpringSecurity、JWT、MyBatis和Redis之前,我们需要确定一个底子的Web应用架构。这一部分将详细介绍如何搭建一个Spring Boot项目,该项目将作为我们集成的起点。
搭建Spring Boot项目


  • 利用Spring Initializr创建一个新的Spring Boot项目。
  • 选择Web、JPA、Security、MyBatis、Redis依赖。
  • 利用Maven或Gradle作为构建工具。
  1. <!-- 示例:pom.xml文件中的关键依赖 -->
  2. <dependencies>
  3.     <dependency>
  4.         <groupId>org.springframework.boot</groupId>
  5.         <artifactId>spring-boot-starter-web</artifactId>
  6.     </dependency>
  7.     <dependency>
  8.         <groupId>org.springframework.boot</groupId>
  9.         <artifactId>spring-boot-starter-data-jpa</artifactId>
  10.     </dependency>
  11.     <dependency>
  12.         <groupId>org.springframework.boot</groupId>
  13.         <artifactId>spring-boot-starter-security</artifactId>
  14.     </dependency>
  15.     <dependency>
  16.         <groupId>org.mybatis.spring.boot</groupId>
  17.         <artifactId>mybatis-spring-boot-starter</artifactId>
  18.         <version>2.1.4</version>
  19.     </dependency>
  20.     <dependency>
  21.         <groupId>org.springframework.boot</groupId>
  22.         <artifactId>spring-boot-starter-data-redis</artifactId>
  23.     </dependency>
  24. </dependencies>
复制代码
5.2 集成SpringSecurity与JWT

  安全是Web应用不可或缺的一部分,SpringSecurity为我们提供了强大的安全性框架,而JWT用于实现无状态的用户认证机制。
配置SpringSecurity


  • 创建SecurityConfig类继续WebSecurityConfigurerAdapter。
  • 配置http请求的安全规则。
  • 设置用户认证信息。
  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4.     @Override
  5.     protected void configure(HttpSecurity http) throws Exception {
  6.         http
  7.             .csrf().disable() // 禁用CSRF保护
  8.             .authorizeRequests()
  9.             .anyRequest().authenticated()
  10.             .and()
  11.             .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  12.     }
  13.     // 设置用户认证信息
  14.     @Autowired
  15.     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
  16.         auth.inMemoryAuthentication()
  17.             .withUser("user").password("{noop}password").roles("USER");
  18.     }
  19. }
复制代码
JWT集成

  JWT的集成紧张在用户登录乐成后进行,此时天生JWT令牌,并将其返回给客户端。
  1. // Token生成方法示例
  2. public String generateToken(String username) {
  3.     return Jwts.builder()
  4.         .setSubject(username)
  5.         .setIssuedAt(new Date())
  6.         .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 hours
  7.         .signWith(SignatureAlgorithm.HS512, secretKey)
  8.         .compact();
  9. }
复制代码
5.3 MyBatis与数据库交互集成

  MyBatis提供了一种简洁的方式来处理数据库交互,接下来,我们将集成MyBatis来实现数据访问层。
配置MyBatis


  • 配置数据源。
  • 配置MyBatis SqlSessionFactory。
  • 映射SQL文件与接口。
  1. @Configuration
  2. @MapperScan("com.example.demo.mapper") // 扫描指定包下的Mapper接口
  3. public class MyBatisConfig {
  4.     @Bean
  5.     public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
  6.         SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  7.         sessionFactory.setDataSource(dataSource);
  8.         sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
  9.         return sessionFactory.getObject();
  10.     }
  11.     @Bean
  12.     public DataSource dataSource() {
  13.         // 配置数据源
  14.         DriverManagerDataSource dataSource = new DriverManagerDataSource();
  15.         dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
  16.         dataSource.setUrl("jdbc:mysql://localhost:3306/demo");
  17.         dataSource.setUsername("root");
  18.         dataSource.setPassword("password");
  19.         return dataSource;
  20.     }
  21. }
复制代码
实现数据访问层


  • 创建Mapper接口界说所需的操作。
  • 在Mapper接口中利用注解或XML配置SQL语句。
  • 实现具体的DAO类。
  1. public interface UserMapper {
  2.     User selectUserByUsername(@Param("username") String username);
  3. }
复制代码
5.4 集成Redis作为缓存办理方案

  Redis的参加将进一步提升我们的应用性能,特别是在缓存数据和会话管理方面。
配置Redis


  • 配置RedisTemplate。
  • 配置StringRedisTemplate。
  1. @Configuration
  2. public class RedisConfig {
  3.     @Bean
  4.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  5.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  6.         template.setConnectionFactory(connectionFactory);
  7.         return template;
  8.     }
  9.     @Bean
  10.     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
  11.         return new StringRedisTemplate(connectionFactory);
  12.     }
  13. }
复制代码
实现缓存逻辑


  • 在服务层利用缓存。
  • 配置缓存注解。
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private UserMapper userMapper;
  5.     @Autowired
  6.     private RedisTemplate<String, Object> redisTemplate;
  7.     @Cacheable(value = "users", key = "#username")
  8.     public User getUserByUsername(String username) {
  9.         return (User) userMapper.selectUserByUsername(username);
  10.     }
  11. }
复制代码
通过以上步调,我们徐徐集成了SpringSecurity、JWT、MyBatis和Redis,构建了一个安全且高效的底子Web应用架构。接下来的章节,我们将继续关注如何优化系统性能,并管理用户会话。
   本文另有配套的佳构资源,点击获取  

  简介:SpringSecurity提供全面的身份验证和授权功能,JWT用于分布式系统中的轻量级身份验证,MyBatis简化数据库操作,而Redis作为缓存和消息署理提高性能。通过将这些技能集成到Web应用程序中,可以创建一个既高效又安全的系统。本文将详细探究每个技能的脚色和它们之间的整合要点。
   本文另有配套的佳构资源,点击获取  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表