Browse Source

登录权限校验

feature/0725lihuilin
jihaipeng 4 weeks ago
parent
commit
8ae6d73fb8
  1. 12
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java
  2. 29
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodeDto.java
  3. 24
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodePageDto.java
  4. 26
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java
  5. 26
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LoginUserVo.java
  6. 50
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminIsLoginController.java
  7. 26
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminIsLoginMapper.java
  8. 27
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminIsLoginService.java
  9. 79
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminIsLoginServiceImpl.java
  10. 19
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  11. 3
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java
  12. 34
      lottery-system/lottery-service/src/main/java/com/lottery/config/WebConfig.java
  13. 51
      lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java
  14. 8
      lottery-system/lottery-service/src/main/resources/application.yml
  15. 21
      lottery-system/lottery-service/src/main/resources/mapper/admin/AdminIsLoginMapper.xml
  16. 0
      lottery-system/lottery-service/src/main/resources/mapper/api/AdminIsLoginMapper.xml

12
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java

@ -1,6 +1,12 @@
package com.lottery.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @program: lottery
@ -11,7 +17,13 @@ import lombok.Data;
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Slf4j
public class AdminLogin {
@NotNull(message = "用户名不能为空")
@Size(min = 8,max = 8,message = "用户名长度为8位")
private String username;
@NotNull(message = "密码不能为空")
private String password;
}

29
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodeDto.java

@ -0,0 +1,29 @@
package com.lottery.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/**
* @program: lottery-system
* @ClassName UserByJwcodeDto
* @description:
* @author:jihaipeng
* @create: 202507-22 11:51
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Slf4j
public class UserByJwcodeDto {
@NotNull(message = "jwcode不能为空")
@Size(min = 8, max = 8, message = "jwcode必须是8位")
@Pattern(regexp = "^\\d{8}$", message = "jwcode必须全是数字")
private String jwcode;
}

24
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodePageDto.java

@ -0,0 +1,24 @@
package com.lottery.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* @program: lottery-system
* @ClassName UserByJwcodePageDto
* @description:
* @author:jihaipeng
* @create: 202507-22 15:03
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Slf4j
public class UserByJwcodePageDto {
private String jwcode;
private int pageNum = 1;
private int pageSize = 10;
}

26
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java

@ -0,0 +1,26 @@
package com.lottery.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* @program: lottery-system
* @ClassName JwcodeTable
* @description:
* @author:jihaipeng
* @create: 202507-22 15:11
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("jwcode_table")
public class JwcodeTable {
private String jwcode;
private LocalDateTime createTime;
}

26
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LoginUserVo.java

@ -0,0 +1,26 @@
package com.lottery.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* @program: lottery-system
* @ClassName LoginUserVo
* @description:
* @author:jihaipeng
* @create: 202507-22 15:00
* @Version 1.0
**/
@Data
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public class LoginUserVo {
private String jwcode;
private LocalDateTime createTime;
}

50
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminIsLoginController.java

@ -0,0 +1,50 @@
package com.lottery.admin.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lottery.admin.service.AdminIsLoginService;
import com.lottery.dto.UserByJwcodeDto;
import com.lottery.dto.UserByJwcodePageDto;
import com.lottery.result.Result;
import com.lottery.vo.LoginUserVo;
import com.lottery.vo.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* @program: lottery-system
* @ClassName LoginController
* @description:
* @author:jihaipeng
* @create: 202507-22 11:15
* @Version 1.0
**/
@RestController
@RequestMapping("/admin/isLogin")
public class AdminIsLoginController {
@Autowired
private AdminIsLoginService adminIsLoginService;
//添加精网号
@RequestMapping("/addUser")
public Result<String> addUser(@RequestBody @Valid UserByJwcodeDto userDto) {
return adminIsLoginService.addUser(userDto.getJwcode());
}
//删除精网号
@RequestMapping("/deleteUser")
public Result<String> deleteUser(@RequestBody @Valid UserByJwcodeDto userDto) {
return adminIsLoginService.deleteUser(userDto.getJwcode());
}
//分页返回数据
@RequestMapping("/selectByJwcode")
public Result<PageInfo<LoginUserVo>> selectByJwcode(@RequestBody UserByJwcodePageDto userByJwcodePageDto) {
return adminIsLoginService.selectByJwcode(userByJwcodePageDto.getJwcode(), userByJwcodePageDto.getPageNum(), userByJwcodePageDto.getPageSize(),userByJwcodePageDto.getPageNum());
}
}

