From fcc1ac0ee263d12d50cf28923975a08b7453fdcd Mon Sep 17 00:00:00 2001 From: 18616268358 <1440265357@qq.com> Date: Sat, 20 May 2023 17:47:52 +0800 Subject: [PATCH] =?UTF-8?q?#20230510=20=E6=AC=A3=E5=BD=B1=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=B9=B3=E5=8F=B0=E8=A3=85=E7=BD=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 ++ .../controller/SysLoginController.java | 84 ++++++ .../controller/TerminalController.java | 2 +- .../src/main/resources/application-test.yml | 4 + xymanager_common/pom.xml | 25 ++ .../xymanager_common/base/AjaxResult.java | 148 ++++++++++ .../shxy/xymanager_common/bean/SysDept.java | 264 ++++++++++++++++++ .../shxy/xymanager_common/bean/SysUser.java | 66 +++++ .../xymanager_common/bean/SysUserOnline.java | 117 ++++++++ .../xymanager_common/bean/SysUserPost.java | 52 ++++ .../config/CustomRsaProperties.java | 32 +++ .../constant/HttpStatusCode.java | 106 +++++++ .../xymanager_common/constant/UserStatus.java | 34 +++ .../xymanager_common/constant/UuidUtils.java | 16 ++ .../shxy/xymanager_common/entity/SysUser.java | 50 ++++ .../xymanager_common/entity/UserSession.java | 22 ++ .../exception/CustomException.java | 43 +++ .../UserPasswordNotMatchException.java | 48 ++++ .../manager/AsyncManager.java | 63 +++++ .../manager/factory/AsyncFactory.java | 76 +++++ .../xymanager_common/model/SysLoginLog.java | 134 +++++++++ .../xymanager_common/security/LoginUser.java | 214 ++++++++++++++ .../CustomAuthExceptionEntryPoint.java | 44 +++ .../shxy/xymanager_common/util/LogUtils.java | 22 ++ .../com/shxy/xymanager_common/util/Md5.java | 63 +++++ .../shxy/xymanager_common/util/RsaUtils.java | 186 ++++++++++++ .../xymanager_common/util/SecurityUtils.java | 92 ++++++ .../shxy/xymanager_common/util/Threads.java | 96 +++++++ .../xymanager_common/util/http/HttpUtils.java | 190 +++++++++++++ .../shxy/xymanager_common/vo/SysUserVo.java | 26 ++ .../xymanager_dao/dao/SysUserMapperDao.java | 94 +++++++ .../resources/mappers/SysUserMapperDao.xml | 85 ++++++ xymanager_service/pom.xml | 5 + .../impl/CustomPermissionServiceImpl.java | 44 +++ .../impl/CustomUserDetailsServiceImpl.java | 51 ++++ .../impl/LoginServiceImpl.java | 112 ++++++++ .../impl/LogoutSuccessHandlerImpl.java | 35 +++ .../impl/SysUserServiceImpl.java | 176 ++++++++++++ .../service/CustomPermissionService.java | 22 ++ .../service/CustomUserDetailsService.java | 20 ++ .../service/LoginService.java | 41 +++ .../service/SysUserService.java | 128 +++++++++ .../security/CustomSecurityConfig.java | 113 ++++++++ .../JwtAuthenticationTokenFilter.java | 64 +++++ 44 files changed, 3324 insertions(+), 1 deletion(-) create mode 100644 xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/SysLoginController.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/base/AjaxResult.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysDept.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUser.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserOnline.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserPost.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/config/CustomRsaProperties.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/constant/HttpStatusCode.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UserStatus.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UuidUtils.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/entity/SysUser.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/entity/UserSession.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/exception/CustomException.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/exception/UserPasswordNotMatchException.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/manager/AsyncManager.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/manager/factory/AsyncFactory.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/model/SysLoginLog.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/security/LoginUser.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/security/componet/CustomAuthExceptionEntryPoint.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/util/LogUtils.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/util/Md5.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/util/RsaUtils.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/util/SecurityUtils.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/util/Threads.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/util/http/HttpUtils.java create mode 100644 xymanager_common/src/main/java/com/shxy/xymanager_common/vo/SysUserVo.java create mode 100644 xymanager_dao/src/main/java/com/shxy/xymanager_dao/dao/SysUserMapperDao.java create mode 100644 xymanager_dao/src/main/resources/mappers/SysUserMapperDao.xml create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomPermissionServiceImpl.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomUserDetailsServiceImpl.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LoginServiceImpl.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LogoutSuccessHandlerImpl.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/impl/SysUserServiceImpl.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomPermissionService.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomUserDetailsService.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/LoginService.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/SysUserService.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/CustomSecurityConfig.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/JwtAuthenticationTokenFilter.java diff --git a/pom.xml b/pom.xml index 8e6f091..91c03da 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,8 @@ 2.2.0 1.4.0 1.4 + 0.9.0 + 3.2.0 @@ -58,6 +60,7 @@ ${mybatis-spring-boot.version} + com.github.pagehelper @@ -72,6 +75,12 @@ ${swagger.version} + + io.jsonwebtoken + jjwt + ${jwt.version} + + com.github.xiaoymin @@ -99,6 +108,13 @@ ${fastjson.version} + + io.jsonwebtoken + jjwt + ${jwt.version} + + + diff --git a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/SysLoginController.java b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/SysLoginController.java new file mode 100644 index 0000000..37a41bc --- /dev/null +++ b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/SysLoginController.java @@ -0,0 +1,84 @@ +package com.shxy.xymanager_admin.controller; + + +import com.shxy.xymanager_common.base.AjaxResult; +import com.shxy.xymanager_common.base.ResponseReult; +import com.shxy.xymanager_common.bean.ServiceBody; +import com.shxy.xymanager_common.bean.ServiceStatus; +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.constant.Constants; +import com.shxy.xymanager_common.model.TerminalListModel; +import com.shxy.xymanager_common.security.LoginUser; +import com.shxy.xymanager_common.util.ServletUtils; +import com.shxy.xymanager_common.vo.SysUserVo; +import com.shxy.xymanager_service.service.LoginService; +import com.shxy.xymanager_service.service.SysUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@Api(value = "登录验证", tags = "登录验证") +@RestController +@Slf4j +public class SysLoginController { + + + @Autowired + private LoginService loginService; + + @Autowired + SysUserService sysUserService; + + + + + /** + * @Description 登录方法 + * + * @param sysUser + * @return ResponseReult + */ + @ApiOperation(value = "登录", notes = "登录", httpMethod = "POST") + @ApiResponses({@ApiResponse(code = 200, message = "请求成功"), @ApiResponse(code = 400, message = "请求参数没填好"), @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")}) + @RequestMapping("/login") + public ResponseReult login(@RequestBody SysUser sysUser) throws Exception { + ServiceBody serviceBody = loginService.remoteLogin(sysUser.getUserName(), sysUser.getPassword()); + if (serviceBody.getCode() == ServiceStatus.SUCCESS) { + return ResponseReult.success(serviceBody.getData()); + } else { + return ResponseReult.error(serviceBody.getCode(), serviceBody.getMsg()); + } + } + + + + + + /** + * 新增用户 + * + * @param vo + * @return + */ + + @ApiOperation(value = "新增用户", notes = "新增用户", httpMethod = "POST") + @ApiResponses({@ApiResponse(code = 200, message = "请求成功"), @ApiResponse(code = 400, message = "请求参数没填好"), @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")}) + @RequestMapping("/addUser") + public ResponseReult add(@RequestBody @Validated SysUserVo vo) { + ServiceBody serviceBody = sysUserService.addUser(vo); + if (serviceBody.getCode() == ServiceStatus.SUCCESS) { + return ResponseReult.success(serviceBody.getData()); + } else { + return ResponseReult.error(serviceBody.getCode(), serviceBody.getMsg()); + } + } + + + + +} diff --git a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalController.java b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalController.java index bfbde40..9a23200 100644 --- a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalController.java +++ b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalController.java @@ -94,7 +94,7 @@ public class TerminalController extends BaseController { @ApiOperation(value = "获取装置触发", notes = "获取装置信息接口", httpMethod = "POST") @ApiResponses({@ApiResponse(code = 200, message = "请求成功"), @ApiResponse(code = 400, message = "请求参数没填好"), @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")}) @RequestMapping("/getTerminalStatus") - @Log(title = "获取装置运行状态触发", type = "修改") + @Log(title = "获取装置触发", type = "修改") public ResponseReult getTerminalStatus(@RequestParam("termId")Integer termId) { ServiceBody serviceBody = terminalService.getTerminalStatus(termId); if (serviceBody.getCode() == ServiceStatus.SUCCESS) { diff --git a/xymanager_admin/src/main/resources/application-test.yml b/xymanager_admin/src/main/resources/application-test.yml index 4e62ec3..b8c3ffa 100644 --- a/xymanager_admin/src/main/resources/application-test.yml +++ b/xymanager_admin/src/main/resources/application-test.yml @@ -175,3 +175,7 @@ photo: address: http://47.96.238.157/photos/ video: address: http://47.96.238.157/videos/ +rsa: + public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCViq0L+1XCTKOkt9nmy9aQbMRNNJNBOtPYRlCq/bRuwlYaq/I+XqSDkIF8s4JJSy3/Vgjw0fp8d4O+5KBS4Om9Ela60I2Vv/q8LjCNFNYbRE6xI7yrlyPukodmC/s1VgODDRHn3vVyKcK9nyF7xZsXixnlvltAky888CJkLpiGjQIDAQAB + private_key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJWKrQv7VcJMo6S32ebL1pBsxE00k0E609hGUKr9tG7CVhqr8j5epIOQgXyzgklLLf9WCPDR+nx3g77koFLg6b0SVrrQjZW/+rwuMI0U1htETrEjvKuXI+6Sh2YL+zVWA4MNEefe9XIpwr2fIXvFmxeLGeW+W0CTLzzwImQumIaNAgMBAAECgYAzOn2LlD9Nv5lzzTPNl9jaQxiAZllnyDJYbcYmvaD5LIP4wRzMdvmexHtHb+tbFnEcfqmzbguEZiDw3Tt7COepQWvNzlM+/HbFtkXzSh6WEu2TgjZwudcCDHDyjDzUNgcWnBIw8/+Sy4COOm4p+UnprYK4sdriMZyz8K5UC8CxFQJBAODTt0lg/HiZKaOX7PMmsiRisd5oAslyDHCt66oPG29KTE1j4fwKDzGJlrOo1f4Q078IDYMO1I/Y3uP8Es3FT1MCQQCqRrD+lO3YCZOUGTHm2WGmbljIoeDpnIn2TZFyqDGKXs6EAx7SXkgarY2OC5O2aifMhXElPUGChfSgPmRUFHafAkEAxFtkWuwf1NxAJ6cKxZpoP6sLGenRdUrsXoUnrBEhruM/HOA9gLjwaB14x1SQASOFK/TGiE4ti6ynjoqbiafoDQJBAI0l6FZAsiBhX9pmQD1yeUXzNtmphr1gK+TmS+lVjyt6h4pa49PSn8atkyfqZNnTiYY6H56U9pbx3+Rtk9E23VUCQEZ9/JHUaGc77s3ibpcKFVemlb0i/Uvj2V45aoNfY34iex4biAUsRq/FJNiqBk+xQWkJ4QY8nKVE45GlaCfZ8/c= + diff --git a/xymanager_common/pom.xml b/xymanager_common/pom.xml index fbfa642..d90f373 100644 --- a/xymanager_common/pom.xml +++ b/xymanager_common/pom.xml @@ -51,6 +51,12 @@ knife4j-spring-boot-starter + + eu.bitwalker + UserAgentUtils + 1.21 + + io.swagger @@ -76,6 +82,20 @@ fastjson + + org.apache.commons + commons-lang3 + + + + + commons-codec + commons-codec + 1.11 + + + + commons-fileupload @@ -104,6 +124,11 @@ spring-boot-starter-validation + + org.springframework.boot + spring-boot-starter-security + + diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/base/AjaxResult.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/base/AjaxResult.java new file mode 100644 index 0000000..0b9538d --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/base/AjaxResult.java @@ -0,0 +1,148 @@ +package com.shxy.xymanager_common.base; + + + + +import com.shxy.xymanager_common.constant.HttpStatusCode; + +import java.util.HashMap; + +/** + * @ClassName:AjaxResult + * @Description: Ajax操作返回 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 12:51 PM + * @Version V1.0 + */ +public class AjaxResult extends HashMap { + + /** + * 状态码 + */ + public static final String CODE_TAG = "code"; + + /** + * 返回内容 + */ + public static final String MSG_TAG = "msg"; + + /** + * 数据对象 + */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() { + + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (data != null) { + super.put(DATA_TAG, data); + } + } + + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) { + return new AjaxResult(HttpStatusCode.SUCCESS, msg, data); + } + + + /** + * 返回错误消息 + * + * @return + */ + public static AjaxResult error() { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(String msg) { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult error(String msg, Object data) { + return new AjaxResult(HttpStatusCode.ERROR, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(int code, String msg) { + return new AjaxResult(code, msg, null); + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysDept.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysDept.java new file mode 100644 index 0000000..d23aa32 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysDept.java @@ -0,0 +1,264 @@ +package com.shxy.xymanager_common.bean; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * @ClassName:SysDept + * @Description: 部门表. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 8:50 PM + * @Version V1.0 + */ + +public class SysDept { + + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + @ApiModelProperty(value="部门id", name="dept_id") + private Long deptId; + + /** + * 父部门id + */ + @ApiModelProperty(value="父部门id", name="parentId") + private Long parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + @ApiModelProperty(value="部门名称", name="deptName") + private String deptName; + + /** + * 显示顺序 + */ + @ApiModelProperty(value="显示顺序", name="orderNum") + private Integer orderNum; + + /** + * 负责人 + */ + private String leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @ApiModelProperty(value="删除标志(0代表存在 1代表删除)", name="delFlag") + private String delFlag; + + /** + * 创建者 + */ + @ApiModelProperty(value="创建者", name="createBy") + private String createBy; + + /** + * 创建时间 + */ + @ApiModelProperty(value="创建时间", name="createTime") + private Date createTime; + + /** + * 更新者 + */ + @ApiModelProperty(value="更新者", name="updateBy") + private String updateBy; + + /** + * 更新时间 + */ + @ApiModelProperty(value="更新时间", name="updateTime") + private Date updateTime; + + + /** + * 父部门名称 + * */ + + private String parentName; + + /** + * 子部门 + * */ + + private List children = new ArrayList(); + + + + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getAncestors() { + return ancestors; + } + + public void setAncestors(String ancestors) { + this.ancestors = ancestors; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getLeader() { + return leader; + } + + public void setLeader(String leader) { + this.leader = leader; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return "SysDept{" + + ", deptId=" + deptId + + ", parentId=" + parentId + + ", ancestors=" + ancestors + + ", deptName=" + deptName + + ", orderNum=" + orderNum + + ", leader=" + leader + + ", phone=" + phone + + ", email=" + email + + ", status=" + status + + ", delFlag=" + delFlag + + ", createBy=" + createBy + + ", createTime=" + createTime + + ", updateBy=" + updateBy + + ", updateTime=" + updateTime + + "}"; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUser.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUser.java new file mode 100644 index 0000000..2f45b63 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUser.java @@ -0,0 +1,66 @@ +package com.shxy.xymanager_common.bean; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * @ClassName:SysUser + * @Description: 用户信息表 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 2:25 PM + * @Version V1.0 + */ +@Data +public class SysUser { + + /** + * 用户ID + */ + @ApiModelProperty(value="用户ID", name="user_id") + private Long userId; + + /** + * 用户账号 + */ + @ApiModelProperty(value="用户账号", name="userAccount") + private String userName; + + /** + * 用户昵称 + */ + @ApiModelProperty(value="用户昵称", name="nickName") + private String nickName; + + /** + * 用户角色 + */ + @ApiModelProperty(value="用户角色", name="role") + private String role; + + /** + * 密码 + */ + + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + + private String status; + + + + public SysUser() { + } + + public SysUser(Long userId) { + this.userId = userId; + } + + + +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserOnline.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserOnline.java new file mode 100644 index 0000000..970a6fc --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserOnline.java @@ -0,0 +1,117 @@ +package com.shxy.xymanager_common.bean; + + +import java.io.Serializable; + +/** + * @ClassName:SysUserOnline + * @Description: 当前在线会话 + * @Author: Arno_Fu + * @CreatTime:12/23/2019 - 4:22 PM + * @Version V1.0 + */ +public class SysUserOnline implements Serializable { + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + + public String getTokenId() { + return tokenId; + } + + public void setTokenId(String tokenId) { + this.tokenId = tokenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserPost.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserPost.java new file mode 100644 index 0000000..8d4bb16 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/SysUserPost.java @@ -0,0 +1,52 @@ +package com.shxy.xymanager_common.bean; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serializable; + + +/** + * @ClassName:SysUserPost + * @Description: 用户和岗位关联 sys_user_post + * @Author: Arno_Fu + * @CreatTime:12/19/2019 - 5:06 PM + * @Version V1.0 + */ + +public class SysUserPost implements Serializable +{ + /** 用户ID */ + private Long userId; + + /** 岗位ID */ + private Long postId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("postId", getPostId()) + .toString(); + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/config/CustomRsaProperties.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/config/CustomRsaProperties.java new file mode 100644 index 0000000..88dae7d --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/config/CustomRsaProperties.java @@ -0,0 +1,32 @@ +package com.shxy.xymanager_common.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + + +/** + * @ClassName:RsaProperties + * @Description: 秘钥 + * @Author: Arno_Fu + * @CreatTime:12/29/2020 - 11:37 AM + * @Version V1.0 + */ +@Data +@Component +public class CustomRsaProperties { + + public static String privateKey; + + public static String publicKey; + + @Value("${rsa.private_key}") + public void setPrivateKey(String privateKey) { + CustomRsaProperties.privateKey = privateKey; + } + + @Value("${rsa.public_key}") + public void setPublicKey(String publicKey) { + CustomRsaProperties.publicKey = publicKey; + } +} \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/HttpStatusCode.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/HttpStatusCode.java new file mode 100644 index 0000000..5591d89 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/HttpStatusCode.java @@ -0,0 +1,106 @@ +package com.shxy.xymanager_common.constant; + + +/** + * + * @Description: 返回状态码 + * + * @Author: Arno_Fu + * + * @Since: 11/26/2019 11:21 AM + * + * @Version: 1.0.0 + + **/ +public interface HttpStatusCode +{ + /** + * 操作成功 + */ + public static final int SUCCESS = 200; + + /** + * 对象创建成功 + */ + public static final int CREATED = 201; + + /** + * 请求已经被接受 + */ + public static final int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + public static final int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + public static final int MOVED_PERM = 301; + + /** + * 重定向 + */ + public static final int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + public static final int BAD_REQUEST = 400; + + /** + * 未授权 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + public static final int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + public static final int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + public static final int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + public static final int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + public static final int ERROR = 500; + + /** + * 接口未实现 + */ + public static final int NOT_IMPLEMENTED = 501; + + /** + * token无效 + */ + public static final int TOKEN_INVALID= 601; + + /** + * 暂无数据 + */ + public static final int NO_DATA = 10000; +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UserStatus.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UserStatus.java new file mode 100644 index 0000000..62ab1d1 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UserStatus.java @@ -0,0 +1,34 @@ +package com.shxy.xymanager_common.constant; + + +/** + * @ClassName:UserStatus + * @Description: 用户状态 + * @Author: Arno_Fu + * @CreatTime:12/23/2019 - 4:48 PM + * @Version V1.0 + */ + +public enum UserStatus +{ + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UuidUtils.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UuidUtils.java new file mode 100644 index 0000000..c04c2f2 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/constant/UuidUtils.java @@ -0,0 +1,16 @@ +package com.shxy.xymanager_common.constant; + + +import java.util.UUID; + +/** + * Uuid Utils + * @author Jordan_Li + * + */ +public class UuidUtils { + + public static String getUUID() { + return UUID.randomUUID().toString().replace("-", ""); + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/SysUser.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/SysUser.java new file mode 100644 index 0000000..29b2d9d --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/SysUser.java @@ -0,0 +1,50 @@ +package com.shxy.xymanager_common.entity; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @ClassName:SysUser + * @Description: 用户信息表 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 2:25 PM + * @Version V1.0 + */ +@Data +public class SysUser { + + /** + * 用户ID + */ + @ApiModelProperty(value="用户ID", name="user_id") + private Long userId; + + /** + * 用户账号 + */ + @ApiModelProperty(value="用户账号", name="userAccount") + private String userName; + + /** + * 用户昵称 + */ + @ApiModelProperty(value="用户昵称", name="nickName") + private String nickName; + + /** + * 密码盐 + */ + private String passwordSalt; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/UserSession.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/UserSession.java new file mode 100644 index 0000000..b578311 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/UserSession.java @@ -0,0 +1,22 @@ +package com.shxy.xymanager_common.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigInteger; + +@Data +public class UserSession implements Serializable { + private BigInteger id; + + private String sessionId; + + private String userName; + + private String role; + + private BigInteger expireTime; + + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/exception/CustomException.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/exception/CustomException.java new file mode 100644 index 0000000..4feb834 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/exception/CustomException.java @@ -0,0 +1,43 @@ +package com.shxy.xymanager_common.exception; + +/** + * 自定义异常 + * + * @author ruoyi + */ +public class CustomException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + private Integer code; + + private String message; + + public CustomException(String message) + { + this.message = message; + } + + public CustomException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public CustomException(String message, Throwable e) + { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/exception/UserPasswordNotMatchException.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/exception/UserPasswordNotMatchException.java new file mode 100644 index 0000000..1966efc --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/exception/UserPasswordNotMatchException.java @@ -0,0 +1,48 @@ +package com.shxy.xymanager_common.exception; + + +/** + * @ClassName:UserPasswordNotMatchException + * @Description: 用户密码不正确或不符合规范异常类 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 10:07 PM + * @Version V1.0 + */ + +public class UserPasswordNotMatchException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + + private Integer code; + + private String message; + + public UserPasswordNotMatchException(String message) + { + this.message = message; + } + + public UserPasswordNotMatchException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public UserPasswordNotMatchException(String message, Throwable e) + { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/manager/AsyncManager.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/manager/AsyncManager.java new file mode 100644 index 0000000..e5a69b5 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/manager/AsyncManager.java @@ -0,0 +1,63 @@ +package com.shxy.xymanager_common.manager; + + + + +import com.shxy.xymanager_common.util.Threads; +import com.shxy.xymanager_common.util.spring.SpringUtils; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + + +/** + * @ClassName:AsyncManager + * @Description: 异步任务管理器 + * @Author: Arno_Fu + * @CreatTime:12/23/2019 - 10:05 AM + * @Version V1.0 + */ + +public class AsyncManager +{ + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/manager/factory/AsyncFactory.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/manager/factory/AsyncFactory.java new file mode 100644 index 0000000..3429451 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/manager/factory/AsyncFactory.java @@ -0,0 +1,76 @@ +package com.shxy.xymanager_common.manager.factory; + +import com.shxy.xymanager_common.constant.Constants; +import com.shxy.xymanager_common.model.SysLoginLog; +import com.shxy.xymanager_common.util.LogUtils; +import com.shxy.xymanager_common.util.ServletUtils; +import com.shxy.xymanager_common.util.ip.AddressUtils; +import com.shxy.xymanager_common.util.ip.IpUtils; +import eu.bitwalker.useragentutils.UserAgent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.TimerTask; + + +/** + * @ClassName:AsyncFactory + * @Description: 异步工厂(产生任务用) + * @Author: Arno_Fu + * @CreatTime:12/20/2019 - 5:03 PM + * @Version V1.0 + */ + +public class AsyncFactory { + private static final Logger sys_user_logger = LoggerFactory.getLogger( "sys-user" ); + + /** + * 记录登陆信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLoginLog(final String username, final String status, final String message, + final Object... args) { + final UserAgent userAgent = UserAgent.parseUserAgentString( ServletUtils.getRequest().getHeader( "User-Agent" ) ); + final String ip = IpUtils.getIpAddr( ServletUtils.getRequest() ); + return new TimerTask() { + @Override + public void run() { + String address = AddressUtils.getRealAddressByIP( ip ); + StringBuilder s = new StringBuilder(); + s.append( LogUtils.getBlock( ip ) ); + s.append( address ); + s.append( LogUtils.getBlock( username ) ); + s.append( LogUtils.getBlock( status ) ); + s.append( LogUtils.getBlock( message ) ); + // 打印信息到日志 + sys_user_logger.info( s.toString(), args ); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLoginLog logininfor = new SysLoginLog(); + logininfor.setUserName( username ); + logininfor.setIpaddr( ip ); + logininfor.setLoginLocation( address ); + logininfor.setBrowser( browser ); + logininfor.setOs( os ); + logininfor.setMsg( message ); + // 日志状态 + if (Constants.LOGIN_SUCCESS.equals( status ) || Constants.LOGOUT.equals( status )) { + logininfor.setStatus( Constants.SUCCESS ); + } else if (Constants.LOGIN_FAIL.equals( status )) { + logininfor.setStatus( Constants.FAIL ); + } + // 插入数据 +// SpringUtils.getBean( SysLoginLogService.class ).insertLoginLog( logininfor ); + } + }; + } + +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/model/SysLoginLog.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/model/SysLoginLog.java new file mode 100644 index 0000000..132c6fc --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/model/SysLoginLog.java @@ -0,0 +1,134 @@ +package com.shxy.xymanager_common.model; + +import java.util.Date; + + +/** + * @ClassName:SysLoginLog + * @Description: 字系统访问记录表 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 8:51 PM + * @Version V1.0 + */ + + +public class SysLoginLog{ + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long loginId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + public Long getLoginId() { + return loginId; + } + + public void setLoginId(Long loginId) { + this.loginId = loginId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Date getLoginTime() { + return loginTime; + } + + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } +} \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/security/LoginUser.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/security/LoginUser.java new file mode 100644 index 0000000..e4f4172 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/security/LoginUser.java @@ -0,0 +1,214 @@ +package com.shxy.xymanager_common.security; + + + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.shxy.xymanager_common.bean.SysUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.math.BigInteger; +import java.util.Collection; +import java.util.Set; + +/** + * @ClassName:LoginUser + * @Description: 登录用户身份权限 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 6:47 PM + * @Version V1.0 + */ + +public class LoginUser implements UserDetails { + + private static final long serialVersionUID = 1L; + + + /** + * 用户信息 + */ + private SysUser user; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登陆时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private BigInteger expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + private String sessionId; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 操作系统 + */ + private String dept; + + + public LoginUser() + { + } + + public LoginUser(SysUser user) + { + this.user = user; + } + + @JsonIgnore + @Override + public String getPassword() + { + return user.getPassword(); + } + + @Override + public String getUsername() + { + return user.getUserName(); + } + + public String getDept() { + return dept; + } + + public void setDept(String dept) { + this.dept = dept; + } + + public SysUser getUser() { + return user; + } + + public void setUser(SysUser user) { + this.user = user; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } + + public BigInteger getExpireTime() { + return expireTime; + } + + public void setExpireTime(BigInteger expireTime) { + this.expireTime = expireTime; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + @Override + public Collection getAuthorities() { + return null; + } + + + /** + * 账户是否过期 + * @return + */ + @JsonIgnore + @Override + public boolean isAccountNonExpired() { + return true; + } + + /** + * 是否禁用 + * @return + */ + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + } + + /** + * 密码是否过期 + * @return + */ + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + /** + * 是否启用 + * @return + */ + @JsonIgnore + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/security/componet/CustomAuthExceptionEntryPoint.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/security/componet/CustomAuthExceptionEntryPoint.java new file mode 100644 index 0000000..a5080b2 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/security/componet/CustomAuthExceptionEntryPoint.java @@ -0,0 +1,44 @@ +package com.shxy.xymanager_common.security.componet; + + +import com.alibaba.fastjson.JSON; +import com.shxy.xymanager_common.base.AjaxResult; +import com.shxy.xymanager_common.constant.HttpStatusCode; +import com.shxy.xymanager_common.util.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + + +/** + * @ClassName:CustomAuthExceptionEntryPoint + * @Description: 无效token异常类重写. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 6:20 PM + * @Version V1.0 + */ + +@Component +public class CustomAuthExceptionEntryPoint implements AuthenticationEntryPoint +{ + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) throws ServletException { + response.setStatus( HttpStatus.OK.value()); + response.setHeader("Content-Type", "application/json;charset=UTF-8"); + try { + String result = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + String msg = JSON.toJSONString( AjaxResult.error( HttpStatusCode.UNAUTHORIZED , result ) ); + response.getWriter().write( msg ); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/util/LogUtils.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/LogUtils.java new file mode 100644 index 0000000..1039613 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/LogUtils.java @@ -0,0 +1,22 @@ +package com.shxy.xymanager_common.util; + + +/** + * @ClassName:LogUtils + * @Description: 处理并记录日志文件 + * @Author: Arno_Fu + * @CreatTime:12/20/2019 - 5:06 PM + * @Version V1.0 + */ + +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/util/Md5.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/Md5.java new file mode 100644 index 0000000..e55e961 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/Md5.java @@ -0,0 +1,63 @@ +package com.shxy.xymanager_common.util; + +import org.springframework.util.DigestUtils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * @author Bobi_huo + * @date 2020-10-10 15:26 + */ +public class Md5 { + + private static final String[] STR_DIGITS = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; + + public Md5() { + } + + private static String byteToArrayString(byte bByte) { + int iRet = bByte; + if (bByte < 0) { + iRet = bByte + 256; + } + + int iD1 = iRet / 16; + int iD2 = iRet % 16; + return STR_DIGITS[iD1] + STR_DIGITS[iD2]; + } + + private static String byteToString(byte[] bByte) { + StringBuffer sBuffer = new StringBuffer(); + + for(int i = 0; i < bByte.length; ++i) { + sBuffer.append(byteToArrayString(bByte[i])); + } + + return sBuffer.toString().toUpperCase(); + } + + public static String getMD5Code(String strObj) { + String resultString = null; + + try { + new String(strObj); + MessageDigest md = MessageDigest.getInstance("MD5"); + resultString = byteToString(md.digest(strObj.getBytes())); + } catch (NoSuchAlgorithmException var3) { + var3.printStackTrace(); + } + + return resultString; + } + + + + + public static void main(String[] args) { +// System.out.println(getMD5Code("15500000000123456")); + + System.out.println(DigestUtils.md5DigestAsHex("123456".getBytes())); + } + +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/util/RsaUtils.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/RsaUtils.java new file mode 100644 index 0000000..2a13945 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/RsaUtils.java @@ -0,0 +1,186 @@ +package com.shxy.xymanager_common.util; + + + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + + +/** + * @ClassName:RsaUtils + * @Description: Rsa 工具类,公钥私钥生成,加解密 + * @Author: Arno_Fu + * @CreatTime:12/29/2020 - 11:36 AM + * @Version V1.0 + */ +public class RsaUtils { + + private static final String SRC = "123456"; + + public static void main(String[] args) throws Exception { + System.out.println("\n"); + RsaKeyPair keyPair = generateKeyPair(); + System.out.println("公钥:" + keyPair.getPublicKey()); + System.out.println("私钥:" + keyPair.getPrivateKey()); + System.out.println("\n"); + test1(keyPair); + System.out.println("\n"); + test2(keyPair); + System.out.println("\n"); + } + + /** + * 公钥加密私钥解密 + */ + private static void test1(RsaKeyPair keyPair) throws Exception { + System.out.println("***************** 公钥加密私钥解密开始 *****************"); + String text1 = encryptByPublicKey(keyPair.getPublicKey(), RsaUtils.SRC); + String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1); + System.out.println("加密前:" + RsaUtils.SRC); + System.out.println("加密后:" + text1); + System.out.println("解密后:" + text2); + if (RsaUtils.SRC.equals(text2)) { + System.out.println("解密字符串和原始字符串一致,解密成功"); + } else { + System.out.println("解密字符串和原始字符串不一致,解密失败"); + } + System.out.println("***************** 公钥加密私钥解密结束 *****************"); + } + + /** + * 私钥加密公钥解密 + * @throws Exception / + */ + private static void test2(RsaKeyPair keyPair) throws Exception { + System.out.println("***************** 私钥加密公钥解密开始 *****************"); + String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), RsaUtils.SRC); + String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1); + System.out.println("加密前:" + RsaUtils.SRC); + System.out.println("加密后:" + text1); + System.out.println("解密后:" + text2); + if (RsaUtils.SRC.equals(text2)) { + System.out.println("解密字符串和原始字符串一致,解密成功"); + } else { + System.out.println("解密字符串和原始字符串不一致,解密失败"); + } + System.out.println("***************** 私钥加密公钥解密结束 *****************"); + } + + /** + * 公钥解密 + * + * @param publicKeyText 公钥 + * @param text 待解密的信息 + * @return / + * @throws Exception / + */ + public static String decryptByPublicKey(String publicKeyText, String text) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + byte[] result = cipher.doFinal(Base64.decodeBase64(text)); + return new String(result); + } + + /** + * 私钥加密 + * + * @param privateKeyText 私钥 + * @param text 待加密的信息 + * @return / + * @throws Exception / + */ + public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + byte[] result = cipher.doFinal(text.getBytes()); + return Base64.encodeBase64String(result); + } + + /** + * 私钥解密 + * + * @param privateKeyText 私钥 + * @param text 待解密的文本 + * @return / + * @throws Exception / + */ + public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] result = cipher.doFinal(Base64.decodeBase64(text)); + return new String(result); + } + + /** + * 公钥加密 + * + * @param publicKeyText 公钥 + * @param text 待加密的文本 + * @return / + */ + public static String encryptByPublicKey(String publicKeyText, String text) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] result = cipher.doFinal(text.getBytes()); + return Base64.encodeBase64String(result); + } + + /** + * 构建RSA密钥对 + * + * @return / + * @throws NoSuchAlgorithmException / + */ + public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(1024); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); + String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded()); + String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); + return new RsaKeyPair(publicKeyString, privateKeyString); + } + + + /** + * RSA密钥对对象 + */ + public static class RsaKeyPair { + + private final String publicKey; + private final String privateKey; + + public RsaKeyPair(String publicKey, String privateKey) { + this.publicKey = publicKey; + this.privateKey = privateKey; + } + + public String getPublicKey() { + return publicKey; + } + + public String getPrivateKey() { + return privateKey; + } + + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/util/SecurityUtils.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/SecurityUtils.java new file mode 100644 index 0000000..8812c28 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/SecurityUtils.java @@ -0,0 +1,92 @@ +package com.shxy.xymanager_common.util; + + +import com.shxy.xymanager_common.security.LoginUser; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * @ClassName:SecurityUtils + * @Description: 安全服务工具类 + * @Author: Arno_Fu + * @CreatTime:12/19/2019 - 4:46 PM + * @Version V1.0 + */ + +public class SecurityUtils +{ + /** + * 获取用户账户 + **/ + public static String getUsername() + { + try + { + /* return getLoginUser().getUsername();*/ + } + catch (Exception e) + { + /* throw new CustomException("获取用户账户异常", HttpStatusCode.UNAUTHORIZED);*/ + } + return "!"; + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() throws Exception { + try + { + return (LoginUser) getAuthentication().getPrincipal(); + } + catch (Exception e) + { + throw new Exception("获取用户信息异常:",e.getCause()); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() + { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * @return 加密字符串 + */ + public static String encryptPassword(String password) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 判断密码是否相同 + * + * @param rawPassword 真实密码 + * @param encodedPassword 加密后字符 + * @return 结果 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/util/Threads.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/Threads.java new file mode 100644 index 0000000..21089b0 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/Threads.java @@ -0,0 +1,96 @@ +package com.shxy.xymanager_common.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.*; + +/** + * 线程相关工具类. + * + * @author ruoyi + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍人超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/util/http/HttpUtils.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/http/HttpUtils.java new file mode 100644 index 0000000..ecc37ef --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/util/http/HttpUtils.java @@ -0,0 +1,190 @@ +package com.shxy.xymanager_common.util.http; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.io.*; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.security.cert.X509Certificate; + + +/** + * @ClassName:HttpUtils + * @Description: 通用http发送方法 + * @Author: Arno_Fu + * @CreatTime:12/20/2019 - 5:05 PM + * @Version V1.0 + */ + +public class HttpUtils { + private static final Logger log = LoggerFactory.getLogger( HttpUtils.class ); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try { + String urlNameString = url + "?" + param; + log.info( "sendGet - {}", urlNameString ); + URL realUrl = new URL( urlNameString ); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty( "accept", "*/*" ); + connection.setRequestProperty( "connection", "Keep-Alive" ); + connection.setRequestProperty( "user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" ); + connection.connect(); + in = new BufferedReader( new InputStreamReader( connection.getInputStream() ) ); + String line; + while ((line = in.readLine()) != null) { + result.append( line ); + } + log.info( "recv - {}", result ); + } catch (ConnectException e) { + log.error( "调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e ); + } catch (SocketTimeoutException e) { + log.error( "调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e ); + } catch (IOException e) { + log.error( "调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e ); + } catch (Exception e) { + log.error( "调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e ); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception ex) { + log.error( "调用in.close Exception, url=" + url + ",param=" + param, ex ); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try { + String urlNameString = url + "?" + param; + log.info( "sendPost - {}", urlNameString ); + URL realUrl = new URL( urlNameString ); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty( "accept", "*/*" ); + conn.setRequestProperty( "connection", "Keep-Alive" ); + conn.setRequestProperty( "user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" ); + conn.setRequestProperty( "Accept-Charset", "utf-8" ); + conn.setRequestProperty( "contentType", "utf-8" ); + conn.setDoOutput( true ); + conn.setDoInput( true ); + out = new PrintWriter( conn.getOutputStream() ); + out.print( param ); + out.flush(); + in = new BufferedReader( new InputStreamReader( conn.getInputStream(), "utf-8" ) ); + String line; + while ((line = in.readLine()) != null) { + result.append( line ); + } + log.info( "recv - {}", result ); + } catch (ConnectException e) { + log.error( "调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e ); + } catch (SocketTimeoutException e) { + log.error( "调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e ); + } catch (IOException e) { + log.error( "调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e ); + } catch (Exception e) { + log.error( "调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e ); + } finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + log.error( "调用in.close Exception, url=" + url + ",param=" + param, ex ); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try { + log.info( "sendSSLPost - {}", urlNameString ); + SSLContext sc = SSLContext.getInstance( "SSL" ); + sc.init( null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom() ); + URL console = new URL( urlNameString ); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty( "accept", "*/*" ); + conn.setRequestProperty( "connection", "Keep-Alive" ); + conn.setRequestProperty( "user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" ); + conn.setRequestProperty( "Accept-Charset", "utf-8" ); + conn.setRequestProperty( "contentType", "utf-8" ); + conn.setDoOutput( true ); + conn.setDoInput( true ); + + conn.setSSLSocketFactory( sc.getSocketFactory() ); + conn.setHostnameVerifier( new TrustAnyHostnameVerifier() ); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader( new InputStreamReader( is ) ); + String ret = ""; + while ((ret = br.readLine()) != null) { + if (ret != null && !ret.trim().equals( "" )) { + result.append( new String( ret.getBytes( "ISO-8859-1" ), "utf-8" ) ); + } + } + log.info( "recv - {}", result ); + conn.disconnect(); + br.close(); + } catch (ConnectException e) { + log.error( "调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e ); + } catch (SocketTimeoutException e) { + log.error( "调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e ); + } catch (IOException e) { + log.error( "调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e ); + } catch (Exception e) { + log.error( "调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e ); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + } +} \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/vo/SysUserVo.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/vo/SysUserVo.java new file mode 100644 index 0000000..c9cceef --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/vo/SysUserVo.java @@ -0,0 +1,26 @@ +package com.shxy.xymanager_common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value = "用户对象", description = "用户对象描述") +public class SysUserVo { + + @NotNull(message = "用户名") + @ApiModelProperty(value = "用户名", example = "123455") + private String userName; + + @NotNull(message = "昵称") + @ApiModelProperty(value = "昵称", example = "123455") + private String nickName; + + @NotNull(message = "密码") + @ApiModelProperty(value = "密码", example = "123455") + private String password; + + +} diff --git a/xymanager_dao/src/main/java/com/shxy/xymanager_dao/dao/SysUserMapperDao.java b/xymanager_dao/src/main/java/com/shxy/xymanager_dao/dao/SysUserMapperDao.java new file mode 100644 index 0000000..4459a7a --- /dev/null +++ b/xymanager_dao/src/main/java/com/shxy/xymanager_dao/dao/SysUserMapperDao.java @@ -0,0 +1,94 @@ +package com.shxy.xymanager_dao.dao; + +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.entity.UserSession; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @ClassName:SysUserMapper + * @Description: 用户表 Mapper 接口. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 2:51 PM + * @Version V1.0 + */ + +@Mapper +public interface SysUserMapperDao { + + /** + * + * @Description 通过用户账户获取用户信息 + * @param userAccount + * @return com.chenxuan.entity.model.SysUser + */ + SysUser selectByUserAccount(@Param("userName") String userAccount); + + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + int checkUserNameUnique(@Param("userName") String userName); + + + int addUser(SysUser user); + + Boolean updateById(SysUser user); + + + + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + int resetUserPwd(@Param("userName") String userName, @Param("password") String password); + + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + + UserSession selectUserBySessionId(String sessionId); + + void insertUserSession(UserSession session); + + int updateUserSession(UserSession session); +} diff --git a/xymanager_dao/src/main/resources/mappers/SysUserMapperDao.xml b/xymanager_dao/src/main/resources/mappers/SysUserMapperDao.xml new file mode 100644 index 0000000..9d1832c --- /dev/null +++ b/xymanager_dao/src/main/resources/mappers/SysUserMapperDao.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + SELECT + user_id, + user_name, + `status` + FROM + sys_user u + + + + + + + + + + + + + + + + + update sys_user set password = #{password} where user_name = #{userName} + + + + insert into sys_user(user_name,nick_name,password) + values(#{userName},#{nickName},#{password}) + + + + + + update `sys_user_session` + + + expireTime = #{expireTime}, + + + where session_id = #{sessionId} + + + + + insert into sys_user_session (session_id, user_name,role,expire_time) + values (#{sessionId,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, #{ROLE,jdbcType=VARCHAR}, #{expireTime,jdbcType=INTEGER}) + + + \ No newline at end of file diff --git a/xymanager_service/pom.xml b/xymanager_service/pom.xml index 64e28a6..38e1265 100644 --- a/xymanager_service/pom.xml +++ b/xymanager_service/pom.xml @@ -26,6 +26,11 @@ com.shxy xymanager_dao + + io.jsonwebtoken + jjwt + 0.9.0 + diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomPermissionServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomPermissionServiceImpl.java new file mode 100644 index 0000000..1dadcdb --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomPermissionServiceImpl.java @@ -0,0 +1,44 @@ +package com.shxy.xymanager_service.impl; + +import com.shxy.xymanager_common.bean.SysUser; +import org.springframework.stereotype.Component; + +import java.util.Set; + + +/** + * @ClassName:CustomPermissionService + * @Description: 用户权限处理. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 8:30 PM + * @Version V1.0 + */ + +@Component +public class CustomPermissionServiceImpl { + + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(SysUser user) + { + + return null; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(SysUser user) + { + + return null; + } +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomUserDetailsServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomUserDetailsServiceImpl.java new file mode 100644 index 0000000..8b85779 --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/CustomUserDetailsServiceImpl.java @@ -0,0 +1,51 @@ +package com.shxy.xymanager_service.impl; + + +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.constant.UserStatus; +import com.shxy.xymanager_common.exception.base.BaseException; +import com.shxy.xymanager_common.security.LoginUser; +import com.shxy.xymanager_service.service.CustomPermissionService; +import com.shxy.xymanager_service.service.SysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.Set; + +/** + * @ClassName:CustomUserDetailsService + * @Description: 用户验证处理. + * @Author: CY + * @CreatTime:11/26/2019 - 5:34 PM + * @Version V1.0 + */ +@Slf4j +@Service + public class CustomUserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private SysUserService sysUserService; + + + @Override + public UserDetails loadUserByUsername(String userAccount) throws UsernameNotFoundException { + SysUser user = sysUserService.findByUserAccount( userAccount ); + if (null == user) { + log.info( "登录用户:{} 不存在.", userAccount ); + throw new UsernameNotFoundException( "登录用户:" + userAccount + " 不存在" ); + } else if (UserStatus.DISABLE.getCode().equals( user.getStatus() )) { + log.info( "登录用户:{} 已被停用.", userAccount ); + throw new BaseException( "对不起,您的账号:" + userAccount + " 已停用" ); + } + return createLoginUser( user ); + } + + public UserDetails createLoginUser(SysUser user) { + return new LoginUser( user); + } + +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LoginServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..776193f --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LoginServiceImpl.java @@ -0,0 +1,112 @@ +package com.shxy.xymanager_service.impl; + +import cn.hutool.core.date.DateTime; +import com.shxy.xymanager_common.bean.ServiceBody; +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.config.CustomRsaProperties; +import com.shxy.xymanager_common.constant.Constants; +import com.shxy.xymanager_common.constant.HttpStatusCode; +import com.shxy.xymanager_common.entity.UserSession; +import com.shxy.xymanager_common.exception.Asserts; +import com.shxy.xymanager_common.exception.UserPasswordNotMatchException; +import com.shxy.xymanager_common.manager.AsyncManager; +import com.shxy.xymanager_common.manager.factory.AsyncFactory; +import com.shxy.xymanager_common.security.LoginUser; +import com.shxy.xymanager_common.util.MyDateUtils; +import com.shxy.xymanager_common.util.RsaUtils; +import com.shxy.xymanager_common.util.StringUtils; +import com.shxy.xymanager_dao.dao.SysUserMapperDao; +import com.shxy.xymanager_service.service.LoginService; +import com.shxy.xymanager_service.service.SysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.math.BigInteger; +import java.util.HashSet; +import java.util.Set; + +/** + * 装置通道实现层 + */ +@Service +@Slf4j +public class LoginServiceImpl implements LoginService { + + + @Autowired + private SysUserService sysUserService; + + @Autowired + private SysUserMapperDao sysUserMapperDao; + + /** + * @param username 用户名 + * @param password 密码 + * @return java.lang.String + * @description 登录验证 + */ + public ServiceBody login(String username, String password) throws Exception { +// String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; +// String captcha = redisCacheService.getCacheObject(verifyKey); +// +// redisCacheService.deleteObject(verifyKey); +// if (captcha == null) { +// AsyncManager.me().execute(AsyncFactory.recordLoginLog(username, Constants.LOGIN_FAIL, "验证码错误")); +// throw new CustomException("验证码错误", HttpStatusCode.ERROR); +// } +// +// if (!code.equalsIgnoreCase(captcha)) { +// AsyncManager.me().execute(AsyncFactory.recordLoginLog(username, Constants.LOGIN_FAIL, "验证码错误")); +// throw new CustomException("验证码错误", HttpStatusCode.ERROR); +// } + // 生成token + return null; + } + + + /** + * + * @param username 账号 + * @param password 密码 + * @return + */ + public ServiceBody remoteLogin(String username, String password) throws Exception { + UserSession user = getLoginUser(username, password); + sysUserMapperDao.insertUserSession(user); + // 生成token + return Asserts.success(user.getSessionId()); + } + + /** + * 用户登录校验 + * + * @param username + * @param password + * @return + */ + public UserSession getLoginUser(String username, String password) throws Exception { + // 用户验证 + SysUser account = sysUserService.findByUserAccount(username); + // 判断用户是否存在 + if (StringUtils.isNull(account)) { + throw new UserPasswordNotMatchException("用户不存在", HttpStatusCode.ERROR); + } +// String userPassword = Md5.getMD5Code(account.getPasswordSalt() + password); +// String userPassword = Md5.getMD5Code(password); + // 密码解密 + String pwd = RsaUtils.decryptByPrivateKey( CustomRsaProperties.privateKey, account.getPassword() ); + // 密码对比 + if (!password.equals(pwd)) { + throw new UserPasswordNotMatchException("密码错误", HttpStatusCode.ERROR); + } + UserSession user = new UserSession(); +// loginUser.setPermissions(permissions); + user.setUserName(username); + user.setRole(account.getRole()); + BigInteger date = MyDateUtils.TimeMillSecond2Second(new DateTime()); + user.setExpireTime(date); + return user; + } +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LogoutSuccessHandlerImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LogoutSuccessHandlerImpl.java new file mode 100644 index 0000000..4284bda --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LogoutSuccessHandlerImpl.java @@ -0,0 +1,35 @@ +package com.shxy.xymanager_service.impl; + +import com.shxy.xymanager_common.security.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 自定义退出处理类 返回成功 + * + * @author ruoyi + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler +{ + + /** + * 退出处理 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException + { + + /*ServletUtils.renderString(response, JSON.toJSONString( AjaxResult.error( HttpStatusCode.SUCCESS, "退出成功")));*/ + } +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/SysUserServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..7493e79 --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/SysUserServiceImpl.java @@ -0,0 +1,176 @@ +package com.shxy.xymanager_service.impl; + + + +import com.shxy.xymanager_common.bean.ServiceBody; +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.config.CustomRsaProperties; +import com.shxy.xymanager_common.constant.UuidUtils; +import com.shxy.xymanager_common.entity.UserSession; +import com.shxy.xymanager_common.exception.Asserts; +import com.shxy.xymanager_common.util.Md5; +import com.shxy.xymanager_common.util.RsaUtils; +import com.shxy.xymanager_common.util.SecurityUtils; +import com.shxy.xymanager_common.vo.SysUserVo; +import com.shxy.xymanager_dao.dao.SysUserMapperDao; +import com.shxy.xymanager_service.service.SysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + + +/** + * @ClassName:SysUserServiceImpl + * @Description: * 用户信息表 服务实现类. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 3:26 PM + * @Version V1.0 + */ +@Service +@Component +@Slf4j +public class SysUserServiceImpl implements SysUserService { + + @Autowired + private SysUserMapperDao sysUserMapperDao; + + @Override + public SysUser findByUserAccount(String userAccount) { + return sysUserMapperDao.selectByUserAccount(userAccount); + } + + + + @Override + public Boolean checkUserNameUnique(String userName) { + return sysUserMapperDao.checkUserNameUnique(userName) > 0 ? false : true; + } + + + + @Override + public Integer insertUser(SysUser user) { + int flag = sysUserMapperDao.addUser(user); + if(flag>0) + { + Map map = new HashMap<>(); + map.put("userName",user.getUserName()); + map.put("password",user.getPassword()); + addUserRemote(map); + return flag; + } + return flag; + } + + + @Override + public SysUser selectUserById(Long userId) { + return sysUserMapperDao.selectUserById(userId); + } + + @Override + public ServiceBody addUser(SysUserVo vo) { + if (!this.checkUserNameUnique(vo.getUserName())) { + return Asserts.error("新增用户'" +vo.getUserName() + "'失败,登录账号已存在"); + } + SysUser sysUser = new SysUser(); + String userName = vo.getUserName(); + String nickName= userName; +// if(userName.length()>8) +// { +// nickName = userName.substring(0,7); +// } + sysUser.setUserName(userName); + sysUser.setNickName(nickName); + + try { + sysUser.setPassword(RsaUtils.encryptByPublicKey( CustomRsaProperties.publicKey,vo.getPassword())); + } catch (Exception e) { + log.error("密码转码失败:{}",e.getMessage()); + } + this.insertUser(sysUser); + return Asserts.success("新增成功"); + } + + + @Override + public void checkUserAllowed(SysUser user) { + + } + + @Override + public Boolean updateUser(SysUser user) { + return sysUserMapperDao.updateById(user); + + + } + + @Override + public Boolean updateUserStatus(SysUser user) { + return sysUserMapperDao.updateById(user); + } + + @Override + public Boolean updateUserProfile(SysUser user) { + return sysUserMapperDao.updateById(user); + } + + + @Override + public Boolean resetPwd(SysUser user) { + return sysUserMapperDao.updateById(user); + } + + @Override + public Boolean resetUserPwd(String userName, String password) { + int count = sysUserMapperDao.resetUserPwd(userName, password); + return count > 0 ? true : false; + } + + @Override + public int deleteUserById(Long userId) { + return 0; + } + + @Override + public int deleteUserByIds(Long[] userIds) { + for (Long userId : userIds) { + checkUserAllowed(new SysUser(userId)); + } + return sysUserMapperDao.deleteUserByIds(userIds); + } + + @Override + public UserSession selectUserById(String sessionId) { + UserSession session = sysUserMapperDao.selectUserBySessionId(sessionId); + return session; + } + + @Override + public int updateUserSession(UserSession user) { + int result = sysUserMapperDao.updateUserSession(user); + return result; + } + + public boolean addUserRemote(Map map) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)); + HttpEntity> httpEntity = new HttpEntity<>(map, httpHeaders); + /*ResponseEntity responseEntity = restTemplate.postForEntity(remoteUserAdd, httpEntity, + Object.class); + int code = responseEntity.getStatusCodeValue();*/ + int code = 200; + if(code ==200) + { + return true; + } + return false; + } +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomPermissionService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomPermissionService.java new file mode 100644 index 0000000..6605a40 --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomPermissionService.java @@ -0,0 +1,22 @@ +package com.shxy.xymanager_service.service; + +import com.shxy.xymanager_common.bean.SysUser; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Set; + +/** + * 线路接口 + * + * @author 晶晶 + */ +public interface CustomPermissionService { + + Set getRolePermission(SysUser user); + + Set getMenuPermission(SysUser user); + + + + +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomUserDetailsService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomUserDetailsService.java new file mode 100644 index 0000000..a76d6fd --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/CustomUserDetailsService.java @@ -0,0 +1,20 @@ +package com.shxy.xymanager_service.service; + +import com.shxy.xymanager_common.bean.SysUser; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * 线路接口 + * + * @author 晶晶 + */ +public interface CustomUserDetailsService { + + UserDetails loadUserByUsername(String userAccount); + + UserDetails createLoginUser(SysUser user); + + + + +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/LoginService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/LoginService.java new file mode 100644 index 0000000..2e17cb8 --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/LoginService.java @@ -0,0 +1,41 @@ +package com.shxy.xymanager_service.service; + + +import com.shxy.xymanager_common.bean.ServiceBody; +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.config.CustomRsaProperties; +import com.shxy.xymanager_common.constant.Constants; +import com.shxy.xymanager_common.constant.HttpStatusCode; +import com.shxy.xymanager_common.entity.UserSession; +import com.shxy.xymanager_common.exception.UserPasswordNotMatchException; +import com.shxy.xymanager_common.manager.AsyncManager; +import com.shxy.xymanager_common.manager.factory.AsyncFactory; +import com.shxy.xymanager_common.security.LoginUser; +import com.shxy.xymanager_common.util.RsaUtils; +import com.shxy.xymanager_common.util.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.util.HashSet; +import java.util.Set; + +/** + * @ClassName:LoginService + * @Description: 登录校验方法 + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 9:40 PM + * @Version V1.0 + */ + +public interface LoginService { + + ServiceBody login(String username, String password) throws Exception; + + ServiceBody remoteLogin(String username, String password) throws Exception; + + UserSession getLoginUser(String username, String password) throws Exception; + + + +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/SysUserService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/SysUserService.java new file mode 100644 index 0000000..e8f3d13 --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/SysUserService.java @@ -0,0 +1,128 @@ +package com.shxy.xymanager_service.service; + + +import com.shxy.xymanager_common.bean.ServiceBody; +import com.shxy.xymanager_common.bean.SysUser; +import com.shxy.xymanager_common.entity.UserSession; +import com.shxy.xymanager_common.vo.SysUserVo; + + +/** + * @ClassName:SysUserService + * @Description: 用户信息表 服务类. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 3:25 PM + * @Version V1.0 + */ +public interface SysUserService { + + /** + * @param userAccount + * @return com.chenxuan.entity.model.SysUser + * @Description 根据用户账户获取用户 + */ + SysUser findByUserAccount(String userAccount); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + SysUser selectUserById(Long userId); + + ServiceBody addUser(SysUserVo vo); + + + + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + Boolean checkUserNameUnique(String userName); + + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + void checkUserAllowed(SysUser user); + + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + Integer insertUser(SysUser user); + + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + Boolean updateUser(SysUser user); + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + Boolean updateUserStatus(SysUser user); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + Boolean updateUserProfile(SysUser user); + + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + Boolean resetPwd(SysUser user); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + Boolean resetUserPwd(String userName, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + int deleteUserByIds(Long[] userIds); + + + UserSession selectUserById(String sessionId); + + int updateUserSession(UserSession user); + +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/CustomSecurityConfig.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/CustomSecurityConfig.java new file mode 100644 index 0000000..2ecb87b --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/CustomSecurityConfig.java @@ -0,0 +1,113 @@ +package com.shxy.xymanager_service.service.security; + + +import com.shxy.xymanager_common.security.componet.CustomAuthExceptionEntryPoint; + +import com.shxy.xymanager_service.impl.CustomUserDetailsServiceImpl; +import com.shxy.xymanager_service.impl.LogoutSuccessHandlerImpl; +import lombok.extern.slf4j.Slf4j; +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.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + + +@Configuration +@EnableWebSecurity// 这个注解必须加,开启Security +@EnableGlobalMethodSecurity(prePostEnabled = true)//保证post之前的注解可以使用 +@Slf4j +public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private CustomAuthExceptionEntryPoint customAuthExceptionEntryPoint; + + @Autowired + private CustomUserDetailsServiceImpl customUserDetailsServiceImpl; + + @Autowired + private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; + /** + * 退出处理类 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + + + //先来这里认证一下 + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + log.info("213123123"); + auth.userDetailsService(customUserDetailsServiceImpl).passwordEncoder(passwordEncoderBean()); + } + + //拦截在这配 + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + log.info("123566"); + httpSecurity + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(customAuthExceptionEntryPoint).and() + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS).and() + // 过滤请求 + .authorizeRequests() + // 对于登录login 验证码captchaImage 允许匿名访问 + .antMatchers("/login", "/captchaImage").anonymous() + .antMatchers("*/api/addUser").anonymous() + .antMatchers("**/addUser").anonymous() + .antMatchers("/addUser").anonymous() + .antMatchers( + HttpMethod.GET, + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js" + ).permitAll() + .antMatchers("/profile/**").anonymous() + .antMatchers("/common/download**").anonymous() + .antMatchers("/swagger-ui.html").anonymous() + .antMatchers("/swagger-resources/**").anonymous() + .antMatchers("/webjars/**").anonymous() + .antMatchers("/*/api-docs").anonymous() + .antMatchers("/druid/**").anonymous() + .antMatchers("/test/**").anonymous() + .antMatchers( "/v3/**").anonymous() + .antMatchers( "/error").anonymous() +// .antMatchers("/**").anonymous() + .antMatchers("/api/**").anonymous() +// .antMatchers("/busiMainDeviceController/**").anonymous() + .antMatchers("/sysLoginRemoteController/**").anonymous() +// .antMatchers("/remote/**").anonymous() + .antMatchers("/userRemote/**").anonymous() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + + httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 添加JWT filter + httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + } + + @Bean + public PasswordEncoder passwordEncoderBean() { + return new BCryptPasswordEncoder(); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + +} \ No newline at end of file diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/JwtAuthenticationTokenFilter.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..9bf498b --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/security/JwtAuthenticationTokenFilter.java @@ -0,0 +1,64 @@ +package com.shxy.xymanager_service.service.security; + + +import com.shxy.xymanager_common.entity.UserSession; +import com.shxy.xymanager_common.security.LoginUser; +import com.shxy.xymanager_common.util.MyDateUtils; +import com.shxy.xymanager_common.util.SecurityUtils; +import com.shxy.xymanager_service.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigInteger; + +/** + * @ClassName:JwtAuthenticationTokenFilter + * @Description: token过滤器 验证token有效性. + * @Author: Arno_Fu + * @CreatTime:11/26/2019 - 6:34 PM + * @Version V1.0 + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + + @Autowired + private SysUserService sysUserService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + UserSession user = null; + if(null!= request.getSession().getAttribute("sessionId")) { + String sessionId = request.getSession().getAttribute("sessionId").toString(); + user = sysUserService.selectUserById(sessionId); + BigInteger expireTime = user.getExpireTime(); + + BigInteger currentTime = MyDateUtils.TimeSecond2MillSecond(System.currentTimeMillis()); + if (expireTime.subtract(currentTime).compareTo(BigInteger.valueOf(3600L)) > 0) { + user.setExpireTime(user.getExpireTime().add(new BigInteger(String.valueOf(30 * 1800)))); + sysUserService.updateUserSession(user); + } + } + + + + + if (null != user && null == SecurityUtils.getAuthentication()) + { + + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user, null,null); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + + chain.doFilter(request, response); + } +}