当前位置: 首页 > news >正文

【java】RuoYi-Vue前后端分离版本-登陆请求流程解析

【java】RuoYiBootstrap多模块版本-登陆请求流程解析
这里它用到了一个安全管理框架Spring Security
你可以通过这篇文章《Spring Security 详解》 去了解它,怎么使用

在这里插入图片描述

登陆请求流程逻辑图

Created with Raphaël 2.3.0 (1)开始 (2)【接下来所有业务都受SecurityConfig配置所过滤】 模块:ruoyi-framework 位置:src/main/java 包名:com.ruoyi.framework.config 类名:SecurityConfig.java 方法:protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception (3)【请求登陆控制器-登录方法】 模块: ruoyi-admin 位置:src/main/java 包名: com.ruoyi.web.controller.system 类名: SysLoginController.java 方法:public AjaxResult login(@RequestBody LoginBody loginBody) 调用方法:String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),loginBody.getUuid()); (4)【登录验证】 模块: ruoyi-framework 位置:src/main/java 包名: com.ruoyi.framework.web.service 类名: SysLoginService.java 方法:public String login(String username, String password, String code, String uuid) 调用方法:authentication = authenticationManager.authenticate(authenticationToken); (5)【走过滤器(Security)拿到用户信息】 模块:ruoyi-framework 位置:src/main/java 包名:com.ruoyi.framework.web.service 类名: UserDetailsServiceImpl.java 方法:public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 调用方法:SysUser user = userService.selectUserByUserName(username); (6)【通过用户名查询用户】 模块:ruoyi-system 位置:src/main/java 包名:com.ruoyi.system.service.impl 类名: SysUserServiceImpl.java 方法:public SysUser selectUserByUserName(String userName) 调用方法: return userMapper.selectUserByUserName(userName); (7)【进入MyBatis接口映射文件】 模块:ruoyi-system 位置:src/main/java 包名:com.ruoyi.system.mapper 类名: SysUserMapper.java 方法:public SysUser selectUserByUserName(String userName); (8)【进入MyBatis的xml配置文件】 模块:ruoyi-system 位置:src/main/resources/mapper/system/ xml文件名: SysUserMapper.xml 方法: selectUserByUserName 代码: <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult"> <include refid="selectUserVo"/> where u.user_name = #{userName} and u.del_flag = '0' </select> (9)结束:返回结果

SecurityConfig配置过滤

  • 模块:ruoyi-framework
  • 位置:src/main/java
  • 包名:com.ruoyi.framework.config
  • 类名:SecurityConfig.java
  • 过滤配置代码位置:114行

过滤配置代码

// 注解标记允许匿名访问的url.authorizeHttpRequests((requests) -> {permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());// 对于登录login 注册register 验证码captchaImage 允许匿名访问requests.antMatchers("/login", "/register", "/captchaImage").permitAll()// 静态资源,可匿名访问.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()// 除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated();})

SecurityConfig.java 源码