26
lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminIsLoginMapper.java

@ -0,0 +1,26 @@
package com.lottery.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lottery.entity.JwcodeTable;
import org.apache.ibatis.annotations.Mapper;
import java.time.LocalDateTime;
/**
* @program: lottery-system
* @ClassName AdminIsLoginMappper
* @description:
* @author:jihaipeng
* @create: 202507-22 14:09
* @Version 1.0
**/
@Mapper
public interface AdminIsLoginMapper extends BaseMapper<JwcodeTable> {
void addUser(String jwcode, LocalDateTime now);
Integer selectByJwcode(String jwcode);
int deleteUser(String jwcode);
}

27
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminIsLoginService.java

@ -0,0 +1,27 @@
package com.lottery.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lottery.entity.JwcodeTable;
import com.lottery.result.Result;
import com.lottery.vo.LoginUserVo;
import com.lottery.vo.PageInfo;
import org.apache.tomcat.Jar;
/**
* @program: lottery-system
* @ClassName AdminIsLoginService
* @description:
* @author:jihaipeng
* @create: 202507-22 11:32
* @Version 1.0
**/
public interface AdminIsLoginService extends IService<JwcodeTable> {
Result<String> addUser(String jwcode);
Result<String> deleteUser(String jwcode);
Result<PageInfo<LoginUserVo>> selectByJwcode(String jwcode, int pageNum, int pageSize, int pageNum1);
}

79
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminIsLoginServiceImpl.java

@ -0,0 +1,79 @@
package com.lottery.admin.service.Impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.admin.mapper.AdminIsLoginMapper;
import com.lottery.admin.service.AdminIsLoginService;
import com.lottery.entity.JwcodeTable;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.vo.LoginUserVo;
import com.lottery.vo.PageInfo;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
/**
* @program: lottery-system
* @ClassName AdminIsLoginServiceImpl
* @description:
* @author:jihaipeng
* @create: 202507-22 11:36
* @Version 1.0
**/
@Service
public class AdminIsLoginServiceImpl extends ServiceImpl<AdminIsLoginMapper, JwcodeTable> implements AdminIsLoginService {
@Autowired
private AdminIsLoginMapper adminIsLoginMappper;
@Override
public Result<String> addUser(String jwcode) {
Integer isLogin = adminIsLoginMappper.selectByJwcode(jwcode);
//检查一下是否已经添加过了
if(isLogin != null && isLogin > 0){
return Result.failure("该用户已经添加过了");
}
LocalDateTime now = LocalDateTime.now();
adminIsLoginMappper.addUser(jwcode,now);
return Result.success("添加成功");
}
@Override
public Result<String> deleteUser(String jwcode) {
Long total = adminIsLoginMappper.selectCount(null);
System.out.println(total);
if(total <= 1) {
return Result.failure("至少要保留一个用户");
}
int count = adminIsLoginMappper.deleteUser(jwcode);
if(count > 0){
return Result.success("删除成功");
}else {
return Result.failure("删除失败,可能该用户不存在");
}
}
@Override
public Result<PageInfo<LoginUserVo>> selectByJwcode(String jwcode, int pageNum, int pageSize, int pageNum1) {
Page<JwcodeTable> usePage = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<JwcodeTable> jwcodeTableLambdaQueryWrapper = new LambdaQueryWrapper<>();
if (jwcode != null){
jwcodeTableLambdaQueryWrapper.like(JwcodeTable::getJwcode, jwcode);
}
Page<JwcodeTable> jwcodeTablePage = adminIsLoginMappper.selectPage(usePage, jwcodeTableLambdaQueryWrapper);
List<JwcodeTable> records = jwcodeTablePage.getRecords();
List<LoginUserVo> loginUserVos = ConvertBeanUtil.convertList(records, LoginUserVo.class);
return Result.success(PageInfo.of(jwcodeTablePage, loginUserVos));
}
}

