Commit 28fdc8e42e17c48b9b214b8ab5c388a0f5527c6e

Authored by wangwenbin10
1 parent 53bda604

初始化 c 端的登录逻辑

Showing 17 changed files with 179 additions and 28 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java
1 package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; 1 package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
4 import lombok.Data; 5 import lombok.Data;
5 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 7 import lombok.ToString;
@@ -11,4 +12,8 @@ import lombok.ToString; @@ -11,4 +12,8 @@ import lombok.ToString;
11 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
12 @ToString(callSuper = true) 13 @ToString(callSuper = true)
13 public class SysLoginLogCreateReqVO extends SysLoginLogBaseVO { 14 public class SysLoginLogCreateReqVO extends SysLoginLogBaseVO {
14 -} 15 +
  16 + @ApiModelProperty(value = "用户编号", example = "1")
  17 + private Long userId;
  18 +
  19 +}
15 \ No newline at end of file 20 \ No newline at end of file
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkSer @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkSer
6 import javax.validation.Valid; 6 import javax.validation.Valid;
7 7
8 /** 8 /**
9 - * 认证 Service 接口 9 + * 管理后台的认证 Service 接口
10 * 10 *
11 * 提供用户的账号密码登录、token 的校验等认证相关的功能 11 * 提供用户的账号密码登录、token 的校验等认证相关的功能
12 * 12 *
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -38,6 +38,7 @@ import org.springframework.util.Assert; @@ -38,6 +38,7 @@ import org.springframework.util.Assert;
38 38
39 import javax.annotation.Resource; 39 import javax.annotation.Resource;
40 import java.util.List; 40 import java.util.List;
  41 +import java.util.Objects;
41 import java.util.Set; 42 import java.util.Set;
42 43
43 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; 44 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
@@ -154,14 +155,24 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -154,14 +155,24 @@ public class SysAuthServiceImpl implements SysAuthService {
154 } 155 }
155 156
156 private void createLoginLog(String username, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) { 157 private void createLoginLog(String username, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) {
  158 + // 获得用户
  159 + SysUserDO user = userService.getUserByUsername(username);
  160 + // 插入登录日志
157 SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); 161 SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO();
158 reqVO.setLogType(logTypeEnum.getType()); 162 reqVO.setLogType(logTypeEnum.getType());
159 reqVO.setTraceId(TracerUtils.getTraceId()); 163 reqVO.setTraceId(TracerUtils.getTraceId());
  164 + if (user != null) {
  165 + reqVO.setUserId(user.getId());
  166 + }
160 reqVO.setUsername(username); 167 reqVO.setUsername(username);
161 reqVO.setUserAgent(ServletUtils.getUserAgent()); 168 reqVO.setUserAgent(ServletUtils.getUserAgent());
162 reqVO.setUserIp(ServletUtils.getClientIP()); 169 reqVO.setUserIp(ServletUtils.getClientIP());
163 reqVO.setResult(loginResult.getResult()); 170 reqVO.setResult(loginResult.getResult());
164 loginLogService.createLoginLog(reqVO); 171 loginLogService.createLoginLog(reqVO);
  172 + // 更新最后登录时间
  173 + if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
  174 +
  175 + }
165 } 176 }
166 177
167 /** 178 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java
@@ -24,17 +24,10 @@ public class SysLoginLogServiceImpl implements SysLoginLogService { @@ -24,17 +24,10 @@ public class SysLoginLogServiceImpl implements SysLoginLogService {
24 24
25 @Resource 25 @Resource
26 private SysLoginLogMapper loginLogMapper; 26 private SysLoginLogMapper loginLogMapper;
27 - @Resource  
28 - private SysUserService userService;  
29 27
30 @Override 28 @Override
31 public void createLoginLog(SysLoginLogCreateReqVO reqVO) { 29 public void createLoginLog(SysLoginLogCreateReqVO reqVO) {
32 SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqVO); 30 SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqVO);
33 - // 获得用户  
34 - SysUserDO user = userService.getUserByUsername(reqVO.getUsername());  
35 - if (user != null) {  
36 - loginLog.setUserId(user.getId());  
37 - }  
38 loginLog.setUserType(UserTypeEnum.ADMIN.getValue()); 31 loginLog.setUserType(UserTypeEnum.ADMIN.getValue());
39 // 插入 32 // 插入
40 loginLogMapper.insert(loginLog); 33 loginLogMapper.insert(loginLog);
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java
@@ -20,7 +20,7 @@ import java.util.List; @@ -20,7 +20,7 @@ import java.util.List;
20 import java.util.Map; 20 import java.util.Map;
21 21
22 /** 22 /**
23 - * 用户 Service 接口 23 + * 后台用户 Service 接口
24 * 24 *
25 * @author 芋道源码 25 * @author 芋道源码
26 */ 26 */
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java
@@ -24,7 +24,7 @@ public class LoginUser implements UserDetails { @@ -24,7 +24,7 @@ public class LoginUser implements UserDetails {
24 */ 24 */
25 private Long id; 25 private Long id;
26 /** 26 /**
27 - * 科室编号 27 + * 部门编号
28 */ 28 */
29 private Long deptId; 29 private Long deptId;
30 /** 30 /**
@@ -49,6 +49,8 @@ public class LoginUser implements UserDetails { @@ -49,6 +49,8 @@ public class LoginUser implements UserDetails {
49 */ 49 */
50 private Integer status; 50 private Integer status;
51 51
  52 + // TODO @芋艿:怎么去掉 deptId
  53 +
52 @Override 54 @Override
53 @JsonIgnore// 避免序列化 55 @JsonIgnore// 避免序列化
54 public String getPassword() { 56 public String getPassword() {
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.infra.service;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/MbrAuthController.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.userserver.modules.member.controller.auth; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.userserver.modules.member.controller.auth;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.*; 4 import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.*;
  5 +import cn.iocoder.yudao.userserver.modules.member.service.auth.MbrAuthService;
5 import io.swagger.annotations.Api; 6 import io.swagger.annotations.Api;
6 import io.swagger.annotations.ApiImplicitParam; 7 import io.swagger.annotations.ApiImplicitParam;
7 import io.swagger.annotations.ApiImplicitParams; 8 import io.swagger.annotations.ApiImplicitParams;
@@ -10,8 +11,13 @@ import lombok.extern.slf4j.Slf4j; @@ -10,8 +11,13 @@ import lombok.extern.slf4j.Slf4j;
10 import org.springframework.validation.annotation.Validated; 11 import org.springframework.validation.annotation.Validated;
11 import org.springframework.web.bind.annotation.*; 12 import org.springframework.web.bind.annotation.*;
12 13
  14 +import javax.annotation.Resource;
13 import javax.validation.Valid; 15 import javax.validation.Valid;
14 16
  17 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  18 +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
  19 +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent;
  20 +
15 @Api(tags = "认证") 21 @Api(tags = "认证")
16 @RestController 22 @RestController
17 @RequestMapping("/") 23 @RequestMapping("/")
@@ -19,13 +25,15 @@ import javax.validation.Valid; @@ -19,13 +25,15 @@ import javax.validation.Valid;
19 @Slf4j 25 @Slf4j
20 public class MbrAuthController { 26 public class MbrAuthController {
21 27
  28 + @Resource
  29 + private MbrAuthService authService;
  30 +
22 @PostMapping("/login") 31 @PostMapping("/login")
23 @ApiOperation("使用手机 + 密码登录") 32 @ApiOperation("使用手机 + 密码登录")
24 public CommonResult<MbrAuthLoginRespVO> login(@RequestBody @Valid MbrAuthLoginReqVO reqVO) { 33 public CommonResult<MbrAuthLoginRespVO> login(@RequestBody @Valid MbrAuthLoginReqVO reqVO) {
25 -// String token = authService.login(reqVO, getClientIP(), getUserAgent());  
26 -// // 返回结果  
27 -// return success(MbrAuthLoginRespVO.builder().token(token).build());  
28 - return null; 34 + String token = authService.login(reqVO, getClientIP(), getUserAgent());
  35 + // 返回结果
  36 + return success(MbrAuthLoginRespVO.builder().token(token).build());
29 } 37 }
30 38
31 @PostMapping("/sms-login") 39 @PostMapping("/sms-login")
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.convert;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/user/MbrAuthConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.convert.user;
  2 +
  3 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  4 +import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +@Mapper
  9 +public interface MbrAuthConvert {
  10 +
  11 + MbrAuthConvert INSTANCE = Mappers.getMapper(MbrAuthConvert.class);
  12 +
  13 + LoginUser convert(MbrUserDO bean);
  14 +
  15 +}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserDO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/dataobject/user/MbrUserDO.java
1 -package cn.iocoder.yudao.userserver.modules.member.dal.mysql.user; 1 +package cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.dal.mysql.user;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +/**
  8 + * MbrUserDO Mapper
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Mapper
  13 +public interface MbrUserMapper extends BaseMapperX<MbrUserDO> {
  14 +
  15 + default MbrUserDO selectByMobile(String mobile) {
  16 + return selectOne("mobile", mobile);
  17 + }
  18 +
  19 +}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/auth/SysAuthService.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/auth/MbrAuthService.java
1 -package cn.iocoder.yudao.userserver.modules.infra.service.auth; 1 +package cn.iocoder.yudao.userserver.modules.member.service.auth;
2 2
3 import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; 3 import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
  4 +import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.MbrAuthLoginReqVO;
  5 +
  6 +import javax.validation.Valid;
4 7
5 /** 8 /**
6 - * 认证 Service 接口 9 + * 用户前台的认证 Service 接口
7 * 10 *
8 * 提供用户的账号密码登录、token 的校验等认证相关的功能 11 * 提供用户的账号密码登录、token 的校验等认证相关的功能
9 * 12 *
10 * @author 芋道源码 13 * @author 芋道源码
11 */ 14 */
12 -public interface SysAuthService extends SecurityAuthFrameworkService { 15 +public interface MbrAuthService extends SecurityAuthFrameworkService {
  16 +
  17 + /**
  18 + * 手机 + 密码登录
  19 + *
  20 + * @param reqVO 登录信息
  21 + * @param userIp 用户 IP
  22 + * @param userAgent 用户 UA
  23 + * @return 身份令牌,使用 JWT 方式
  24 + */
  25 + String login(@Valid MbrAuthLoginReqVO reqVO, String userIp, String userAgent);
13 26
14 } 27 }
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/auth/impl/SysAuthServiceImpl.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/auth/impl/MbrAuthServiceImpl.java
1 -package cn.iocoder.yudao.userserver.modules.infra.service.auth.impl; 1 +package cn.iocoder.yudao.userserver.modules.member.service.auth.impl;
2 2
3 import cn.iocoder.yudao.framework.security.core.LoginUser; 3 import cn.iocoder.yudao.framework.security.core.LoginUser;
4 -import cn.iocoder.yudao.userserver.modules.infra.service.auth.SysAuthService; 4 +import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.MbrAuthLoginReqVO;
  5 +import cn.iocoder.yudao.userserver.modules.member.convert.user.MbrAuthConvert;
  6 +import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
  7 +import cn.iocoder.yudao.userserver.modules.member.service.auth.MbrAuthService;
  8 +import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
5 import lombok.extern.slf4j.Slf4j; 9 import lombok.extern.slf4j.Slf4j;
  10 +import org.springframework.context.annotation.Lazy;
  11 +import org.springframework.security.authentication.AuthenticationManager;
6 import org.springframework.security.core.userdetails.UserDetails; 12 import org.springframework.security.core.userdetails.UserDetails;
7 import org.springframework.security.core.userdetails.UsernameNotFoundException; 13 import org.springframework.security.core.userdetails.UsernameNotFoundException;
8 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
9 15
  16 +import javax.annotation.Resource;
  17 +
10 /** 18 /**
11 * Auth Service 实现类 19 * Auth Service 实现类
12 * 20 *
@@ -14,7 +22,30 @@ import org.springframework.stereotype.Service; @@ -14,7 +22,30 @@ import org.springframework.stereotype.Service;
14 */ 22 */
15 @Service 23 @Service
16 @Slf4j 24 @Slf4j
17 -public class SysAuthServiceImpl implements SysAuthService { 25 +public class MbrAuthServiceImpl implements MbrAuthService {
  26 +
  27 + @Resource
  28 + @Lazy // 延迟加载,因为存在相互依赖的问题
  29 + private AuthenticationManager authenticationManager;
  30 +
  31 + @Resource
  32 + private MbrUserService userService;
  33 +
  34 + @Override
  35 + public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException {
  36 + // 获取 username 对应的 SysUserDO
  37 + MbrUserDO user = userService.getUserByMobile(mobile);
  38 + if (user == null) {
  39 + throw new UsernameNotFoundException(mobile);
  40 + }
  41 + // 创建 LoginUser 对象
  42 + return MbrAuthConvert.INSTANCE.convert(user);
  43 + }
  44 +
  45 + @Override
  46 + public String login(MbrAuthLoginReqVO reqVO, String userIp, String userAgent) {
  47 + return null;
  48 + }
18 49
19 @Override 50 @Override
20 public LoginUser verifyTokenAndRefresh(String token) { 51 public LoginUser verifyTokenAndRefresh(String token) {
@@ -31,8 +62,4 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -31,8 +62,4 @@ public class SysAuthServiceImpl implements SysAuthService {
31 62
32 } 63 }
33 64
34 - @Override  
35 - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {  
36 - return null;  
37 - }  
38 } 65 }
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.service.user;
  2 +
  3 +import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
  4 +
  5 +/**
  6 + * 前台用户 Service 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface MbrUserService {
  11 +
  12 + /**
  13 + * 通过手机查询用户
  14 + *
  15 + * @param mobile 手机
  16 + * @return 用户对象
  17 + */
  18 + MbrUserDO getUserByMobile(String mobile);
  19 +
  20 +}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.service.user.impl;
  2 +
  3 +import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
  4 +import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper;
  5 +import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.springframework.stereotype.Service;
  8 +
  9 +import javax.annotation.Resource;
  10 +import javax.validation.Valid;
  11 +
  12 +/**
  13 + * User Service 实现类
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Service
  18 +@Valid
  19 +@Slf4j
  20 +public class MbrUserServiceImpl implements MbrUserService {
  21 +
  22 + @Resource
  23 + private MbrUserMapper userMapper;
  24 +
  25 + @Override
  26 + public MbrUserDO getUserByMobile(String mobile) {
  27 + return userMapper.selectByMobile(mobile);
  28 + }
  29 +
  30 +}
更新日志.md
@@ -7,10 +7,16 @@ @@ -7,10 +7,16 @@
7 7
8 * 工作流 8 * 工作流
9 9
10 -## [v1.1.0] 待定 10 +## [v1.1.1] 待定
11 11
12 * 支付 12 * 支付
13 -* 三方平台接入 13 +
  14 +## [v1.1.0] 待定
  15 +
  16 +* 新增管理后台的企业微信、钉钉等社交登录
  17 +* 新增用户前台(例如说,用户使用的小程序)的后端项目 `yudao-user-server`
  18 +* 新增用户前台的手机登录、验证码登录、TODO
  19 +* 修复管理后台的用户头像上传 404 的问题
14 20
15 ## [v1.0.0] 2021.05.03 21 ## [v1.0.0] 2021.05.03
16 22