登陆请求流程逻辑图 Created with Raphaël 2.3.0 (1)登陆流程解析 (2)【接下来所有业务都受ShiroConfig配置所过滤】 模块:ruoyi-framework 位置:src/main/java 包名:com.ruoyi.framework.config 类名:ShiroConfig.java (3)【请求登陆控制器】 模块:ruoyi-admin 位置:src/main/java 包名:com.ruoyi.web.controller.system 类名:SysLoginController.java 方法: @PostMapping("/login") @ResponseBody public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe){} (4)【进入shiro-core-1.13.0.jar】 详情情况看下文 (5)此时,跳出第三方,进入业务处理 (6)【登录认证】 模块:ruoyi-framework 位置:src/main/java 包名:com.ruoyi.framework.shiro.realm 类名:UserRealm.java 类继承AuthorizingRealm,代码public class UserRealm extends AuthorizingRealm 方法:protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException 调用: user = loginService.login(username, password); ***因为此类继承了AuthorizingRealm,所以,调取第三方的时候,会自动进入该类 (7)【根据账号密码获取用户信息,并判断登陆是否成功】 模块:ruoyi-framework 位置:src/main/java 包名:com.ruoyi.framework.shiro.service 类名:SysLoginService.java 方法: public SysUser login(String username, String password) 调用: // 查询用户信息 SysUser user = userService.selectUserByLoginName(username); (8)跳出业务处理,进入数据库操作 (9)【通过用户名查询用户】 模块:ruoyi-system 位置:src/main/java 包名:com.ruoyi.system.service.impl 类名:SysUserServiceImpl.java 方法: public SysUser selectUserByLoginName(String userName) 调用: // 通过用户名查询用户 return userMapper.selectUserByLoginName(userName); (10)进入映射的接口文件 (11)【数据操作映射接口-通过用户名查询用户】 模块:ruoyi-system 位置:src/main/java 包名:com.ruoyi.system.mapper 类名:SysUserMapper.java 方法: public SysUser selectUserByLoginName(String userName) (12)进入mybatis的xml配置文件 (13)【数据操作映射配置文件-mybatis的xml文件】 模块:ruoyi-system 位置:src/main/resources 完整路径:ruoyi-system/src/main/resources/mapper/system/ 文件名:SysUserMapper.xml 方法: <select id="selectUserByLoginName" parameterType="String" resultMap="SysUserResult"> <include refid="selectUserVo"/> where u.login_name = #{userName} and u.del_flag = '0' </select> (14)结束:数据映射接口文件返回数据 【进入shiro-core-1.13.0.jar】 详情 Created with Raphaël 2.3.0 进入shiro-core-1.13.0.jar 包名:org.apache.shiro.subject.support包 类名:DelegatingSubject.class 方法名:public void login(AuthenticationToken token) throws AuthenticationException 执行 Subject subject = securityManager.login(this, token); 包名:org.apache.shiro.mgt 类名:DefaultSecurityManager.class 方法名:public Subject login(Subject subject, AuthenticationToken token) throws AuthenticationException 执行 info = authenticate(token); 包名:org.apache.shiro.mgt 类名:AuthenticatingSecurityManager.class 方法名:public AuthenticationInfo authenticate(AuthenticationToken token) throws AuthenticationException 执行 return this.authenticator.authenticate(token); 包名:org.apache.shiro.authc 类名:AbstractAuthenticator.class 方法名:public final AuthenticationInfo authenticate(AuthenticationToken token) throws AuthenticationException 执行 info = doAuthenticate(token); 包名:org.apache.shiro.authc.pam 类名:ModularRealmAuthenticator.class 方法名:protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException 执行 return doSingleRealmAuthentication(realms.iterator().next(), authenticationToken); 或 return doMultiRealmAuthentication(realms, authenticationToken); 包名:org.apache.shiro.authc.pam包 类名:ModularRealmAuthenticator.class 方法名:protected AuthenticationInfo doSingleRealmAuthentication(Realm realm, AuthenticationToken token) 执行 AuthenticationInfo info = realm.getAuthenticationInfo(token); 包名:org.apache.shiro.realm 类名: AuthenticatingRealm.class 方法名: public final AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException 执行 info = doGetAuthenticationInfo(token); 出去shiro-core-1.13.0.jar