19
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.admin.controller.AdminUserController;
import com.lottery.admin.mapper.AdminIsLoginMapper;
import com.lottery.admin.mapper.AdminUserDetailMapper;
import com.lottery.admin.mapper.AdminUserMapper;
import com.lottery.admin.mapper.AdminWinMapper;
@ -26,11 +27,15 @@ import com.lottery.vo.UserVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.json.JSONObject;
import javax.persistence.criteria.CriteriaBuilder;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.lottery.utils.HttpUtils.postUrlencoded;
@ -50,14 +55,27 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
private AdminUserMapper adminUserMapper;
private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class);
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private AdminUserDetailMapper adminUserDetailMapper;
@Autowired
private AdminWinMapper adminWinMapper;
@Autowired
private AdminIsLoginMapper adminIsLoginMapper;
@Override
public Result<UserLoginVo> AdminUserlogin(AdminLogin adminLogin) {
//查看是否有权限
Integer isLogin = adminIsLoginMapper.selectByJwcode(adminLogin.getUsername());
if(isLogin == null || isLogin <= 0){
return Result.failure("用户无权限登录");
}
String token = "";
try {
// 1. 准备请求参数
@ -95,6 +113,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
UserLoginVo userLoginVo = new UserLoginVo();
userLoginVo.setUsername(adminLogin.getUsername());
userLoginVo.setToken(token);
redisTemplate.opsForValue().set( "token:"+token, adminLogin.getUsername(),24, TimeUnit.HOURS);
return Result.success(userLoginVo);
}

3
lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java

@ -174,6 +174,9 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
// 调用接口
String response = HttpUtils.postUrlencoded(url, params);
JsonNode rootNode = objectMapper.readTree(response);
if(rootNode.path("code").asInt() == 401){
return Result.failure("登录凭证错误");
}
// 提取 username
String username = rootNode.path("data").path("username").asText();
String jwcode = rootNode.path("data").path("jwcode").asText();

34
lottery-system/lottery-service/src/main/java/com/lottery/config/WebConfig.java

@ -0,0 +1,34 @@
package com.lottery.config;
import com.lottery.interceptor.AuthInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @program: lottery-system
* @ClassName WebConfig
* @description:
* @author:jihaipeng
* @create: 202507-22 16:46
* @Version 1.0
**/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns( // 放行不需要校验的路径
"/login", // 登录接口
"/swagger-ui/**", // Swagger 文档
"/v3/api-docs/**" // OpenAPI 文档
);
}
}

51
lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java

@ -0,0 +1,51 @@
package com.lottery.interceptor;
import com.lottery.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @program: lottery-system
* @ClassName AuthInterceptor
* @description:
* @author:jihaipeng
* @create: 202507-22 16:19
* @Version 1.0
**/
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 放行登录接口/login
if ("/admin/user/login".equals(request.getRequestURI())) {
return true;
}
// 2. 检查其他接口是否携带 Token
String token = request.getHeader("Token");
if (token == null || token.isEmpty()) {
throw new BusinessException(400,"登录缺失凭证,请重新登录");
}
// 3. 校验 Token 是否在 Redis 中存在
String redisKey = "token:" + token;
if (!Boolean.TRUE.equals(redisTemplate.hasKey(redisKey))) {
throw new BusinessException(400,"用户登录已失效,请重新登录");
}
// 4. Token 校验通过放行请求
return true;
}
}

8
lottery-system/lottery-service/src/main/resources/application.yml

@ -8,25 +8,19 @@ spring:
username: link
password: tEhdERkaGprEA7nT
driver-class-name: com.mysql.cj.jdbc.Driver
# hikari:
# pool-name: LotteryHikariCP
# maximum-pool-size: 10 # 连接池大小
# connection-timeout: 30000
hikari:
maximum-pool-size: 20 # 默认一般是 10,根据并发量调整
connection-timeout: 30000 # 连接超时时间(毫秒),默认 30s
idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟)
max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟)
leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s)
#
# ========== Redis 配置 ==========
redis:
host: 39.98.127.73
port: 7001
password: 2TOVfFeJ0pyi9Wtj
database: 0 # 默认DB索引
database: 1 # 默认DB索引
jedis:
pool:
max-active: 8 # 最大连接数

21
lottery-system/lottery-service/src/main/resources/mapper/admin/AdminIsLoginMapper.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lottery.admin.mapper.AdminIsLoginMapper">
<insert id="addUser">
INSERT INTO jwcode_table(jwcode,create_time) VALUES (#{jwcode},#{now})
</insert>
<delete id="deleteUser" parameterType="java.lang.String">
DELETE FROM jwcode_table WHERE jwcode = #{jwcode}
</delete>
<select id="selectByJwcode" resultType="java.lang.Integer" parameterType="java.lang.String">
SELECT
count(*)
FROM
jwcode_table
WHERE
jwcode = #{jwcode}
</select>
</mapper>

0
lottery-system/lottery-service/src/main/resources/mapper/api/userDetailMapper.xml → lottery-system/lottery-service/src/main/resources/mapper/api/AdminIsLoginMapper.xml

Loading…
Cancel
Save