package com.ruoyi.framework.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.web.filter.CorsFilter;
import com.ruoyi.framework.config.properties.PermitAllUrlProperties;
import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;/*** spring security配置* * @author ruoyi*/
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Configuration
public class SecurityConfig
{/*** 自定义用户认证逻辑*/@Autowiredprivate UserDetailsService userDetailsService;/*** 认证失败处理类*/@Autowiredprivate AuthenticationEntryPointImpl unauthorizedHandler;/*** 退出处理类*/@Autowiredprivate LogoutSuccessHandlerImpl logoutSuccessHandler;/*** token认证过滤器*/@Autowiredprivate JwtAuthenticationTokenFilter authenticationTokenFilter;/*** 跨域过滤器*/@Autowiredprivate CorsFilter corsFilter;/*** 允许匿名访问的地址*/@Autowiredprivate PermitAllUrlProperties permitAllUrl;/*** 身份验证实现*/@Beanpublic AuthenticationManager authenticationManager(){DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();daoAuthenticationProvider.setUserDetailsService(userDetailsService);daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());return new ProviderManager(daoAuthenticationProvider);}/*** anyRequest          |   匹配所有请求路径* access              |   SpringEl表达式结果为true时可以访问* anonymous           |   匿名可以访问* denyAll             |   用户不能访问* fullyAuthenticated  |   用户完全认证可以访问(非remember-me下自动登录)* hasAnyAuthority     |   如果有参数,参数表示权限,则其中任何一个权限可以访问* hasAnyRole          |   如果有参数,参数表示角色,则其中任何一个角色可以访问* hasAuthority        |   如果有参数,参数表示权限,则其权限可以访问* hasIpAddress        |   如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问* hasRole             |   如果有参数,参数表示角色,则其角色可以访问* permitAll           |   用户可以任意访问* rememberMe          |   允许通过remember-me登录的用户访问* authenticated       |   用户登录后可访问*/@Beanprotected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception{return httpSecurity// CSRF禁用,因为不使用session.csrf(csrf -> csrf.disable())// 禁用HTTP响应标头.headers((headersCustomizer) -> {headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());})// 认证失败处理类.exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))// 基于token,所以不需要session.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))// 注解标记允许匿名访问的url.authorizeHttpRequests((requests) -> {permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());// 对于登录login 注册register 验证码captchaImage 允许匿名访问requests.antMatchers("/login", "/register", "/captchaImage").permitAll()// 静态资源,可匿名访问.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()// 除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated();})// 添加Logout filter.logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))// 添加JWT filter.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)// 添加CORS filter.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class).addFilterBefore(corsFilter, LogoutFilter.class).build();}/*** 强散列哈希加密实现*/@Beanpublic BCryptPasswordEncoder bCryptPasswordEncoder(){return new BCryptPasswordEncoder();}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OpenAI推出GPT-4o微调功能
  • Nuitka 打包 exe 软件步骤
  • JSON, YAML, XML, CSV交互可视化
  • 设计模式六大原则(一)--单一职责原则
  • 一站式NVR模组解决方案:基于海思 3520D芯片的完整源码与系统集成
  • 基于Python的机器学习系列(7):多元逻辑回归
  • GT IP中的Sequence Max Skew
  • Git入门 -- 分支
  • 基于人工智能、三维视觉、混合现实等技术的智慧能源开源了
  • 使用SSMS连接和查询 SQL Server 实例
  • 基于深度学习的环境感知系统
  • 设计模式-结构型模式(第五章)
  • 【C++】01背包问题暴力,记忆,动态规划解法
  • 算法笔记|Day26贪心算法IV
  • [C#]将opencvsharp的Mat对象转成onnxruntime的inputtensor的3种方法
  • 【comparator, comparable】小总结
  • 【mysql】环境安装、服务启动、密码设置
  • CentOS6 编译安装 redis-3.2.3
  • Fundebug计费标准解释:事件数是如何定义的?
  • Redux系列x:源码分析
  • Sublime text 3 3103 注册码
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 将 Measurements 和 Units 应用到物理学
  • 马上搞懂 GeoJSON
  • Spring Batch JSON 支持
  • ​ssh免密码登录设置及问题总结
  • ​批处理文件中的errorlevel用法
  • ###C语言程序设计-----C语言学习(3)#
  • #{}和${}的区别?
  • #《AI中文版》V3 第 1 章 概述
  • #git 撤消对文件的更改
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (solr系列:一)使用tomcat部署solr服务
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (七)Java对象在Hibernate持久化层的状态
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十八)Flink CEP 详解
  • (十六)视图变换 正交投影 透视投影
  • (数据结构)顺序表的定义
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)我也是一只IT小小鸟
  • (转载)利用webkit抓取动态网页和链接
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .Net 8.0 新的变化
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net(C#)中String.Format如何使用
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET是什么
  • .Net组件程序设计之线程、并发管理(一)