SpringBoot利用spring-security、JWT、Redis、MySQL、MyBatis、JavaEmail分层controller、service、mapper、utils实现用户注册、登录、通过邮箱找回密码、重置密码的功能的具体代码和各个类的分析

时间: 2023-10-09 09:14:48 浏览: 55
抱歉,本人并不熟悉该技术栈的开发。但是,我可以给出一个简单的步骤,帮助你完成这个功能的实现: 1. 创建用户表 在 MySQL 数据库中创建一个用户表,包含用户 id、用户名、密码、邮箱等字段。 2. 配置 MyBatis 使用 MyBatis 定义用户表的数据访问对象(DAO),并在 Spring Boot 中配置 MyBatis。 3. 配置 Redis 使用 Redis 存储 JWT 令牌,以及用户重置密码时所需的 token。 4. 配置 JavaEmail 使用 JavaEmail 发送找回密码邮件。 5. 编写用户注册和登录接口 使用 Spring Boot 和 Spring Security 编写用户注册和登录接口,并使用 JWT 生成和管理用户令牌。 6. 编写找回密码接口 用户点击找回密码按钮后,向后端发送请求,后端生成一个随机 token,并将其存储在 Redis 中,然后发送一封邮件至用户邮箱,包含重置密码链接,重置密码链接中携带 token。 7. 编写重置密码接口 用户点击重置密码链接后,后端验证 token 是否有效,如果有效则返回重置密码页面,用户输入新密码后,后端更新用户密码。 以上是一个大致的流程,具体实现细节需要根据具体的项目需求进行调整。
相关问题

SpringBoot利用security、jwt、redis、MySQL、mybatis分层controller、service、mapper、util实现用户登录的代码和各个类的分析

