diff --git a/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/PermissionMapper.java b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/PermissionMapper.java new file mode 100644 index 0000000..a23ad2b --- /dev/null +++ b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/PermissionMapper.java @@ -0,0 +1,9 @@ +package cn.nopj.chaos_api.mapper; + +import cn.nopj.chaos_api.domain.entity.Permission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PermissionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/RoleMapper.java b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/RoleMapper.java new file mode 100644 index 0000000..95b8e91 --- /dev/null +++ b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/RoleMapper.java @@ -0,0 +1,10 @@ +package cn.nopj.chaos_api.mapper; + +import cn.nopj.chaos_api.domain.entity.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RoleMapper extends BaseMapper { + +} diff --git a/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/UserMapper.java b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/UserMapper.java new file mode 100644 index 0000000..805d1aa --- /dev/null +++ b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/UserMapper.java @@ -0,0 +1,32 @@ +package cn.nopj.chaos_api.mapper; + +import cn.nopj.chaos_api.domain.entity.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface UserMapper extends BaseMapper { + /** + * 根据用户名查询用户的角色和权限信息 + * @param username 用户名 + * @return 权限编码列表 (包含角色和权限) + */ + @Select(""" + SELECT p.code FROM t_permission p + LEFT JOIN t_role_permission rp ON p.id = rp.permission_id + LEFT JOIN t_role r ON r.id = rp.role_id + LEFT JOIN t_user_role ur ON r.id = ur.role_id + LEFT JOIN t_user u ON u.id = ur.user_id + WHERE u.username = #{username} + UNION + SELECT r.code FROM t_role r + LEFT JOIN t_user_role ur ON r.id = ur.role_id + LEFT JOIN t_user u ON u.id = ur.user_id + WHERE u.username = #{username} + """) + List findAuthoritiesByUsername(@Param("username") String username); +} diff --git a/chaos_api_domain/pom.xml b/chaos_api_domain/pom.xml index 75c99b4..b503960 100644 --- a/chaos_api_domain/pom.xml +++ b/chaos_api_domain/pom.xml @@ -24,5 +24,10 @@ com.baomidou mybatis-plus + + org.projectlombok + lombok + provided + \ No newline at end of file diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Permission.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Permission.java new file mode 100644 index 0000000..bf5d57c --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Permission.java @@ -0,0 +1,14 @@ +package cn.nopj.chaos_api.domain.entity; + + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.io.Serializable; + +@Data +@TableName("t_permission") +public class Permission implements Serializable { + private Long id; + private String name; + private String code; +} \ No newline at end of file diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Role.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Role.java new file mode 100644 index 0000000..3f5f076 --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Role.java @@ -0,0 +1,13 @@ +package cn.nopj.chaos_api.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.io.Serializable; + +@Data +@TableName("t_role") +public class Role implements Serializable { + private Long id; + private String name; + private String code; +} diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/User.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/User.java new file mode 100644 index 0000000..4bf12d8 --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/User.java @@ -0,0 +1,21 @@ +package cn.nopj.chaos_api.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@TableName("t_user") +public class User implements Serializable { + private Long id; + private String username; + private String password; + private Boolean enabled; + private Boolean accountNonExpired; + private Boolean credentialsNonExpired; + private Boolean accountNonLocked; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/LoginRequest.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/LoginRequest.java new file mode 100644 index 0000000..76aa1ea --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/LoginRequest.java @@ -0,0 +1,12 @@ +package cn.nopj.chaos_api.dto; + +import lombok.Data; + +/** + * 登录请求参数 + */ +@Data +public class LoginRequest { + private String username; + private String password; +} diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/RegisterRequest.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/RegisterRequest.java new file mode 100644 index 0000000..b1f401d --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/RegisterRequest.java @@ -0,0 +1,12 @@ +package cn.nopj.chaos_api.dto; + +import lombok.Data; + +/** + * 注册请求参数 + */ +@Data +public class RegisterRequest { + private String username; + private String password; +} \ No newline at end of file diff --git a/chaos_api_web/pom.xml b/chaos_api_web/pom.xml index 8b342be..fca8464 100644 --- a/chaos_api_web/pom.xml +++ b/chaos_api_web/pom.xml @@ -36,10 +36,15 @@ chaos_api_common ${project.version} - + + cn.nopj + chaos_api_data + 1.0-SNAPSHOT + org.springframework.boot spring-boot-starter-web + org.springframework.boot @@ -49,12 +54,15 @@ org.springframework.boot spring-boot-starter-data-redis + - org.springframework.boot - spring-boot-starter-log4j2 + com.auth0 + java-jwt + + + ch.qos.logback + logback-classic - - @@ -63,6 +71,7 @@ org.springframework.boot spring-boot-maven-plugin + 2.7.0 diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/jwt/JwtAuthenticationTokenFilter.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/jwt/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..543773a --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/jwt/JwtAuthenticationTokenFilter.java @@ -0,0 +1,57 @@ +package cn.nopj.chaos_api.config.jwt; + +import cn.nopj.chaos_api.util.JwtTokenUtil; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +/** + * JWT 登录授权过滤器 + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + + @Autowired + private UserDetailsService userDetailsService; + @Autowired + private JwtTokenUtil jwtTokenUtil; + @Value("${jwt.tokenHeader}") + private String tokenHeader; + @Value("${jwt.tokenHead}") + private String tokenHead; + + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, + FilterChain chain) throws ServletException, IOException { + String authHeader = request.getHeader(this.tokenHeader); + if (authHeader != null && authHeader.startsWith(this.tokenHead)) { + String authToken = authHeader.substring(this.tokenHead.length()); + String username = jwtTokenUtil.getUsernameFromToken(authToken); + // 如果 Token 中有用户名但上下文中没有,说明是首次登录 + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); + // 验证 Token 是否有效 + if (jwtTokenUtil.validateToken(authToken, userDetails)) { + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + } + chain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/sec/SecurityConfig.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/sec/SecurityConfig.java index 59f53de..7566fec 100644 --- a/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/sec/SecurityConfig.java +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/config/sec/SecurityConfig.java @@ -1,11 +1,18 @@ package cn.nopj.chaos_api.config.sec; +import cn.nopj.chaos_api.config.jwt.JwtAuthenticationTokenFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; 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.configurers.AbstractHttpConfigurer; +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.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity @@ -14,18 +21,29 @@ public class SecurityConfig { private final RestAuthenticationEntryPoint restAuthenticationEntryPoint; private final RestfulAccessDeniedHandler restfulAccessDeniedHandler; - public SecurityConfig(RestAuthenticationEntryPoint restAuthenticationEntryPoint, RestfulAccessDeniedHandler restfulAccessDeniedHandler) { + public SecurityConfig(RestAuthenticationEntryPoint restAuthenticationEntryPoint, RestfulAccessDeniedHandler restfulAccessDeniedHandler, JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter) { this.restAuthenticationEntryPoint = restAuthenticationEntryPoint; this.restfulAccessDeniedHandler = restfulAccessDeniedHandler; + this.jwtAuthenticationTokenFilter = jwtAuthenticationTokenFilter; + } + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + private final JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth // 允许所有对 /api/public/** 的匿名访问 - .requestMatchers("/api/public/**").permitAll() - // 其他所有请求都需要认证 + .requestMatchers("/api/auth/login","/api/auth/register").permitAll() .anyRequest().authenticated() ) // 禁用 CSRF,因为现代前后端分离项目通常使用 Token @@ -34,6 +52,7 @@ public class SecurityConfig { .authenticationEntryPoint(restAuthenticationEntryPoint) .accessDeniedHandler(restfulAccessDeniedHandler)) ; + http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java new file mode 100644 index 0000000..edbcb1d --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java @@ -0,0 +1,45 @@ +package cn.nopj.chaos_api.controller; + +import cn.nopj.chaos_api.dto.LoginRequest; +import cn.nopj.chaos_api.dto.RegisterRequest; +import cn.nopj.chaos_api.model.ApiResult; +import cn.nopj.chaos_api.service.AuthService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/api/auth") +public class AuthController { + + @Autowired + private AuthService authService; + @Value("${jwt.tokenHead}") + private String tokenHead; + + @PostMapping("/register") + public ApiResult register(@RequestBody RegisterRequest registerRequest) { + if (authService.register(registerRequest) != null) { + return ApiResult.success("注册成功"); + } + return ApiResult.failed("用户名已存在"); + } + + @PostMapping("/login") + public ApiResult login(@RequestBody LoginRequest loginRequest) { + String token = authService.login(loginRequest.getUsername(), loginRequest.getPassword()); + if (token == null) { + return ApiResult.failed("用户名或密码错误"); + } + Map tokenMap = new HashMap<>(); + tokenMap.put("token", token); + tokenMap.put("tokenHead", tokenHead); + return ApiResult.success(tokenMap); + } +} diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/AuthService.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/AuthService.java new file mode 100644 index 0000000..d94c502 --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/AuthService.java @@ -0,0 +1,17 @@ +package cn.nopj.chaos_api.service; + +import cn.nopj.chaos_api.domain.entity.User; +import cn.nopj.chaos_api.dto.RegisterRequest; + +public interface AuthService { + /** + * 注册 + */ + User register(RegisterRequest registerRequest); + + /** + * 登录 + * @return 生成的 JWT token + */ + String login(String username, String password); +} diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/impl/AuthServiceImpl.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/impl/AuthServiceImpl.java new file mode 100644 index 0000000..903bedc --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/impl/AuthServiceImpl.java @@ -0,0 +1,59 @@ +package cn.nopj.chaos_api.service.impl; + + + +import cn.nopj.chaos_api.domain.entity.User; +import cn.nopj.chaos_api.dto.RegisterRequest; +import cn.nopj.chaos_api.mapper.UserMapper; +import cn.nopj.chaos_api.service.AuthService; +import cn.nopj.chaos_api.util.JwtTokenUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class AuthServiceImpl implements AuthService { + + @Autowired + private UserMapper userMapper; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private JwtTokenUtil jwtTokenUtil; + @Autowired + private AuthenticationManager authenticationManager; + + @Override + public User register(RegisterRequest registerRequest) { + // 检查用户名是否已存在 + if (userMapper.selectOne(new QueryWrapper().eq("username", registerRequest.getUsername())) != null) { + // 在实际项目中,这里应该抛出自定义异常 + return null; + } + User user = new User(); + user.setUsername(registerRequest.getUsername()); + // 使用 BCrypt 加密密码 + user.setPassword(passwordEncoder.encode(registerRequest.getPassword())); + userMapper.insert(user); + // 你可以在这里为新用户分配默认角色 + return user; + } + + @Override + public String login(String username, String password) { + // 使用 Spring Security 的 AuthenticationManager 进行用户认证 + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(username, password) + ); + SecurityContextHolder.getContext().setAuthentication(authentication); + UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + // 生成 JWT + return jwtTokenUtil.generateToken(userDetails); + } +} \ No newline at end of file diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/impl/UserDetailsServiceImpl.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/impl/UserDetailsServiceImpl.java new file mode 100644 index 0000000..b5d31dc --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/service/impl/UserDetailsServiceImpl.java @@ -0,0 +1,49 @@ +package cn.nopj.chaos_api.service.impl; + +import cn.nopj.chaos_api.domain.entity.User; +import cn.nopj.chaos_api.mapper.UserMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + UserMapper userMapper; + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // 1. 从数据库查询用户 + User user = userMapper.selectOne(new QueryWrapper().eq("username", username)); + if (user == null) { + throw new UsernameNotFoundException("用户不存在"); + } + + // 2. 查询该用户的权限信息 (角色 + 权限) + List authorities = userMapper.findAuthoritiesByUsername(username); + + // 3. 将权限字符串列表转换为 GrantedAuthority 集合 + List grantedAuthorities = authorities.stream() + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + // 4. 构建并返回 Spring Security 的 User 对象 + return new org.springframework.security.core.userdetails.User( + user.getUsername(), + user.getPassword(), + user.getEnabled(), + user.getAccountNonExpired(), + user.getCredentialsNonExpired(), + user.getAccountNonLocked(), + grantedAuthorities + ); + } +} diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/util/JwtTokenUtil.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/util/JwtTokenUtil.java new file mode 100644 index 0000000..5dda5fc --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/util/JwtTokenUtil.java @@ -0,0 +1,84 @@ +package cn.nopj.chaos_api.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; +import jakarta.annotation.PostConstruct; +import org.springframework.stereotype.Component; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Date; + + +@Component +public class JwtTokenUtil { + + + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiration}") + private Long expiration; + + private Algorithm algorithm; + private JWTVerifier verifier; + + @PostConstruct + public void init() { + // 在bean初始化后,根据 secret 创建算法实例和验证器 + this.algorithm = Algorithm.HMAC512(secret); + this.verifier = JWT.require(algorithm).build(); + } + + /** + * 从 Token 中获取用户名 + */ + public String getUsernameFromToken(String token) { + try { + DecodedJWT jwt = verifier.verify(token); + return jwt.getSubject(); + } catch (Exception e) { + return null; + } + } + + /** + * 验证 Token 是否有效 + */ + public boolean validateToken(String token, UserDetails userDetails) { + try { + String username = getUsernameFromToken(token); + return username != null && username.equals(userDetails.getUsername()) && !isTokenExpired(token); + } catch (Exception e) { + return false; + } + } + + /** + * 生成 Token + */ + public String generateToken(UserDetails userDetails) { + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + expiration * 1000); + + return JWT.create() + .withSubject(userDetails.getUsername()) + .withIssuedAt(now) + .withExpiresAt(expiryDate) + .sign(algorithm); + } + + private boolean isTokenExpired(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getExpiresAt().before(new Date()); + } catch (Exception e) { + // 如果解析失败,也认为它已过期或无效 + return true; + } + } + +} diff --git a/chaos_api_web/src/main/resources/application.yaml b/chaos_api_web/src/main/resources/application.yaml index 083374b..3953669 100644 --- a/chaos_api_web/src/main/resources/application.yaml +++ b/chaos_api_web/src/main/resources/application.yaml @@ -26,3 +26,8 @@ mybatis-plus: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +jwt: + tokenHeader: Authorization + tokenHead: Chaos + secret: zHANgcHao@1995!20250506 + expiration: 604800 \ No newline at end of file diff --git a/chaos_api_web/src/main/resources/log4j2-spring.xml b/chaos_api_web/src/main/resources/log4j2-spring.xml deleted file mode 100644 index 8b40a90..0000000 --- a/chaos_api_web/src/main/resources/log4j2-spring.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index db0c111..bec3636 100644 --- a/pom.xml +++ b/pom.xml @@ -51,18 +51,7 @@ spring-boot-starter-data-redis 3.5.3 - - - - - - - - - org.springframework.boot - spring-boot-starter-log4j2 - 3.5.3 - + org.springframework.boot @@ -113,6 +102,24 @@ lombok 1.18.38 + + + com.auth0 + java-jwt + 4.5.0 + + + org.springframework.boot + spring-boot-maven-plugin + 3.5.3 + + + + ch.qos.logback + logback-classic + 1.5.18 + + \ No newline at end of file