refreshToken(@NotEmpty(message = "刷新token不允许为空") @RequestParam("refreshToken")String refreshToken){
+ LoginVO loginVO = loginService.refreshToken(refreshToken);
+ return R.data(loginVO);
}
diff --git a/das/src/main/java/com/das/modules/auth/domain/LoginUserDetails.java b/das/src/main/java/com/das/modules/auth/domain/LoginUserDetails.java
new file mode 100644
index 00000000..dc4b9cd0
--- /dev/null
+++ b/das/src/main/java/com/das/modules/auth/domain/LoginUserDetails.java
@@ -0,0 +1,27 @@
+package com.das.modules.auth.domain;
+
+import com.das.modules.auth.domain.vo.SysUserVo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zb
+ * @Description
+ */
+@Data
+public class LoginUserDetails implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private SysUserVo sysUser;
+
+
+ private String token;
+
+
+ public LoginUserDetails() {
+ }
+
+
+}
diff --git a/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDTO.java b/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDTO.java
deleted file mode 100644
index 46298410..00000000
--- a/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDTO.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.das.modules.auth.domain.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @author chenhaojie
- * @Description
- */
-@Data
-public class SysUserDTO {
-
- @ApiModelProperty("用户账号")
- private String username;
-
- @ApiModelProperty("用户昵称")
- private String nickName;
-
- @ApiModelProperty("真实姓名")
- private String realName;
-
- @ApiModelProperty("用户类型(00系统用户)")
- private String userType;
-
- @ApiModelProperty("用户邮箱")
- private String email;
-
- @ApiModelProperty("手机号码")
- private String mobile;
-
-}
diff --git a/das/src/main/java/com/das/modules/auth/domain/request/LoginRequest.java b/das/src/main/java/com/das/modules/auth/domain/request/LoginRequest.java
index ed6d30fa..82277107 100644
--- a/das/src/main/java/com/das/modules/auth/domain/request/LoginRequest.java
+++ b/das/src/main/java/com/das/modules/auth/domain/request/LoginRequest.java
@@ -20,11 +20,17 @@ public class LoginRequest {
@ApiModelProperty("密码")
private String password;
+ @NotBlank(message = "是否记住")
+ @ApiModelProperty("是否记住")
+ private boolean keep;
+
@NotBlank(message = "验证码不允许为空")
@ApiModelProperty("验证码")
- private String captcha;
+ private String code;
@NotBlank(message = "验证码唯一标识不允许为空")
@ApiModelProperty("验证码唯一标识")
private String uuid;
+
+
}
diff --git a/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java b/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java
new file mode 100644
index 00000000..ab6d9f3e
--- /dev/null
+++ b/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java
@@ -0,0 +1,58 @@
+package com.das.modules.auth.domain.vo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * 账号信息
+ *
+ * @author guchengwei
+ */
+@Data
+public class SysUserVo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ * 账号ID
+ */
+ @ApiModelProperty("账号ID")
+ private Long id;
+
+ /**
+ * 账号名
+ */
+ @ApiModelProperty("账号名")
+ private String account;
+
+ /**
+ * 账号本地名
+ */
+ @ApiModelProperty("账号本地名")
+ private String userName;
+
+ /**
+ * 手机号
+ */
+ @ApiModelProperty("手机号")
+ private String phone;
+
+ /**
+ * E-Mail地址
+ */
+ @ApiModelProperty("E-Mail地址")
+ private String email;
+
+
+ /**
+ * 所属机构
+ */
+ @ApiModelProperty("组织机构")
+ private Long orgId;
+
+
+}
diff --git a/das/src/main/java/com/das/modules/auth/domain/vo/TokenVo.java b/das/src/main/java/com/das/modules/auth/domain/vo/TokenVo.java
new file mode 100644
index 00000000..d848a132
--- /dev/null
+++ b/das/src/main/java/com/das/modules/auth/domain/vo/TokenVo.java
@@ -0,0 +1,34 @@
+package com.das.modules.auth.domain.vo;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 令牌实体
+ * @author Administrator
+ */
+@Api(description = "令牌实体")
+@Data
+public class TokenVo {
+ /**
+ * 令牌
+ */
+ @ApiModelProperty("令牌值")
+ private String token;
+ /**
+ * 令牌超时时间,单位(秒)
+ */
+ @ApiModelProperty("令牌超时时间,单位(秒)")
+ public long tokenTimeout;
+ /**
+ * 令牌活动超时间隔,单位(秒)
+ */
+ @ApiModelProperty("令牌活动超时间隔,单位(秒)")
+ public long tokenActivityTimeout;
+ /**
+ * 账号ID
+ */
+ @ApiModelProperty("账号ID")
+ public long accountId;
+}
diff --git a/das/src/main/java/com/das/modules/auth/entity/SysUser.java b/das/src/main/java/com/das/modules/auth/entity/SysUser.java
index aa7fc544..ac113762 100644
--- a/das/src/main/java/com/das/modules/auth/entity/SysUser.java
+++ b/das/src/main/java/com/das/modules/auth/entity/SysUser.java
@@ -14,6 +14,7 @@ import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
+import java.util.Date;
/**
*
@@ -35,43 +36,29 @@ public class SysUser extends BaseEntity {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
- @ApiModelProperty("用户账号")
- private String username;
+ @ApiModelProperty("登录账号")
+ private String account;
- @ApiModelProperty("用户昵称")
- private String nickName;
-
- @ApiModelProperty("真实姓名")
- private String realName;
-
- @ApiModelProperty("用户类型(00系统用户)")
- private String userType;
-
- @ApiModelProperty("用户邮箱")
- private String email;
-
- @ApiModelProperty("手机号码")
- private String mobile;
-
- @ApiModelProperty("用户性别(1男 2女 3未知)")
- private String sex;
-
- @ApiModelProperty("头像地址")
- private String avatar;
-
-// @JsonDeserialize(using = LocalDateDeserializer.class)
-// @JsonSerialize(using = LocalDateSerializer.class)
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- @JsonFormat(pattern = "yyyy-MM-dd")
- @ApiModelProperty("出生年月")
- private LocalDate birthday;
-
- @JSONField(serialize = false)
- @ApiModelProperty("密码")
+ @ApiModelProperty("加密后的密码")
private String password;
- @ApiModelProperty("备注")
- private String remark;
+ @ApiModelProperty("职员名称")
+ private String userName;
+ @ApiModelProperty("职员邮箱")
+ private String email;
+
+ @ApiModelProperty("职员联系电话")
+ private String phone;
+
+ @ApiModelProperty("所属机构id")
+ private Long orgId;
+
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("最近一次登录时间")
+ private Date lastLogin;
+
+ @ApiModelProperty("乐观锁")
+ private int revision;
}
diff --git a/das/src/main/java/com/das/modules/auth/service/ILoginService.java b/das/src/main/java/com/das/modules/auth/service/ILoginService.java
index 029b61c4..bd0c1beb 100644
--- a/das/src/main/java/com/das/modules/auth/service/ILoginService.java
+++ b/das/src/main/java/com/das/modules/auth/service/ILoginService.java
@@ -1,8 +1,13 @@
package com.das.modules.auth.service;
-import com.das.modules.auth.domain.request.LoginRequest;
+import com.das.common.result.R;
+import com.das.modules.auth.domain.LoginUserDetails;
import com.das.modules.auth.domain.vo.LoginVO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* @author chenhaojie
@@ -12,16 +17,17 @@ public interface ILoginService {
/**
* 登录接口
- * @param loginRequest 登录请求
+ *
+ * @param data 登录请求
* @return 登录成功
*/
- String login(LoginRequest loginRequest);
+ LoginUserDetails login(String data, HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException;
/**
* 退出登录
* @return 是否退出成功
*/
- boolean logout();
+ boolean logout(HttpServletRequest request);
/**
* 刷新token
diff --git a/das/src/main/java/com/das/modules/auth/service/impl/LoginServiceImpl.java b/das/src/main/java/com/das/modules/auth/service/impl/LoginServiceImpl.java
index bf806d53..10ab6bfb 100644
--- a/das/src/main/java/com/das/modules/auth/service/impl/LoginServiceImpl.java
+++ b/das/src/main/java/com/das/modules/auth/service/impl/LoginServiceImpl.java
@@ -1,68 +1,116 @@
package com.das.modules.auth.service.impl;
import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.das.common.captcha.CaptchaUtil;
+import com.das.common.exceptions.ServiceException;
+import com.das.common.result.R;
+import com.das.common.result.ResultCode;
+import com.das.common.utils.AESUtil;
import com.das.common.utils.AdminRedisTemplate;
+import com.das.modules.auth.domain.LoginUserDetails;
import com.das.modules.auth.domain.request.LoginRequest;
+import com.das.modules.auth.domain.vo.SysUserVo;
+import com.das.modules.auth.entity.SysUser;
+import com.das.modules.auth.mapper.SysUserMapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.das.modules.auth.domain.vo.LoginVO;
import com.das.modules.auth.service.ILoginService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
/**
* @author chenhaojie
* @Description
*/
@Service
public class LoginServiceImpl implements ILoginService {
+ @Resource
+ private SysUserMapper sysUserMapper;
@Autowired
private AdminRedisTemplate adminRedisTemplate;
+ @Resource
+ private AESUtil aesUtil;
+
+ @Value("${aesKey}")
+ private String key;
+
+// @Override
+// public String login(LoginRequest loginRequest) {
+// String captcha = loginRequest.getUsername();
+// String account = loginRequest.getUsername();
+// String password = loginRequest.getPassword();
+// String uuid = loginRequest.getPassword();
+//
+// // 验证码验证逻辑(这里省略,需根据实际情况实现)
+// if (CaptchaUtil.checkVerificationCode(uuid, captcha, adminRedisTemplate)) {
+// return "验证码错误";
+// }
+// // 用户名密码验证
+//// if (isValidUser(account, password)) {
+// // 登录成功,使用Sa-Token生成Token
+// StpUtil.login(account);
+// // 返回Token给客户端
+// return StpUtil.getTokenValue();
+//// } else {
+//// return "用户名或密码错误";
+//
+// }
@Override
- public String login(LoginRequest loginRequest) {
- String captcha = loginRequest.getUsername();
- String account = loginRequest.getUsername();
+ public LoginUserDetails login(String param, HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException {
+ String iv = request.getHeader("v");
+ System.out.println("iv:" + iv);
+ param = aesUtil.decrypt(key, param, iv);
+ ObjectMapper objectMapper = new ObjectMapper();
+ LoginRequest loginRequest = objectMapper.readValue(param, LoginRequest.class);
+ String name = loginRequest.getUsername();
String password = loginRequest.getPassword();
- String uuid = loginRequest.getPassword();
+ String code = loginRequest.getCode();
+ String uuid = loginRequest.getUuid();
- // 验证码验证逻辑(这里省略,需根据实际情况实现)
- if (CaptchaUtil.checkVerificationCode(uuid, captcha, adminRedisTemplate)) {
- return "验证码错误";
+
+ LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
+ wrapper.eq(SysUser::getAccount, loginRequest.getUsername());
+ SysUser sysUser = sysUserMapper.selectOne(wrapper);
+ if (sysUser == null) {
+ throw new ServiceException("无账号信息");
}
- // 用户名密码验证
-// if (isValidUser(account, password)) {
- // 登录成功,使用Sa-Token生成Token
- StpUtil.login(account);
- // 返回Token给客户端
- return StpUtil.getTokenValue();
-// } else {
-// return "用户名或密码错误";
-
+ if (!CaptchaUtil.checkVerificationCode(uuid, code, adminRedisTemplate)) {
+ throw new ServiceException("验证码不正确");
+ }
+ StpUtil.login(sysUser.getId()); // 执行登录,这里username为用户唯一标识
+ SysUserVo sysUserVo = new SysUserVo();
+ sysUserVo.setId(sysUser.getId());
+ sysUserVo.setAccount(sysUser.getAccount());
+ sysUserVo.setUserName(sysUser.getUserName());
+ sysUserVo.setPhone(sysUser.getPhone());
+ sysUserVo.setEmail(sysUser.getEmail());
+ sysUserVo.setOrgId(sysUser.getOrgId());
+ LoginUserDetails loginInfo = new LoginUserDetails();
+ loginInfo.setSysUser(sysUserVo); // 存储用户信息到会话
+ loginInfo.setToken(StpUtil.getTokenValue());
+ return loginInfo;
}
+
@Override
- public boolean logout() {
-// // 调用注销接口的时候需要携带token
-// // 从 SecurityContextHolder 请求中获取认证信息,然后再获取username
-// SecurityContext context = SecurityContextHolder.getContext();
-// Authentication authentication = context.getAuthentication();
-// if (authentication == null){
-// return false;
-// }
-// // 认证之后 principal 里面是 UserDetails 的子类
-// // 未认证的时候 principal 里面是 username (登录账号)
-// Object principal = authentication.getPrincipal();
-// // UserLogin 实现了 UserDetails 接口
-// LoginUserDetails userLogin = (LoginUserDetails) principal;
-// SysUser user = userLogin.getSysUser();
-// String username = user.getUsername();
-// String uuid = userLogin.getUuid();
-// // 认证设置为空
-// context.setAuthentication(null);
-// // 删除redis中的token
-// return adminRedisTemplate.del(username+":"+uuid);
+ public boolean logout(HttpServletRequest request) {
+ String iv = request.getHeader("v");
+ String token = request.getHeader("token");
+ System.out.println("iv:" + iv);
+ token = aesUtil.decrypt(key, token, iv);
+ StpUtil.logoutByTokenValue(token);
return true;
}
@@ -72,11 +120,11 @@ public class LoginServiceImpl implements ILoginService {
// String uuid = (String) claim.get("uuid");
// String username = (String) claim.get("username");
// String refresh = (String) claim.get("refresh");
-// if (StrUtil.isEmpty(refresh)){
+// if (StrUtil.isEmpty(refresh)) {
// throw new BusinessException("非法token");
// }
// LoginUserDetails loginUserDetails = adminRedisTemplate.get(username + ":refresh:" + uuid);
-// if (loginUserDetails == null){
+// if (loginUserDetails == null) {
// throw new BusinessException("token过期,请重新登录");
// }
// String token = tokenService.createToken(loginUserDetails);
@@ -84,7 +132,7 @@ public class LoginServiceImpl implements ILoginService {
// String tokenPrefix = jwtProperties.getTokenPrefix();
// // 删除原有刷新token
// adminRedisTemplate.del(username + ":refresh:" + uuid);
-// return new LoginVO(tokenPrefix + " " +token,newRefreshToken ,jwtProperties.getExpireTime());
+// return new LoginVO(tokenPrefix + " " + token, newRefreshToken, jwtProperties.getExpireTime());
return new LoginVO();
}
diff --git a/das/src/main/resources/application-dev.yml b/das/src/main/resources/application-dev.yml
index 76c34669..4e56532e 100644
--- a/das/src/main/resources/application-dev.yml
+++ b/das/src/main/resources/application-dev.yml
@@ -34,3 +34,5 @@ spring:
# 日志配置文件位置
logging:
config: classpath:log/logback-spring-dev.xml
+
+aesKey: b6967ee87b86d85a
diff --git a/das/src/main/resources/application.yml b/das/src/main/resources/application.yml
index 277305e2..65e70752 100644
--- a/das/src/main/resources/application.yml
+++ b/das/src/main/resources/application.yml
@@ -23,7 +23,7 @@ sa-token:
# token前缀
token-prefix: Bearer
# token有效期,单位秒
- timeout: 3600
+ timeout: 7200
# 是否允许同一账号多终端登录,默认为true
is-concurrent: true
@@ -76,7 +76,7 @@ spring:
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
# 搜索指定包别名
- typeAliasesPackage: cn.mesmile.**.entity
+ typeAliasesPackage: com.das.**.entity
global-config:
# 关闭MP3.0自带的banner
banner: false
diff --git a/das/src/main/resources/mapper/SysUserMapper.xml b/das/src/main/resources/mapper/SysUserMapper.xml
index 93ba91ee..3c9dd930 100644
--- a/das/src/main/resources/mapper/SysUserMapper.xml
+++ b/das/src/main/resources/mapper/SysUserMapper.xml
@@ -5,34 +5,27 @@
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
- status,
- deleted,
- create_time,
- create_by,
- update_time,
- update_by,
- id, account, nick_name, real_name, user_type, email, mobile, sex, avatar, birthday, password, remark
+ created_time,
+ created_by,
+ updated_time,
+ updated_by,
+ id, account, user_name, org_id, last_login, email, phone, revision, password