以下是SpringBoot利用security、jwt、redis、MySQL、mybatis分层controller、service、mapper、util实现用户登录的代码: ### UserController.java ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping("/register") public Result register(@RequestBody User user) { userService.register(user); return Result.success(); } @PostMapping("/login") public Result login(@RequestBody User user) { String token = userService.login(user.getUsername(), user.getPassword()); return Result.success(token); } } ``` ### UserServiceImpl.java ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private RedisTemplate<String, Object> redisTemplate; private static final String REDIS_USER_PREFIX = "user:"; @Override public void register(User user) { userMapper.insert(user); } @Override public String login(String username, String password) { User user = userMapper.selectByUsername(username); if (user == null || !user.getPassword().equals(password)) { throw new BusinessException(ResultCode.USER_LOGIN_ERROR); } String token = JwtTokenUtil.generateToken(user.getId()); redisTemplate.opsForValue().set(REDIS_USER_PREFIX + token, user, JwtTokenUtil.EXPIRATION_TIME, TimeUnit.MILLISECONDS); return token; } @Override public User getUserByToken(String token) { return (User) redisTemplate.opsForValue().get(REDIS_USER_PREFIX + token); } } ``` ### UserMapper.java ```java @Mapper public interface UserMapper { void insert(User user); User selectByUsername(String username); } ``` ### JwtTokenUtil.java ```java public class JwtTokenUtil { public static final long EXPIRATION_TIME = 86400000L; private static final String SECRET = "mysecret"; public static String generateToken(int userId) { Date now = new Date(); Date expirationTime = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(String.valueOf(userId)) .setIssuedAt(now) .setExpiration(expirationTime) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } public static int getUserIdFromToken(String token) { Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody(); return Integer.parseInt(claims.getSubject()); } } ``` ### WebSecurityConfig.java ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/user/register", "/user/login").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` ### JwtAuthenticationFilter.java ```java public class JwtAuthenticationFilter extends OncePerRequestFilter { @Autowired private UserService userService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = request.getHeader("Authorization"); if (StringUtils.hasText(token) && JwtTokenUtil.validateToken(token)) { User user = userService.getUserByToken(token); if (user != null) { SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user, null, Collections.emptyList())); } } filterChain.doFilter(request, response); } } ``` ### UserDetailsServiceImple.java ```java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userMapper.selectByUsername(username); if (user == null) { throw new UsernameNotFoundException("用户名不存在"); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), Collections.emptyList()); } } ``` ### Result.java ```java public class Result { private int code; private String message; private Object data; public static Result success() { return new Result(ResultCode.SUCCESS); } public static Result success(Object data) { return new Result(ResultCode.SUCCESS, data); } public static Result failure(ResultCode resultCode) { return new Result(resultCode); } public static Result failure(ResultCode resultCode, Object data) { return new Result(resultCode, data); } private Result(ResultCode resultCode) { this.code = resultCode.getCode(); this.message = resultCode.getMessage(); } private Result(ResultCode resultCode, Object data) { this.code = resultCode.getCode(); this.message = resultCode.getMessage(); this.data = data; } // getter and setter } ``` ### BusinessException.java ```java public class BusinessException extends RuntimeException { private ResultCode resultCode; public BusinessException(ResultCode resultCode) { super(resultCode.getMessage()); this.resultCode = resultCode; } public ResultCode getResultCode() { return resultCode; } } ``` ### ResultCode.java ```java public enum ResultCode { SUCCESS(200, "操作成功"), USER_LOGIN_ERROR(401, "用户名或密码错误"), UNAUTHORIZED(401, "未授权访问"), FORBIDDEN(403, "禁止访问"), NOT_FOUND(404, "资源不存在"), INTERNAL_SERVER_ERROR(500, "服务器内部错误"); private int code; private String message; ResultCode(int code, String message) { this.code = code; this.message = message; } // getter } ``` 以上是代码,下面是各个类的分析: - UserController:用户控制器,处理用户注册和登录请求。 - UserServiceImpl:用户服务实现类,处理用户注册、登录和获取用户信息。 - UserMapper:用户数据访问接口,提供插入用户和根据用户名查询用户的方法。 - JwtTokenUtil:JWT令牌工具类,提供生成令牌、验证令牌和从令牌中获取用户ID的方法。 - WebSecurityConfig:Web安全配置类,配置用户认证和授权相关信息。 - JwtAuthenticationFilter:JWT认证过滤器,用于从HTTP请求中提取JWT令牌,并进行认证和授权。 - UserDetailsServiceImpl:用户详情服务实现类,用于从数据库中查询用户信息,并返回一个UserDetails对象。 - Result:结果类,用于封装请求的处理结果和响应给客户端。 - BusinessException:业务异常类,用于封装业务错误信息。 - ResultCode:结果代码枚举类,用于定义响应状态码和对应的消息。

SpringBoot利用security、jwt、redis、MySQL、mybatis分层controller、service、mapper、util实现用户通过邮箱重设密码的代码和各个类的分析

