|
|
@@ -0,0 +1,72 @@
|
|
|
+package space.anyi.serve.controller;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import io.swagger.v3.oas.annotations.Operation;
|
|
|
+import io.swagger.v3.oas.annotations.tags.Tag;
|
|
|
+import jakarta.validation.Valid;
|
|
|
+import org.springframework.security.authentication.AuthenticationManager;
|
|
|
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
+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 space.anyi.serve.entity.auth.JwtUserDetails;
|
|
|
+import space.anyi.serve.entity.Response;
|
|
|
+import space.anyi.serve.entity.auth.AuthTokenVo;
|
|
|
+import space.anyi.serve.entity.auth.LoginDto;
|
|
|
+import space.anyi.serve.entity.auth.RegisterDto;
|
|
|
+import space.anyi.serve.entity.user.User;
|
|
|
+import space.anyi.serve.handler.security.JwtTokenProvider;
|
|
|
+import space.anyi.serve.service.UserService;
|
|
|
+
|
|
|
+@Tag(name = "AuthController",description = "用户认证相关接口")
|
|
|
+@RestController
|
|
|
+@RequestMapping("auth")
|
|
|
+public class AuthController {
|
|
|
+
|
|
|
+ private final UserService userService;
|
|
|
+ private final AuthenticationManager authenticationManager;
|
|
|
+ private final JwtTokenProvider jwtTokenProvider;
|
|
|
+ private final PasswordEncoder passwordEncoder;
|
|
|
+
|
|
|
+
|
|
|
+ public AuthController(UserService userService,
|
|
|
+ AuthenticationManager authenticationManager,
|
|
|
+ JwtTokenProvider jwtTokenProvider, PasswordEncoder passwordEncoder) {
|
|
|
+ this.userService = userService;
|
|
|
+ this.authenticationManager = authenticationManager;
|
|
|
+ this.jwtTokenProvider = jwtTokenProvider;
|
|
|
+ this.passwordEncoder = passwordEncoder;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Operation(summary = "用户登录")
|
|
|
+ @PostMapping("login")
|
|
|
+ public Response<AuthTokenVo> login(@Valid @RequestBody LoginDto loginDto) {
|
|
|
+ var authentication = authenticationManager.authenticate(
|
|
|
+ new UsernamePasswordAuthenticationToken(loginDto.getAccount(), loginDto.getPassword())
|
|
|
+ );
|
|
|
+ JwtUserDetails userDetails = (JwtUserDetails) authentication.getPrincipal();
|
|
|
+ var user = userDetails.getUser();
|
|
|
+ String token = jwtTokenProvider.generateToken(user.getId(), user.getAccount(), user.getUsername(), user.getRole());
|
|
|
+ return Response.ok(new AuthTokenVo(token, user.getId(), user.getAccount(), user.getUsername(), user.getRole()));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Operation(summary = "用户注册")
|
|
|
+ @PostMapping("register")
|
|
|
+ public Response<AuthTokenVo> register(@Valid @RequestBody RegisterDto registerDto) {
|
|
|
+ LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
|
|
|
+ .eq(User::getAccount, registerDto.getAccount());
|
|
|
+ if (userService.count(wrapper) > 0) {
|
|
|
+ throw new IllegalArgumentException("账号已存在");
|
|
|
+ }
|
|
|
+ User user = new User();
|
|
|
+ user.setAccount(registerDto.getAccount());
|
|
|
+ user.setPassword(passwordEncoder.encode(registerDto.getPassword()));
|
|
|
+ user.setUsername(registerDto.getUsername());
|
|
|
+ userService.save(user);
|
|
|
+ String token = jwtTokenProvider.generateToken(user.getId(), user.getAccount(), user.getUsername(), user.getRole());
|
|
|
+ AuthTokenVo authTokenVo = new AuthTokenVo(token, user.getId(), user.getAccount(), user.getUsername(), user.getRole());
|
|
|
+ return Response.ok(authTokenVo);
|
|
|
+ }
|
|
|
+}
|