v0.03 重构换分支
parent
7ef4e49890
commit
56e70736c9
80
pom.xml
80
pom.xml
|
|
@ -9,7 +9,7 @@
|
||||||
<relativePath/> <!-- lookup parent from repository -->
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.bruce</groupId>
|
<groupId>com.bruce</groupId>
|
||||||
<artifactId>SAMS</artifactId>
|
<artifactId>SAMS_O</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>SAMS</name>
|
<name>SAMS</name>
|
||||||
<description>SAMS</description>
|
<description>SAMS</description>
|
||||||
|
|
@ -39,73 +39,64 @@
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.baomidou</groupId>
|
|
||||||
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
|
|
||||||
<version>3.5.10.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.mysql</groupId>
|
|
||||||
<artifactId>mysql-connector-j</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.projectlombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.mybatis.spring.boot</groupId>
|
|
||||||
<artifactId>mybatis-spring-boot-starter-test</artifactId>
|
|
||||||
<version>3.0.4</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.security</groupId>
|
<groupId>org.springframework.security</groupId>
|
||||||
<artifactId>spring-security-test</artifactId>
|
<artifactId>spring-security-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- token &jwt 依赖 -->
|
<!-- boot 日志依赖-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.jsonwebtoken</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>jjwt-api</artifactId>
|
<artifactId>spring-boot-starter-logging</artifactId>
|
||||||
<version>0.11.5</version>
|
<version>3.4.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--MyBatis PLUS3-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.jsonwebtoken</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>jjwt-impl</artifactId>
|
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
|
||||||
<version>0.11.5</version>
|
<version>3.5.10.1</version>
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--MySQL驱动-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.jsonwebtoken</groupId>
|
<groupId>com.mysql</groupId>
|
||||||
<artifactId>jjwt-jackson</artifactId>
|
<artifactId>mysql-connector-j</artifactId>
|
||||||
<version>0.11.5</version>
|
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 日志系统依赖 -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>logback-core</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>1.5.16</version>
|
<version>1.18.36</version>
|
||||||
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--validation 依赖-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>spring-boot-starter-validation</artifactId>
|
||||||
<version>1.5.16</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--日志框架-->
|
|
||||||
|
<!-- jwt 依赖 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>jjwt</artifactId>
|
||||||
<version>2.0.16</version>
|
<version>0.12.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--fastjson-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.fastjson2</groupId>
|
||||||
|
<artifactId>fastjson2</artifactId>
|
||||||
|
<version>2.0.53</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
@ -120,6 +111,7 @@
|
||||||
<path>
|
<path>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.36</version>
|
||||||
</path>
|
</path>
|
||||||
</annotationProcessorPaths>
|
</annotationProcessorPaths>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
package com.bruce.sams.Config;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
||||||
import com.bruce.sams.Entity.SysRole;
|
|
||||||
import com.bruce.sams.Service.SysUserService;
|
|
||||||
import com.bruce.sams.Entity.SysUser;
|
|
||||||
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.builders.AuthenticationManagerBuilder;
|
|
||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
|
||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
||||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spring Secrutiy 配置类 提供密码验证和鉴权
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
public class SecurityConfig {
|
|
||||||
|
|
||||||
private final SysUserService userService;
|
|
||||||
|
|
||||||
public SecurityConfig(SysUserService userService) {
|
|
||||||
this.userService = userService;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 配置 AuthenticationManager,处理用户登录
|
|
||||||
@Bean
|
|
||||||
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
|
|
||||||
AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
|
|
||||||
authenticationManagerBuilder.userDetailsService(userDetailsService())
|
|
||||||
.passwordEncoder(passwordEncoder());
|
|
||||||
return authenticationManagerBuilder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 配置 UserDetailsService,用于从数据库加载用户信息
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public UserDetailsService userDetailsService() {
|
|
||||||
return username -> {
|
|
||||||
// 获取用户信息
|
|
||||||
SysUser user = userService.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName, username));
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
throw new UsernameNotFoundException("用户不存在");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取角色信息
|
|
||||||
SysRole role = userService.getRoleByUserId(user.getUserId()); // 假设你提供了这个方法来查询角色
|
|
||||||
|
|
||||||
if (role == null) {
|
|
||||||
throw new UsernameNotFoundException("用户角色不存在");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将角色添加为 ROLE_ 前缀
|
|
||||||
return org.springframework.security.core.userdetails.User
|
|
||||||
.withUsername(user.getUserName())
|
|
||||||
.password(user.getPasswd())
|
|
||||||
.roles("ROLE_" + role.getRoleKey()) // 根据角色的 role_key 设置角色,确保加上 ROLE_ 前缀
|
|
||||||
.build();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 配置密码加密方式
|
|
||||||
@Bean
|
|
||||||
public PasswordEncoder passwordEncoder() {
|
|
||||||
return new BCryptPasswordEncoder();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 配置 HttpSecurity,进行权限管理
|
|
||||||
@Bean
|
|
||||||
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
|
|
||||||
http
|
|
||||||
.authorizeHttpRequests(authz -> authz
|
|
||||||
.requestMatchers("/login", "/register").permitAll() // 登录和注册允许匿名访问
|
|
||||||
.requestMatchers("/admin/**").hasRole("ADMIN") // 只有 ADMIN 角色才能访问 /admin 路径
|
|
||||||
.requestMatchers("/user/**").hasRole("USER") // 只有 USER 角色才能访问 /user 路径
|
|
||||||
.anyRequest().authenticated() // 其他请求需要认证
|
|
||||||
)
|
|
||||||
.formLogin(form -> form
|
|
||||||
.loginPage("/login") // 登录页面
|
|
||||||
.permitAll()
|
|
||||||
)
|
|
||||||
.logout(logout -> logout
|
|
||||||
.permitAll()
|
|
||||||
);
|
|
||||||
|
|
||||||
return http.build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Controller;
|
package com.bruce.sams.Controller;
|
||||||
|
|
||||||
import com.bruce.sams.Service.SysLoginService;
|
import com.bruce.sams.service.SysLoginService;
|
||||||
import com.bruce.sams.Utils.AjaxResult;
|
import com.bruce.sams.Utils.AjaxResult;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
@ -19,7 +19,7 @@ public class LoginController {
|
||||||
* @param password 密码
|
* @param password 密码
|
||||||
* @return AjaxResult 包含登录状态和token
|
* @return AjaxResult 包含登录状态和token
|
||||||
*/
|
*/
|
||||||
@PostMapping
|
@PostMapping("/login")
|
||||||
public AjaxResult login(@RequestParam String schoolId, @RequestParam String password) {
|
public AjaxResult login(@RequestParam String schoolId, @RequestParam String password) {
|
||||||
try {
|
try {
|
||||||
// 调用登录服务,生成Token
|
// 调用登录服务,生成Token
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,15 @@
|
||||||
package com.bruce.sams.Controller;
|
package com.bruce.sams.Controller;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/user")
|
@RequestMapping("/user")
|
||||||
public class UserController {
|
public class UserController {
|
||||||
|
@GetMapping("/zhangsan")
|
||||||
|
public String show (){
|
||||||
|
return "这是张三";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,87 +1,74 @@
|
||||||
package com.bruce.sams.Utils;
|
package com.bruce.sams.Utils;
|
||||||
|
|
||||||
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.*;
|
||||||
import io.jsonwebtoken.Jwts;
|
|
||||||
import io.jsonwebtoken.SignatureAlgorithm;
|
|
||||||
import io.jsonwebtoken.security.Keys;
|
import io.jsonwebtoken.security.Keys;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.Key;
|
import java.security.Key;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class TokenUtil {
|
public class TokenUtil {
|
||||||
|
|
||||||
// 密钥,用于签名和验证Token
|
private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 需要一个256-bit的密钥
|
||||||
private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
|
private static final long EXPIRATION_TIME = 1000 * 60 * 60 * 10; // 10小时
|
||||||
|
|
||||||
// Token过期时间(单位:毫秒)
|
|
||||||
private static final long EXPIRATION_TIME = 3600000; // 1小时
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生成Token
|
// 生成Token
|
||||||
*
|
public static String generateToken(Long userId, Long roleId) {
|
||||||
* @param userId 用户ID
|
|
||||||
* @return 生成的Token
|
|
||||||
*/
|
|
||||||
public static String generateToken(String userId) {
|
|
||||||
Map<String, Object> claims = new HashMap<>();
|
Map<String, Object> claims = new HashMap<>();
|
||||||
claims.put("userId", userId); // 将用户ID放入Token的负载部分
|
claims.put("roleId", roleId); // 存储权限ID
|
||||||
|
|
||||||
return Jwts.builder()
|
return Jwts.builder()
|
||||||
.setClaims(claims) // 设置自定义信息
|
.setClaims(claims)
|
||||||
.setIssuedAt(new Date(System.currentTimeMillis())) // 设置签发时间
|
.setSubject(String.valueOf(userId)) // 用户ID
|
||||||
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
|
.setIssuedAt(new Date()) // 签发时间
|
||||||
.signWith(SECRET_KEY) // 使用密钥进行签名
|
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
|
||||||
.compact(); // 生成Token
|
.signWith(SECRET_KEY, SignatureAlgorithm.HS256) // 签名
|
||||||
|
.compact();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 验证Token
|
||||||
* 验证Token是否有效
|
|
||||||
*
|
|
||||||
* @param token Token字符串
|
|
||||||
* @return 是否有效
|
|
||||||
*/
|
|
||||||
public static boolean validateToken(String token) {
|
public static boolean validateToken(String token) {
|
||||||
try {
|
try {
|
||||||
Jwts.parserBuilder()
|
Jwts.parser().setSigningKey(SECRET_KEY).build().parseClaimsJws(token);
|
||||||
.setSigningKey(SECRET_KEY) // 设置密钥
|
return true;
|
||||||
.build()
|
} catch (JwtException | IllegalArgumentException e) {
|
||||||
.parseClaimsJws(token); // 解析Token
|
return false;
|
||||||
return true; // 如果没有异常,表示Token有效
|
|
||||||
} catch (Exception e) {
|
|
||||||
return false; // 如果解析失败,表示Token无效
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 提取用户ID
|
||||||
* 从Token中提取用户ID
|
public static Long extractUserId(String token) {
|
||||||
*
|
String userId = extractClaim(token, Claims::getSubject);
|
||||||
* @param token Token字符串
|
return userId != null ? Long.parseLong(userId) : null;
|
||||||
* @return 用户ID
|
|
||||||
*/
|
|
||||||
public static String getUserIdFromToken(String token) {
|
|
||||||
Claims claims = Jwts.parserBuilder()
|
|
||||||
.setSigningKey(SECRET_KEY) // 设置密钥
|
|
||||||
.build()
|
|
||||||
.parseClaimsJws(token) // 解析Token
|
|
||||||
.getBody();
|
|
||||||
return claims.get("userId", String.class); // 提取用户ID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 提取权限ID
|
||||||
* 获取Token的过期时间
|
public static Long extractRoleId(String token) {
|
||||||
*
|
Claims claims = extractAllClaims(token);
|
||||||
* @param token Token字符串
|
return claims.get("roleId", Long.class);
|
||||||
* @return 过期时间
|
}
|
||||||
*/
|
|
||||||
public static Date getExpirationDateFromToken(String token) {
|
// 提取过期时间
|
||||||
Claims claims = Jwts.parserBuilder()
|
public static Date extractExpiration(String token) {
|
||||||
.setSigningKey(SECRET_KEY) // 设置密钥
|
return extractClaim(token, Claims::getExpiration);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取单个Claim
|
||||||
|
private static <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
|
||||||
|
final Claims claims = extractAllClaims(token);
|
||||||
|
return claimsResolver.apply(claims);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析所有Claims
|
||||||
|
private static Claims extractAllClaims(String token) {
|
||||||
|
return Jwts.parserBuilder()
|
||||||
|
.setSigningKey(getSigningKey())
|
||||||
.build()
|
.build()
|
||||||
.parseClaimsJws(token) // 解析Token
|
.parseClaimsJws(token)
|
||||||
.getBody();
|
.getBody();
|
||||||
return claims.getExpiration(); // 获取Token的过期时间
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.bruce.sams.Entity;
|
package com.bruce.sams.domain;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.bruce.sams.Entity;
|
package com.bruce.sams.domain;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.bruce.sams.domain.entity;
|
||||||
|
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class UserDetail implements UserDetails {
|
||||||
|
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPassword() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsername() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAccountNonExpired() {
|
||||||
|
return UserDetails.super.isAccountNonExpired();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAccountNonLocked() {
|
||||||
|
return UserDetails.super.isAccountNonLocked();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCredentialsNonExpired() {
|
||||||
|
return UserDetails.super.isCredentialsNonExpired();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return UserDetails.super.isEnabled();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.bruce.sams.Exception;
|
package com.bruce.sams.exception;
|
||||||
|
|
||||||
public class CustomException extends RuntimeException {
|
public class CustomException extends RuntimeException {
|
||||||
public CustomException(String message) {
|
public CustomException(String message) {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Exception.User;
|
package com.bruce.sams.exception.user;
|
||||||
|
|
||||||
import com.bruce.sams.Exception.CustomException;
|
import com.bruce.sams.exception.CustomException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 密码错误异常
|
* 密码错误异常
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Exception.User;
|
package com.bruce.sams.exception.user;
|
||||||
|
|
||||||
import com.bruce.sams.Exception.CustomException;
|
import com.bruce.sams.exception.CustomException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 权限不足异常
|
* 权限不足异常
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Exception.User;
|
package com.bruce.sams.exception.user;
|
||||||
|
|
||||||
import com.bruce.sams.Exception.CustomException;
|
import com.bruce.sams.exception.CustomException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 无效输入异常
|
* 无效输入异常
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Exception.User;
|
package com.bruce.sams.exception.user;
|
||||||
|
|
||||||
import com.bruce.sams.Exception.CustomException;
|
import com.bruce.sams.exception.CustomException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户不存在
|
* 用户不存在
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Mapper;
|
package com.bruce.sams.mapper;
|
||||||
|
|
||||||
import com.bruce.sams.Entity.SysRole;
|
import com.bruce.sams.domain.SysRole;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Mapper;
|
package com.bruce.sams.mapper;
|
||||||
|
|
||||||
import com.bruce.sams.Entity.SysUser;
|
import com.bruce.sams.domain.SysUser;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.bruce.sams.Service;
|
package com.bruce.sams.service;
|
||||||
|
|
||||||
public interface SysLoginService {
|
public interface SysLoginService {
|
||||||
/**
|
/**
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bruce.sams.Service;
|
package com.bruce.sams.service;
|
||||||
|
|
||||||
import com.bruce.sams.Entity.SysRole;
|
import com.bruce.sams.domain.SysRole;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package com.bruce.sams.Service;
|
package com.bruce.sams.service;
|
||||||
|
|
||||||
import com.bruce.sams.Entity.SysRole;
|
import com.bruce.sams.domain.SysRole;
|
||||||
import com.bruce.sams.Entity.SysUser;
|
import com.bruce.sams.domain.SysUser;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1,20 +1,23 @@
|
||||||
package com.bruce.sams.Service.impl;
|
package com.bruce.sams.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.bruce.sams.Entity.SysUser;
|
import com.bruce.sams.domain.SysUser;
|
||||||
import com.bruce.sams.Exception.User.IncorrectPasswordException;
|
import com.bruce.sams.exception.user.IncorrectPasswordException;
|
||||||
import com.bruce.sams.Exception.User.UserNotFoundException;
|
import com.bruce.sams.exception.user.UserNotFoundException;
|
||||||
import com.bruce.sams.Utils.PasswordEncoder;
|
import com.bruce.sams.Utils.PasswordEncoder;
|
||||||
import com.bruce.sams.Utils.TokenUtil;
|
import com.bruce.sams.Utils.TokenUtil;
|
||||||
import com.bruce.sams.Mapper.SysUserMapper;
|
import com.bruce.sams.mapper.SysUserMapper;
|
||||||
import com.bruce.sams.Service.SysLoginService;
|
import com.bruce.sams.service.SysLoginService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
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 org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SysLoginServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
|
public class SysLoginServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
|
||||||
implements SysLoginService {
|
implements SysLoginService, UserDetailsService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PasswordEncoder passwordEncoder;
|
private PasswordEncoder passwordEncoder;
|
||||||
|
|
@ -46,4 +49,20 @@ public class SysLoginServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
|
||||||
return TokenUtil.generateToken(user.getUserId().toString());
|
return TokenUtil.generateToken(user.getUserId().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||||
|
// 查找用户
|
||||||
|
SysUser user = this.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName, username));
|
||||||
|
|
||||||
|
//如果用户不存在,抛出用户未找到异常
|
||||||
|
if (user == null) {
|
||||||
|
throw new UsernameNotFoundException("用户不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 登录成功,生成Token
|
||||||
|
|
||||||
|
// todo 返回UserDetail
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package com.bruce.sams.Service.impl;
|
package com.bruce.sams.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.bruce.sams.Entity.SysRole;
|
import com.bruce.sams.domain.SysRole;
|
||||||
import com.bruce.sams.Service.SysRoleService;
|
import com.bruce.sams.service.SysRoleService;
|
||||||
import com.bruce.sams.Mapper.SysRoleMapper;
|
import com.bruce.sams.mapper.SysRoleMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
package com.bruce.sams.Service.impl;
|
package com.bruce.sams.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.bruce.sams.Entity.SysRole;
|
import com.bruce.sams.domain.SysRole;
|
||||||
import com.bruce.sams.Entity.SysUser;
|
import com.bruce.sams.domain.SysUser;
|
||||||
import com.bruce.sams.Mapper.SysRoleMapper;
|
import com.bruce.sams.mapper.SysRoleMapper;
|
||||||
import com.bruce.sams.Utils.PasswordEncoder;
|
import com.bruce.sams.Utils.PasswordEncoder;
|
||||||
import com.bruce.sams.Service.SysUserService;
|
import com.bruce.sams.service.SysUserService;
|
||||||
import com.bruce.sams.Mapper.SysUserMapper;
|
import com.bruce.sams.mapper.SysUserMapper;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
@ -1,10 +1,26 @@
|
||||||
|
server:
|
||||||
|
port:
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: SAMS
|
name: SAMS
|
||||||
|
|
||||||
datasource:
|
datasource:
|
||||||
url: jdbc:mysql://localhost:3306/SAMS
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
url: jdbc:mysql://localhost:3306/SAMS_O
|
||||||
username: root
|
username: root
|
||||||
password: admin123
|
password: admin123
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
|
||||||
|
|
||||||
|
jackson:
|
||||||
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
|
time-zone: GMT+8
|
||||||
|
|
||||||
|
mybatis-plus:
|
||||||
|
configuration:
|
||||||
|
# MyBatis 配置
|
||||||
|
map-underscore-to-camel-case: true
|
||||||
|
global-config:
|
||||||
|
# 全局配置
|
||||||
|
db-config:
|
||||||
|
# 数据库配置
|
||||||
|
id-type: auto
|
||||||
|
mapper-locations: /mapper/*Mapper.xml
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,93 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<!--
|
<!-- 日志存放路径 -->
|
||||||
CONSOLE :表示当前的日志信息是可以输出到控制台的。
|
<property name="log.path" value="E:\Bruce\logs" />
|
||||||
-->
|
<!-- 日志输出格式 -->
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
|
||||||
<!--输出流对象 默认 System.out 改为 System.err-->
|
|
||||||
<target>System.out</target>
|
<!-- 控制台输出 -->
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
|
<pattern>${log.pattern}</pattern>
|
||||||
%msg:日志消息,%n是换行符-->
|
|
||||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
|
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!-- File是输出的方向通向文件的 -->
|
<!-- 系统日志输出 -->
|
||||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<encoder>
|
<file>${log.path}/sys-info.log</file>
|
||||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
<charset>utf-8</charset>
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
</encoder>
|
<!-- 日志文件名格式 -->
|
||||||
<!--日志输出路径-->
|
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
<file>/log/itheima-data.log</file>
|
<!-- 日志最大的历史 60天 -->
|
||||||
<!--指定日志文件拆分和压缩规则-->
|
<maxHistory>60</maxHistory>
|
||||||
<rollingPolicy
|
|
||||||
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
|
||||||
<!--通过指定压缩文件名称,来确定分割文件方式-->
|
|
||||||
<fileNamePattern>/log/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
|
|
||||||
<!--文件拆分大小-->
|
|
||||||
<maxFileSize>1MB</maxFileSize>
|
|
||||||
</rollingPolicy>
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<!-- 过滤的级别 -->
|
||||||
|
<level>INFO</level>
|
||||||
|
<!-- 匹配时的操作:接收(记录) -->
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!--
|
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/sys-error.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<!-- 过滤的级别 -->
|
||||||
|
<level>ERROR</level>
|
||||||
|
<!-- 匹配时的操作:接收(记录) -->
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
|
<!-- 用户访问日志输出 -->
|
||||||
, 默认debug
|
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
|
<file>${log.path}/sys-user.log</file>
|
||||||
-->
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
<root level="ALL">
|
<!-- 按天回滚 daily -->
|
||||||
<appender-ref ref="CONSOLE"/>
|
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
<appender-ref ref="FILE" />
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统模块日志级别控制 -->
|
||||||
|
<logger name="com.ruoyi" level="info" />
|
||||||
|
<!-- Spring日志级别控制 -->
|
||||||
|
<logger name="org.springframework" level="warn" />
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console" />
|
||||||
</root>
|
</root>
|
||||||
|
|
||||||
|
<!--系统操作日志-->
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="file_info" />
|
||||||
|
<appender-ref ref="file_error" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!--系统用户操作日志-->
|
||||||
|
<logger name="sys-user" level="info">
|
||||||
|
<appender-ref ref="sys-user"/>
|
||||||
|
</logger>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.bruce.sams.mapper.SysRoleMapper">
|
<mapper namespace="com.bruce.sams.mapper.SysRoleMapper">
|
||||||
|
|
||||||
<resultMap id="BaseResultMap" type="com.bruce.sams.Entity.SysRole">
|
<resultMap id="BaseResultMap" type="com.bruce.sams.domain.SysRole">
|
||||||
<id property="roleId" column="role_id" />
|
<id property="roleId" column="role_id" />
|
||||||
<result property="roleName" column="role_name" />
|
<result property="roleName" column="role_name" />
|
||||||
<result property="roleKey" column="role_key" />
|
<result property="roleKey" column="role_key" />
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.bruce.sams.mapper.SysUserMapper">
|
<mapper namespace="com.bruce.sams.mapper.SysUserMapper">
|
||||||
|
|
||||||
<resultMap id="BaseResultMap" type="com.bruce.sams.Entity.SysUser">
|
<resultMap id="BaseResultMap" type="com.bruce.sams.domain.SysUser">
|
||||||
<id property="userId" column="user_id" />
|
<id property="userId" column="user_id" />
|
||||||
<result property="roleId" column="role_id" />
|
<result property="roleId" column="role_id" />
|
||||||
<result property="nickName" column="nick_name" />
|
<result property="nickName" column="nick_name" />
|
||||||
Loading…
Reference in New Issue