首先需要说明的是,实现用户通过邮箱重设密码的代码是一个比较复杂的功能,需要多个技术点的组合使用。下面我将分别介绍利用SpringBoot、security、jwt、redis、MySQL、mybatis实现该功能的大致思路和各个类的作用。 1. SpringBoot SpringBoot是一个快速、方便的Spring框架搭建工具。通过SpringBoot,我们可以快速搭建一个Web应用程序,并集成各种开源框架和技术,大大提高了开发效率。在本文中,我们使用SpringBoot作为Web应用程序的底层框架。 2. Security Spring Security是Spring框架的安全框架,可以实现用户认证、授权等功能。在本文中,我们使用Spring Security来实现用户登录验证和访问权限控制。 3. JWT JWT(JSON Web Token)是一种用于身份认证的标准,可以在客户端和服务端之间安全地传递信息。在本文中,我们使用JWT来生成和解析token,以实现用户身份验证和授权。 4. Redis Redis是一种内存数据库,可以快速读取和写入数据。在本文中,我们使用Redis来存储token和验证码等数据。 5. MySQL MySQL是一种关系型数据库,可以存储结构化的数据。在本文中,我们使用MySQL来存储用户信息和重设密码的过程记录。 6. Mybatis Mybatis是一种Java持久化框架,可以方便地与数据库进行交互。在本文中,我们使用Mybatis来实现与MySQL的交互。 7. Controller Controller是SpringMVC框架中的控制器,负责接收前端请求并调用相应的业务逻辑。在本文中,我们使用Controller来实现用户请求重设密码的接口。 8. Service Service是SpringMVC框架中的服务层,负责处理业务逻辑。在本文中,我们使用Service来实现生成验证码和发送邮件的功能,并处理用户重设密码的请求。 9. Mapper Mapper是Mybatis框架中的映射器,负责将Java对象与数据库表进行映射。在本文中,我们使用Mapper来实现与MySQL的交互。 10. Util Util是工具类,主要用于提供一些通用的函数和方法。在本文中,我们使用Util来实现一些公共的功能,如生成随机字符串等。 下面是实现用户通过邮箱重设密码的代码大致流程: 1. 用户向后端发送重设密码请求,后端生成一个随机验证码,并将验证码和用户的邮箱存储在Redis中,同时发送一封包含验证码的邮件给用户。 2. 用户在收到邮件后,将邮件中的验证码和自己的邮箱发送给后端,后端检查验证码是否正确,如果正确,则生成一个token(使用JWT),将token和用户信息存储在Redis中,并返回token给用户。 3. 用户向后端发送重设密码请求,并将之前收到的token一起发送给后端,后端检查token是否正确,如果正确,则允许用户重设密码。 4. 用户输入新密码后,后端将新密码更新到MySQL数据库中,并删除之前存储在Redis中的token和验证码等数据。 下面是各个类的大致作用: 1. UserController:接收用户请求,调用UserService处理业务逻辑。 2. UserService:处理业务逻辑,调用UserMapper与MySQL交互,调用EmailUtil发送邮件,调用JwtUtil生成和解析token,调用RedisUtil存储和读取数据。 3. UserMapper:定义与MySQL的交互方法,如插入用户信息、更新用户信息等。 4. EmailUtil:提供发送邮件的功能。 5. JwtUtil:提供生成和解析token的功能。 6. RedisUtil:提供存储和读取数据的功能。

相关推荐

最新推荐

recommend-type

Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

主要介绍了Springboot+SpringSecurity+JWT实现用户登录和权限认证示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权.doc

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权
recommend-type

SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现

主要介绍了SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

SpringBoot+Spring Security+JWT实现RESTful Api权限控制的方法

主要介绍了SpringBoot+Spring Security+JWT实现RESTful Api权限控制的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

SpringBoot+Vue+Redis实现单点登录(一处登录另一处退出登录)

小编接到一个需求,需要实现用户在浏览器登录后,跳转到其他页面,当用户在其它地方又登录时,前面用户登录的页面退出登录,这篇文章主要介绍了SpringBoot+Vue+Redis实现单点登录,需要的朋友可以参考下
recommend-type

GO婚礼设计创业计划:技术驱动的婚庆服务

