Sfoglia il codice sorgente

feat: "完成Spring Security登陆和注册认证"

Leonezhurui 2 anni fa
parent
commit
63428def14

+ 12 - 0
pom.xml

@@ -87,6 +87,18 @@
             <artifactId>jjwt-api</artifactId>
             <version>0.12.5</version>
         </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>0.12.5</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <version>0.12.5</version>
+            <scope>runtime</scope>
+        </dependency>
 
 
     </dependencies>

+ 2 - 1
src/main/java/com/njuzr/eaibackend/config/SecurityConfig.java

@@ -45,7 +45,8 @@ public class SecurityConfig {
         http
                 .authorizeHttpRequests(authorize -> authorize
 //                                .anyRequest().permitAll() // 允许所有的请求访问
-                        .requestMatchers("/api/public/**").permitAll() // 允许公开访问的路径
+                        .requestMatchers("/api/user/login").permitAll() // 允许公开访问的路径
+                                .requestMatchers("/api/user/register").permitAll()
                         .anyRequest().authenticated() // 其他所有请求需要认证
                 )
                 .exceptionHandling(exception -> exception

+ 90 - 54
src/main/java/com/njuzr/eaibackend/controller/AuthenticationController.java

@@ -1,54 +1,90 @@
-//package com.njuzr.eaibackend.controller;
-//
-//import com.njuzr.eaibackend.vo.UserLoginVO;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.http.HttpStatus;
-//import org.springframework.security.authentication.AuthenticationManager;
-//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-//import org.springframework.security.core.Authentication;
-//import org.springframework.security.core.AuthenticationException;
-//import org.springframework.security.core.context.SecurityContextHolder;
-//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;
-//
-///**
-// * @author: Leonezhurui
-// * @Date: 2024/2/20 - 00:10
-// * @Package: EAI-Backend
-// */
-//
-//@RestController
-//@RequestMapping("/api/login")
-//public class AuthenticationController {
-//
-//    private final AuthenticationManager authenticationManager;
-//
-//    @Autowired
-//    public AuthenticationController(AuthenticationManager authenticationManager) {
-//        this.authenticationManager = authenticationManager;
-//    }
-//
-//    @PostMapping("/login")
-//    public MyResponse login(@RequestBody UserLoginVO userLoginVO) {
-//        try {
-//            Authentication authentication = authenticationManager.authenticate(
-//                    new UsernamePasswordAuthenticationToken(
-//                            userLoginVO.getOfficialEmail(),
-//                            userLoginVO.getPassword()
-//                    )
-//            );
-//
-//            SecurityContextHolder.getContext().setAuthentication(authentication);
-//
-//            // TODO 生成JWT
-//            String jwt = jwtTokenUtil.generateToken(authentication);
-//            return MyResponse.success({});
-//        } catch (AuthenticationException e) {
-//            return MyResponse.error(HttpStatus.UNAUTHORIZED.value(), "Error: Authentication failed");
-//        }
-//
-//    }
-//
-//}
+package com.njuzr.eaibackend.controller;
+
+import com.njuzr.eaibackend.dto.UserLoginDTO;
+import com.njuzr.eaibackend.dto.UserRegisterDTO;
+import com.njuzr.eaibackend.exception.MyException;
+import com.njuzr.eaibackend.po.MyUserDetails;
+import com.njuzr.eaibackend.service.UserService;
+import com.njuzr.eaibackend.utils.JWTTokenUtil;
+import com.njuzr.eaibackend.utils.ModelMapperUtil;
+import com.njuzr.eaibackend.vo.UserLoginVO;
+import com.njuzr.eaibackend.vo.UserVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.context.SecurityContextHolder;
+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;
+
+/**
+ * @author: Leonezhurui
+ * @Date: 2024/2/20 - 00:10
+ * @Package: EAI-Backend
+ */
+
+@Slf4j
+@RestController
+@RequestMapping("/api/user")
+public class AuthenticationController {
+
+    private final AuthenticationManager authenticationManager;
+    private final UserService userService;
+
+    private final JWTTokenUtil jwtTokenUtil;
+
+    @Autowired
+    public AuthenticationController(AuthenticationManager authenticationManager, UserService userService, JWTTokenUtil jwtTokenUtil) {
+        this.authenticationManager = authenticationManager;
+        this.userService = userService;
+        this.jwtTokenUtil = jwtTokenUtil;
+    }
+
+    @PostMapping("/login")
+    public MyResponse login(@RequestBody UserLoginDTO userLoginDTO) {
+        try {
+            // 用户登陆学号和密码进行登陆
+            Authentication authentication = authenticationManager.authenticate(
+                    new UsernamePasswordAuthenticationToken(
+                            userLoginDTO.getOfficialNumber(),
+                            userLoginDTO.getPassword()
+                    )
+            );
+
+            SecurityContextHolder.getContext().setAuthentication(authentication);
+            MyUserDetails userDetails = (MyUserDetails) authentication.getPrincipal();
+
+            log.info("用户认证通过,用户认证信息如下:"+userDetails.toString());
+
+            String jwt = jwtTokenUtil.generateToken(userDetails.getOfficialNumber());
+            log.info("生成jwt成功,token信息:"+jwt);
+
+            UserLoginVO userLoginVO = ModelMapperUtil.map(userDetails, UserLoginVO.class);
+            userLoginVO.setToken(jwt);
+            return MyResponse.success(userLoginVO);
+        } catch (AuthenticationException e) {
+            return MyResponse.error(HttpStatus.UNAUTHORIZED.value(), "Error: Authentication failed"+e.getMessage());
+        }
+    }
+
+
+    @PostMapping("/register")
+    public MyResponse createUser(@RequestBody UserRegisterDTO userRegisterDTO) {
+        log.info("createUser - 用户数据:"+userRegisterDTO.toString()); // 解析前端传递的数据
+
+        try {
+            UserVO userVO = userService.createUser(userRegisterDTO);
+            return MyResponse.success(userVO);
+        } catch (MyException e) {
+            return MyResponse.error(501, e.getMessage());
+        } catch (Exception e) {
+            return MyResponse.error(501, "创建用户失败");
+        }
+    }
+
+}

+ 19 - 42
src/main/java/com/njuzr/eaibackend/controller/UserController.java

@@ -5,14 +5,9 @@ import com.njuzr.eaibackend.dto.UserRegisterDTO;
 import com.njuzr.eaibackend.exception.MyException;
 import com.njuzr.eaibackend.service.UserService;
 import com.njuzr.eaibackend.utils.ModelMapperUtil;
-import com.njuzr.eaibackend.vo.UserLoginVO;
-import com.njuzr.eaibackend.vo.UserRegisterVO;
 import com.njuzr.eaibackend.vo.UserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -33,43 +28,25 @@ public class UserController {
         this.userService = userService;
     }
 
-    @PostMapping("/register")
-    public MyResponse createUser(@RequestBody UserRegisterVO userRegisterVO) {
-        log.info("createUser - 参数解析:"+userRegisterVO.toString());
 
-        UserRegisterDTO userRegisterDTO = ModelMapperUtil.map(userRegisterVO, UserRegisterDTO.class);
 
-        UserDTO retUser;
-        try {
-            retUser = userService.createUser(userRegisterDTO);
-        } catch (MyException e) {
-            return MyResponse.error(501, e.getMessage());
-        } catch (Exception e) {
-            return MyResponse.error(501, "创建用户失败");
-        }
-
-        UserVO userVO = ModelMapperUtil.map(retUser, UserVO.class);
-
-        return MyResponse.success(userVO);
-    }
-
-    @PostMapping("/login")
-    public MyResponse login(@RequestBody UserLoginVO userLoginVO) {
-        try {
-            Authentication authentication = authenticationManager.authenticate(
-                    new UsernamePasswordAuthenticationToken(
-                            userLoginVO.getOfficialEmail(),
-                            userLoginVO.getPassword()
-                    )
-            );
-
-            SecurityContextHolder.getContext().setAuthentication(authentication);
-
-            String jwt = jwtTokenUtil.generateToken(authentication);
-            return ResponseEntity.ok(new JwtResponse(jwt));
-        } catch (AuthenticationException e) {
-            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Error: Authentication failed");
-        }
-
-    }
+//    @PostMapping("/login")
+//    public MyResponse login(@RequestBody UserLoginVO userLoginVO) {
+//        try {
+//            Authentication authentication = authenticationManager.authenticate(
+//                    new UsernamePasswordAuthenticationToken(
+//                            userLoginVO.getOfficialEmail(),
+//                            userLoginVO.getPassword()
+//                    )
+//            );
+//
+//            SecurityContextHolder.getContext().setAuthentication(authentication);
+//
+//            String jwt = jwtTokenUtil.generateToken(authentication);
+//            return ResponseEntity.ok(new JwtResponse(jwt));
+//        } catch (AuthenticationException e) {
+//            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Error: Authentication failed");
+//        }
+//
+//    }
 }

+ 1 - 2
src/main/java/com/njuzr/eaibackend/dto/UserDTO.java

@@ -15,6 +15,5 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 @Data
-public class UserDTO extends BaseUser{
-    private Long id; // User唯一标识(自增)
+public class UserDTO extends BaseUser{ // 用户更新,前传后(需要登陆)
 }

+ 15 - 0
src/main/java/com/njuzr/eaibackend/dto/UserLoginDTO.java

@@ -0,0 +1,15 @@
+package com.njuzr.eaibackend.dto;
+
+import lombok.Data;
+
+/**
+ * @author: Leonezhurui
+ * @Date: 2024/2/20 - 12:40
+ * @Package: EAI-Backend
+ */
+
+@Data
+public class UserLoginDTO { //用户登陆,只需要传递学号和密码
+    private String officialNumber;
+    private String password;
+}

+ 11 - 4
src/main/java/com/njuzr/eaibackend/dto/UserRegisterDTO.java

@@ -1,5 +1,6 @@
 package com.njuzr.eaibackend.dto;
 
+import com.njuzr.eaibackend.enums.Role;
 import com.njuzr.eaibackend.po.base.BaseUser;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -12,9 +13,15 @@ import lombok.ToString;
  * @Package: EAI-Backend
  */
 
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
 @Data
-public class UserRegisterDTO extends BaseUser{
-    private String password;
+public class UserRegisterDTO { // 用户注册,前传后
+    private String name; // 真实姓名(必填)
+
+    private String password;  // 密码(加密存储)(必填)
+
+    private String officialEmail; // 南大官邮,xxx@smail.nju.edu.cn(必填)
+
+    private String officialNumber; // 南大学号、工号(必填)
+
+    private Role role; // 用户角色:学生、教师、管理员(必填)
 }

+ 3 - 0
src/main/java/com/njuzr/eaibackend/mapper/UserMapper.java

@@ -3,6 +3,7 @@ package com.njuzr.eaibackend.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.njuzr.eaibackend.po.User;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * @author: Leonezhurui
@@ -12,4 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
 public interface UserMapper extends BaseMapper<User> {
+
+    User selectByOfficialNumber(String officialNumber);
 }

+ 73 - 0
src/main/java/com/njuzr/eaibackend/po/MyUserDetails.java

@@ -0,0 +1,73 @@
+package com.njuzr.eaibackend.po;
+
+import com.njuzr.eaibackend.po.base.BaseUser;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+
+/**
+ * @author: Leonezhurui
+ * @Date: 2024/2/20 - 16:30
+ * @Package: EAI-Backend
+ */
+
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Data
+public class MyUserDetails extends BaseUser implements UserDetails {
+    private String username;
+    private String password;
+//    private boolean accountNonLocked;
+//    private boolean enabled;
+//    private List<GrantedAuthority> authorities;
+//
+//
+//    public MyUserDetails(User user) {
+//        this.username = user.getOfficialNumber();
+//        this.password = user.getPassword();
+//        this.accountNonLocked = user.isAccountNonLocked();
+//        this.enabled = user.isEnabled();
+//        this.authorities = user.getRole().stream()
+//                .map(SimpleGrantedAuthority::new)
+//                .collect(Collectors.toList());
+//    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return null;
+    }
+
+    @Override
+    public String getPassword() {
+        return password;
+    }
+
+    @Override
+    public String getUsername() {
+        return getOfficialNumber();
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+}

+ 5 - 1
src/main/java/com/njuzr/eaibackend/po/base/BaseUser.java

@@ -24,7 +24,7 @@ public class BaseUser {
 
     private String userAvatar; // 头像URL(有默认值、选填)
 
-    private Date createTime; // 创建时间,系统自动设置
+    private Date createTime; // 创建时间,系统自动设置(自动生成)
 
     private Date lastLoginTime; // 上一次登陆时间(可选)
 
@@ -37,4 +37,8 @@ public class BaseUser {
     private String phone; // 联系方式(选填)
 
     private String contentEmail; // 联系邮箱(选填)
+
+    boolean isAccountNonLocked = false; // 账户是否被锁定
+
+    boolean enabled = false; // 账户是否可用
 }

+ 16 - 3
src/main/java/com/njuzr/eaibackend/service/MyUserDetailService.java

@@ -1,6 +1,9 @@
 package com.njuzr.eaibackend.service;
 
 import com.njuzr.eaibackend.mapper.UserMapper;
+import com.njuzr.eaibackend.po.MyUserDetails;
+import com.njuzr.eaibackend.po.User;
+import com.njuzr.eaibackend.utils.ModelMapperUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
@@ -16,10 +19,20 @@ import org.springframework.stereotype.Service;
 @Service
 public class MyUserDetailService implements UserDetailsService {
 
+    private final UserMapper userMapper;
+
+    @Autowired
+    public MyUserDetailService(UserMapper userMapper) {
+        this.userMapper = userMapper;
+    }
+
     @Override
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-        // TODO 调用UserService的findById方法,找到目标用户
+    public UserDetails loadUserByUsername(String officialNumber) throws UsernameNotFoundException {
+        User user = userMapper.selectByOfficialNumber(officialNumber);
+        if (user == null) {
+            throw new UsernameNotFoundException("User not found with officialNumber: " + officialNumber);
+        }
 
-        return null;
+        return ModelMapperUtil.map(user, MyUserDetails.class);
     }
 }

+ 4 - 1
src/main/java/com/njuzr/eaibackend/service/UserService.java

@@ -2,6 +2,7 @@ package com.njuzr.eaibackend.service;
 
 import com.njuzr.eaibackend.dto.UserDTO;
 import com.njuzr.eaibackend.dto.UserRegisterDTO;
+import com.njuzr.eaibackend.vo.UserVO;
 
 /**
  * @author: Leonezhurui
@@ -11,5 +12,7 @@ import com.njuzr.eaibackend.dto.UserRegisterDTO;
 
 public interface UserService {
 
-    UserDTO createUser(UserRegisterDTO userDTO);
+    UserVO createUser(UserRegisterDTO userDTO);
+
+    UserVO findById(Long id);
 }

+ 20 - 4
src/main/java/com/njuzr/eaibackend/service/impl/UserServiceImpl.java

@@ -7,10 +7,13 @@ import com.njuzr.eaibackend.mapper.UserMapper;
 import com.njuzr.eaibackend.po.User;
 import com.njuzr.eaibackend.service.UserService;
 import com.njuzr.eaibackend.utils.ModelMapperUtil;
+import com.njuzr.eaibackend.vo.UserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -28,20 +31,33 @@ public class UserServiceImpl implements UserService {
     private final UserMapper userMapper;
 
     @Autowired
-    public UserServiceImpl(UserMapper mapper) {
-        this.userMapper = mapper;
+    public UserServiceImpl(UserMapper userMapper) {
+        this.userMapper = userMapper;
     }
 
 
     @Override
-    public UserDTO createUser(UserRegisterDTO userDTO) {
+    public UserVO findById(Long id) {
+        try {
+            User target = userMapper.selectById(id);
+            return ModelMapperUtil.map(target, UserVO.class);
+        }catch (Exception e){
+            log.error("findById -- 数据库查找错误:"+e.getMessage());
+            throw new MyException(501, "用户查找失败,id错误");
+        }
+    }
+
+    @Override
+    public UserVO createUser(UserRegisterDTO userDTO) {
         User targetUser = ModelMapperUtil.map(userDTO, User.class);
 
+        targetUser.setPassword(new BCryptPasswordEncoder().encode(targetUser.getPassword())); // 密码加密存储
         targetUser.setCreateTime(new Date()); // 设置创建时间
 
         try {
             int status = userMapper.insert(targetUser);
             if (status == 0) {
+                log.error("createUser -- 数据库插入错误:");
                 throw new MyException(501, "数据库插入错误");
             }
         } catch (Exception e) {
@@ -51,6 +67,6 @@ public class UserServiceImpl implements UserService {
 
         log.info("User创建完毕,User对象如下:"+ targetUser);
 
-        return ModelMapperUtil.map(targetUser, UserDTO.class);
+        return ModelMapperUtil.map(targetUser, UserVO.class);
     }
 }

+ 77 - 5
src/main/java/com/njuzr/eaibackend/utils/JWTTokenUtil.java

@@ -1,10 +1,82 @@
 package com.njuzr.eaibackend.utils;
 
-/**
- * @author: Leonezhurui
- * @Date: 2024/2/20 - 00:09
- * @Package: EAI-Backend
- */
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.security.Keys;
+import io.jsonwebtoken.security.SecureDigestAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
 
+import javax.crypto.SecretKey;
+import java.security.Key;
+import java.time.Instant;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@Slf4j
+@Component
 public class JWTTokenUtil {
+
+    @Value("${jwt.secret}")
+    private String secret;
+    @Value("${jwt.issuer}")
+    private String issuer;
+    @Value("${jwt.expiration}")
+    private String expiration;
+
+
+    /**
+            * 根据用户信息生成token
+     */
+    public String generateToken(String username) {
+        // 令牌id
+        String uuid = UUID.randomUUID().toString();
+        Date exprireDate = Date.from(Instant.now().plusSeconds(Long.parseLong(expiration)));
+        return Jwts.builder()
+                // 设置头部信息header
+                .header()
+                .add("typ", "JWT")
+                .add("alg", "HS256")
+                .and()
+                // 设置自定义负载信息payload
+                .claim("username", username)
+                // 令牌ID
+                .id(uuid)
+                // 过期日期
+                .expiration(exprireDate)
+                // 签发时间
+                .issuedAt(new Date())
+                // 主题
+                .subject(username)
+                // 签发者
+                .issuer(issuer)
+                // 签名
+                .signWith(Keys.hmacShaKeyFor(secret.getBytes()), Jwts.SIG.HS256)
+                .compact();
+    }
+
+    /**
+     * 解析token
+     * @param token token
+     * @return Jws<Claims>
+     */
+    public Jws<Claims> parseClaim(String token) {
+        return Jwts.parser()
+                .verifyWith(Keys.hmacShaKeyFor(secret.getBytes()))
+                .build()
+                .parseSignedClaims(token);
+    }
+    public JwsHeader parseHeader(String token) {
+        return parseClaim(token).getHeader();
+    }
+    public Claims parsePayload(String token) {
+        return parseClaim(token).getPayload();
+    }
+
+    public String parseToken(String token) {
+        return parseClaim(token).getPayload().getSubject();
+    }
 }

+ 9 - 4
src/main/java/com/njuzr/eaibackend/vo/UserLoginVO.java

@@ -1,15 +1,20 @@
 package com.njuzr.eaibackend.vo;
 
+import com.njuzr.eaibackend.po.base.BaseUser;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 /**
  * @author: Leonezhurui
- * @Date: 2024/2/20 - 00:06
+ * @Date: 2024/2/20 - 15:36
  * @Package: EAI-Backend
  */
 
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
 @Data
-public class UserLoginVO {
-    private String officialEmail; // 南大官邮,xxx@smail.nju.edu.cn(必填)
-    private String password;
+public class UserLoginVO extends BaseUser {
+    private Long id;
+    private String token;
 }

+ 0 - 26
src/main/java/com/njuzr/eaibackend/vo/UserRegisterVO.java

@@ -1,26 +0,0 @@
-package com.njuzr.eaibackend.vo;
-
-import com.njuzr.eaibackend.enums.Gender;
-import com.njuzr.eaibackend.enums.Role;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * @author: Leonezhurui
- * @Date: 2024/2/14 - 22:08
- * @Package: EAI-Backend
- */
-
-@Data
-public class UserRegisterVO { // 注册时单独使用的VO类,只需要传递必填信息
-    private String name; // 真实姓名(必填)
-
-    private String password;  // 密码(加密存储)(必填)
-
-    private String officialEmail; // 南大官邮,xxx@smail.nju.edu.cn(必填)
-
-    private String officialNumber; // 南大学号、工号(必填)
-
-    private Role role; // 用户角色:学生、教师、管理员(必填)
-}

+ 1 - 1
src/main/java/com/njuzr/eaibackend/vo/UserVO.java

@@ -15,6 +15,6 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 @Data
-public class UserVO extends BaseUser{ // 没有password
+public class UserVO extends BaseUser{ // 没有password,后传前的安全数据
     private Long id;
 }

+ 6 - 0
src/main/resources/application.yaml

@@ -4,3 +4,9 @@ spring:
     username: root
     password: Zr200012
     url: jdbc:mysql://localhost:3306/EAI?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
+
+jwt:
+  # jjwt密钥算法HS256,要求secret长度至少是256位
+  secret: xTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguh92AHo5Wj$@KAnguh92AHo5Wj$@KAnguh92AHo5Wj$@KAnguh
+  issuer: eai
+  expiration: 86400

+ 9 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,9 @@
+<?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.njuzr.eaibackend.mapper.UserMapper">
+    <select id="selectByOfficialNumber" resultType="com.njuzr.eaibackend.po.User">
+        select *
+        from users
+        where official_number = #{officialNumber}
+    </select>
+</mapper>