"婚礼GO网站创业计划书" 在创建婚礼GO网站的创业计划书中,创业者首先阐述了企业的核心业务——GO婚礼设计,专注于提供计算机软件销售和技术开发、技术服务,以及与婚礼相关的各种服务,如APP制作、网页设计、弱电工程安装等。企业类型被定义为服务类,涵盖了一系列与信息技术和婚礼策划相关的业务。 创业者的个人经历显示了他对行业的理解和投入。他曾在北京某科技公司工作,积累了吃苦耐劳的精神和实践经验。此外,他在大学期间担任班长,锻炼了团队管理和领导能力。他还参加了SYB创业培训班,系统地学习了创业意识、计划制定等关键技能。 市场评估部分,目标顾客定位为本地的结婚人群,特别是中等和中上收入者。根据数据显示,广州市内有14家婚庆公司,该企业预计能占据7%的市场份额。广州每年约有1万对新人结婚,公司目标接待200对新人,显示出明确的市场切入点和增长潜力。 市场营销计划是创业成功的关键。尽管文档中没有详细列出具体的营销策略,但可以推断,企业可能通过线上线下结合的方式,利用社交媒体、网络广告和本地推广活动来吸引目标客户。此外,提供高质量的技术解决方案和服务,以区别于竞争对手,可能是其市场差异化策略的一部分。 在组织结构方面,未详细说明,但可以预期包括了技术开发团队、销售与市场部门、客户服务和支持团队,以及可能的行政和财务部门。 在财务规划上,文档提到了固定资产和折旧、流动资金需求、销售收入预测、销售和成本计划以及现金流量计划。这表明创业者已经考虑了启动和运营的初期成本,以及未来12个月的收入预测,旨在确保企业的现金流稳定,并有可能享受政府对大学生初创企业的税收优惠政策。 总结来说,婚礼GO网站的创业计划书详尽地涵盖了企业概述、创业者背景、市场分析、营销策略、组织结构和财务规划等方面,为初创企业的成功奠定了坚实的基础。这份计划书显示了创业者对市场的深刻理解,以及对技术和婚礼行业的专业认识,有望在竞争激烈的婚庆市场中找到一席之地。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【基础】PostgreSQL的安装和配置步骤

![【基础】PostgreSQL的安装和配置步骤](https://img-blog.csdnimg.cn/direct/8e80154f78dd45e4b061508286f9d090.png) # 2.1 安装前的准备工作 ### 2.1.1 系统要求 PostgreSQL 对系统硬件和软件环境有一定要求,具体如下: - 操作系统:支持 Linux、Windows、macOS 等主流操作系统。 - CPU:推荐使用多核 CPU,以提高数据库处理性能。 - 内存:根据数据库规模和并发量确定,一般建议 8GB 以上。 - 硬盘:数据库文件和临时文件需要占用一定空间,建议预留足够的空间。
recommend-type

字节跳动面试题java

字节跳动作为一家知名的互联网公司,在面试Java开发者时可能会关注以下几个方面的问题: 1. **基础技能**:Java语言的核心语法、异常处理、内存管理、集合框架、IO操作等是否熟练掌握。 2. **面向对象编程**:多态、封装、继承的理解和应用,可能会涉及设计模式的提问。 3. **并发编程**:Java并发API(synchronized、volatile、Future、ExecutorService等)的使用,以及对并发模型(线程池、并发容器等)的理解。 4. **框架知识**:Spring Boot、MyBatis、Redis等常用框架的原理和使用经验。 5. **数据库相
recommend-type

微信行业发展现状及未来发展趋势分析

微信行业发展现状及未来行业发展趋势分析 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信月活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。 微信作为流量枢纽,已经成为移动互联网的基础设施,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。 中国的整体移动互联网人均单日使用时长已经较高水平。18Q1中国移动互联网的月度总时长达到了77千亿分钟,环比17Q4增长了14%,单人日均使用时长达到了273分钟,环比17Q4增长了15%。而根据抽样统计,社交始终占据用户时长的最大一部分。2018年3月份,社交软件占据移动互联网35%左右的时长,相比2015年减少了约10pct,但仍然是移动互联网当中最大的时长占据者。 争夺社交软件份额的主要系娱乐类App,目前占比达到约32%左右。移动端的流量时长分布远比PC端更加集中,通常认为“搜索下載”和“网站导航”为PC时代的流量枢纽,但根据统计,搜索的用户量约为4.5亿,为各类应用最高,但其时长占比约为5%左右,落后于网络视频的13%左右位于第二名。PC时代的网络社交时长占比约为4%-5%,基本与搜索相当,但其流量分发能力远弱于搜索。 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。