From d06e6d9f1695276413e5a757c5bb87ab8afb7ff3 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Mon, 27 Mar 2023 00:17:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=80=E5=8F=91=E4=B8=AD...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blog-backend/build.gradle | 2 +- .../application/blog/config/WebConfig.java | 13 +++- .../security/BlogAuthenticationManager.java | 31 ++++++++++ .../security/DevSecurityConfiguration.java | 9 +-- .../security/SecurityConfiguration.java | 6 +- .../security/UserDetailServiceImpl.java | 5 +- .../blog/controller/BlogController.java | 9 +-- .../blog/controller/ExceptionController.java | 19 +++++- .../blog/controller/UserController.java | 12 +++- .../application/blog/dao/UserRepository.java | 6 +- .../application/blog/entity/BlogEntity.java | 4 ++ .../application/blog/entity/UserEntity.java | 2 +- .../blog/entity/mapper/AttachMapper.java | 6 ++ .../blog/service/IBlogService.java | 8 +++ .../blog/service/IUserService.java | 6 ++ .../blog/service/impl/BlogService.java | 20 +++++++ .../blog/service/impl/UserService.java | 59 ++++++++++--------- .../blog/vo/PageableResponseVO.java | 31 ++++++++++ .../application/blog/vo/ResponseVO.java | 10 ---- .../blog/vo/user/UserInfoResponseVO.java | 5 +- .../blog/vo/user/UserLoginRequireVO.java | 2 - .../src/main/resources/application-dev.yml | 2 +- 22 files changed, 201 insertions(+), 66 deletions(-) create mode 100644 blog-backend/src/main/java/cn/hamster3/application/blog/config/security/BlogAuthenticationManager.java create mode 100644 blog-backend/src/main/java/cn/hamster3/application/blog/vo/PageableResponseVO.java diff --git a/blog-backend/build.gradle b/blog-backend/build.gradle index 1e66513..0be4c16 100644 --- a/blog-backend/build.gradle +++ b/blog-backend/build.gradle @@ -71,4 +71,4 @@ processResources { clean { delete(files('bin')) -} \ No newline at end of file +} diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/config/WebConfig.java b/blog-backend/src/main/java/cn/hamster3/application/blog/config/WebConfig.java index a57771c..83b292f 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/config/WebConfig.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/config/WebConfig.java @@ -26,8 +26,17 @@ public class WebConfig { if (authentication == null || !authentication.isAuthenticated()) { return Optional.empty(); } - BlogUser user = (BlogUser) authentication.getPrincipal(); - return Optional.of(user.getUuid()); + System.out.println("getUserIDAuditorAware"); + System.out.println(authentication.getName()); + System.out.println(authentication.getPrincipal()); + System.out.println(authentication.getCredentials()); + System.out.println(authentication.getDetails()); + System.out.println(authentication.getAuthorities()); + Object userDetails = authentication.getDetails(); + if (userDetails instanceof BlogUser user) { + return Optional.of(user.getUuid()); + } + return Optional.empty(); }; } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/BlogAuthenticationManager.java b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/BlogAuthenticationManager.java new file mode 100644 index 0000000..3cfe4a5 --- /dev/null +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/BlogAuthenticationManager.java @@ -0,0 +1,31 @@ +package cn.hamster3.application.blog.config.security; + +import jakarta.annotation.Resource; +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.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Component; + +@Component +public class BlogAuthenticationManager implements AuthenticationManager { + @Resource + private UserDetailsService userDetailsService; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + if (!(authentication instanceof UsernamePasswordAuthenticationToken)) { + throw new IllegalArgumentException("BlogAuthenticationManager only support UsernamePasswordAuthenticationToken!"); + } + UserDetails user = userDetailsService.loadUserByUsername((String) authentication.getPrincipal()); + UsernamePasswordAuthenticationToken authenticated = UsernamePasswordAuthenticationToken.authenticated( + authentication.getPrincipal(), + authentication.getCredentials(), + user.getAuthorities() + ); + authenticated.setDetails(user); + return authenticated; + } +} \ No newline at end of file diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/DevSecurityConfiguration.java b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/DevSecurityConfiguration.java index 2969124..a13a44c 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/DevSecurityConfiguration.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/DevSecurityConfiguration.java @@ -1,6 +1,5 @@ package cn.hamster3.application.blog.config.security; -import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -10,13 +9,11 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -@Slf4j @Configuration @Profile("dev") public class DevSecurityConfiguration { @Bean - SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - log.info("development environment security settings enabled."); + public SecurityFilterChain getSecurityFilterChain(HttpSecurity http) throws Exception { return http.authorizeHttpRequests(request -> request .anyRequest().permitAll()) .cors().and() @@ -29,8 +26,7 @@ public class DevSecurityConfiguration { } @Bean - public WebMvcConfigurer corsConfigurer() { - log.info("add cors configuration..."); + public WebMvcConfigurer getWebMvcConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(@NotNull CorsRegistry registry) { @@ -43,4 +39,5 @@ public class DevSecurityConfiguration { } }; } + } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/SecurityConfiguration.java b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/SecurityConfiguration.java index 78dd729..b0f2cb8 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/SecurityConfiguration.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/SecurityConfiguration.java @@ -1,6 +1,5 @@ package cn.hamster3.application.blog.config.security; -import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -8,13 +7,11 @@ import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; -@Slf4j @Configuration @Profile("prod") public class SecurityConfiguration { @Bean - SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - log.info("production environment security settings enabled."); + public SecurityFilterChain getSecurityFilterChain(HttpSecurity http) throws Exception { return http.authorizeHttpRequests(request -> request .requestMatchers(HttpMethod.GET, "/", "/index", "/index.html").permitAll() .requestMatchers(HttpMethod.GET, "/favicon.ico", "/assets/**").permitAll() @@ -30,4 +27,5 @@ public class SecurityConfiguration { .and() .build(); } + } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/UserDetailServiceImpl.java b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/UserDetailServiceImpl.java index 77d261e..fc9ced1 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/UserDetailServiceImpl.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/config/security/UserDetailServiceImpl.java @@ -3,11 +3,13 @@ package cn.hamster3.application.blog.config.security; import cn.hamster3.application.blog.constant.UserPermissions; import cn.hamster3.application.blog.dao.UserRepository; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; 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.Component; +@Slf4j @Component public class UserDetailServiceImpl implements UserDetailsService { @Resource @@ -15,7 +17,8 @@ public class UserDetailServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - return userRepo.findByEmailIgnoreCaseWithPermission(username) + log.info("find user by email: {}", username); + return userRepo.findByEmailIgnoreCase(username) .map(user -> new BlogUser( user.getEmail(), user.getPassword(), diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/controller/BlogController.java b/blog-backend/src/main/java/cn/hamster3/application/blog/controller/BlogController.java index c85db7f..123ae95 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/controller/BlogController.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/controller/BlogController.java @@ -8,6 +8,7 @@ import cn.hamster3.application.blog.vo.blog.BlogUpdateRequireVO; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; +import org.springframework.data.domain.PageRequest; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -26,13 +27,13 @@ public class BlogController { } @GetMapping("/{blogID}/") - public ResponseVO getBlogInfo() { - return null; + public ResponseVO getBlogInfo(@PathVariable Long blogID) { + return blogService.getBlogInfo(blogID); } @GetMapping("/") - public ResponseVO> getBlogInfoList() { - return null; + public ResponseVO> getBlogInfoList(int page, int size) { + return blogService.getBlogInfoList(PageRequest.of(page, size)); } @PutMapping("/{blogID}/") diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/controller/ExceptionController.java b/blog-backend/src/main/java/cn/hamster3/application/blog/controller/ExceptionController.java index 625bf7c..3e8b62f 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/controller/ExceptionController.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/controller/ExceptionController.java @@ -1,13 +1,30 @@ package cn.hamster3.application.blog.controller; import cn.hamster3.application.blog.vo.ResponseVO; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import java.io.PrintWriter; +import java.io.StringWriter; + +@Slf4j @RestControllerAdvice public class ExceptionController { + @Resource + private Environment environment; + @ExceptionHandler(Exception.class) public ResponseVO onException(Exception e) { - return ResponseVO.failed(e); + log.error("", e); + if ("dev".equals(environment.getProperty("spring.profiles.active"))) { + StringWriter writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); + // StringWriter 不需要 close() + return new ResponseVO<>(403, e.getMessage(), writer.toString()); + } + return ResponseVO.failed(e.getMessage()); } } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/controller/UserController.java b/blog-backend/src/main/java/cn/hamster3/application/blog/controller/UserController.java index 77092b5..95d5321 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/controller/UserController.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/controller/UserController.java @@ -1,15 +1,16 @@ package cn.hamster3.application.blog.controller; import cn.hamster3.application.blog.service.IUserService; +import cn.hamster3.application.blog.vo.PageableResponseVO; import cn.hamster3.application.blog.vo.ResponseVO; import cn.hamster3.application.blog.vo.attach.AttachInfoResponseVO; import cn.hamster3.application.blog.vo.user.*; import jakarta.annotation.Resource; import jakarta.validation.Valid; +import org.springframework.data.domain.PageRequest; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -27,6 +28,11 @@ public class UserController { return userService.loginUser(requireVO); } + @GetMapping("/current") + public ResponseVO currentUser() { + return userService.currentUser(); + } + @PostMapping("/") public ResponseVO createUser(@RequestBody @Valid UserCreateRequireVO requireVO) { return userService.createUser(requireVO); @@ -38,8 +44,8 @@ public class UserController { } @GetMapping("/") - public ResponseVO> getAllUserInfo() { - return ResponseVO.success(new ArrayList<>()); + public ResponseVO> getAllUserInfo(int page, int size) { + return userService.getAllUserInfo(PageRequest.of(page, size)); } @GetMapping("/{userID}/") diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/dao/UserRepository.java b/blog-backend/src/main/java/cn/hamster3/application/blog/dao/UserRepository.java index 929d35a..37e8d94 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/dao/UserRepository.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/dao/UserRepository.java @@ -2,6 +2,7 @@ package cn.hamster3.application.blog.dao; import cn.hamster3.application.blog.entity.BlogEntity; import cn.hamster3.application.blog.entity.UserEntity; +import org.jetbrains.annotations.NotNull; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @@ -12,12 +13,13 @@ import java.util.UUID; public interface UserRepository extends JpaRepository, JpaSpecificationExecutor { @EntityGraph(attributePaths = {"permissions"}) - Optional findByEmailIgnoreCaseWithPermission(String email); + Optional findByEmailIgnoreCase(String email); boolean existsByNicknameIgnoreCase(String nickname); boolean existsByEmailIgnoreCase(String email); @EntityGraph(attributePaths = {"attachEntities"}) - UserEntity findByIdWithAttach(UUID uuid); + @NotNull + Optional findById(@NotNull UUID uuid); } \ No newline at end of file diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/entity/BlogEntity.java b/blog-backend/src/main/java/cn/hamster3/application/blog/entity/BlogEntity.java index 4a239e9..5ad6d12 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/entity/BlogEntity.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/entity/BlogEntity.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.util.ArrayList; import java.util.Date; @@ -18,6 +19,7 @@ import java.util.List; @Getter @Entity @Table(name = "blog_entity") +@EntityListeners(AuditingEntityListener.class) public class BlogEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -44,10 +46,12 @@ public class BlogEntity { private UserEntity uploader; @CreatedDate + @Temporal(TemporalType.TIMESTAMP) @Column(name = "create_time", nullable = false) private Date createTime; @LastModifiedDate + @Temporal(TemporalType.TIMESTAMP) @Column(name = "update_time", nullable = false) private Date updateTime; diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/entity/UserEntity.java b/blog-backend/src/main/java/cn/hamster3/application/blog/entity/UserEntity.java index 7a8e835..6829dfb 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/entity/UserEntity.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/entity/UserEntity.java @@ -32,7 +32,7 @@ public class UserEntity { private String nickname; @Setter - @Column(name = "password", nullable = false, length = 32) + @Column(name = "password", nullable = false, length = 60) private String password; @Setter diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/entity/mapper/AttachMapper.java b/blog-backend/src/main/java/cn/hamster3/application/blog/entity/mapper/AttachMapper.java index f022084..dab94cc 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/entity/mapper/AttachMapper.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/entity/mapper/AttachMapper.java @@ -1,13 +1,19 @@ package cn.hamster3.application.blog.entity.mapper; import cn.hamster3.application.blog.entity.AttachEntity; +import cn.hamster3.application.blog.entity.UserEntity; import cn.hamster3.application.blog.vo.attach.AttachInfoResponseVO; import org.mapstruct.Mapper; import org.mapstruct.MappingConstants; import org.mapstruct.ReportingPolicy; +import java.util.UUID; + @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING) public interface AttachMapper { AttachInfoResponseVO entityToInfoVO(AttachEntity entity); + default UUID map(UserEntity value) { + return value.getId(); + } } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/service/IBlogService.java b/blog-backend/src/main/java/cn/hamster3/application/blog/service/IBlogService.java index 9263df8..e0152d5 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/service/IBlogService.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/service/IBlogService.java @@ -2,8 +2,16 @@ package cn.hamster3.application.blog.service; import cn.hamster3.application.blog.vo.ResponseVO; import cn.hamster3.application.blog.vo.blog.BlogCreateRequireVO; +import cn.hamster3.application.blog.vo.blog.BlogInfoResponseVO; import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.PageRequest; + +import java.util.List; public interface IBlogService { @NotNull ResponseVO createBlog(@NotNull BlogCreateRequireVO requireVO); + + @NotNull ResponseVO getBlogInfo(@NotNull Long blogID); + + @NotNull ResponseVO> getBlogInfoList(@NotNull PageRequest page); } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/service/IUserService.java b/blog-backend/src/main/java/cn/hamster3/application/blog/service/IUserService.java index f0fddde..fab5ef9 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/service/IUserService.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/service/IUserService.java @@ -1,9 +1,11 @@ package cn.hamster3.application.blog.service; +import cn.hamster3.application.blog.vo.PageableResponseVO; import cn.hamster3.application.blog.vo.ResponseVO; import cn.hamster3.application.blog.vo.attach.AttachInfoResponseVO; import cn.hamster3.application.blog.vo.user.*; import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; @@ -12,10 +14,14 @@ import java.util.UUID; public interface IUserService { @NotNull ResponseVO loginUser(@NotNull UserLoginRequireVO requireVO); + @NotNull ResponseVO currentUser(); + @NotNull ResponseVO createUser(@NotNull UserCreateRequireVO requireVO); @NotNull ResponseVO updateUser(@NotNull UserUpdateRequireVO requireVO); + @NotNull ResponseVO> getAllUserInfo(@NotNull Pageable pageable); + @NotNull ResponseVO getUserInfo(UUID id); @NotNull ResponseVO> getUserAttaches(@PathVariable UUID userID); diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/BlogService.java b/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/BlogService.java index 54dfd40..bd8d8b5 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/BlogService.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/BlogService.java @@ -6,10 +6,14 @@ import cn.hamster3.application.blog.entity.mapper.BlogMapper; import cn.hamster3.application.blog.service.IBlogService; import cn.hamster3.application.blog.vo.ResponseVO; import cn.hamster3.application.blog.vo.blog.BlogCreateRequireVO; +import cn.hamster3.application.blog.vo.blog.BlogInfoResponseVO; import jakarta.annotation.Resource; import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class BlogService implements IBlogService { @Resource @@ -23,4 +27,20 @@ public class BlogService implements IBlogService { BlogEntity save = blogRepo.save(entity); return ResponseVO.success(save.getId()); } + + @Override + public @NotNull ResponseVO getBlogInfo(@NotNull Long blogID) { + return blogRepo.findById(blogID) + .map(o -> ResponseVO.success(blogMapper.entityToInfoVO(o))) + .orElseThrow(() -> new IllegalArgumentException("未找到该文章!")); + } + + @Override + public @NotNull ResponseVO> getBlogInfoList(@NotNull PageRequest page) { + return ResponseVO.success( + blogRepo.findAll(page).stream() + .map(o -> blogMapper.entityToInfoVO(o)) + .toList() + ); + } } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/UserService.java b/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/UserService.java index a37231e..6f3b16d 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/UserService.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/service/impl/UserService.java @@ -7,15 +7,17 @@ import cn.hamster3.application.blog.entity.UserEntity; import cn.hamster3.application.blog.entity.mapper.AttachMapper; import cn.hamster3.application.blog.entity.mapper.UserMapper; import cn.hamster3.application.blog.service.IUserService; +import cn.hamster3.application.blog.vo.PageableResponseVO; import cn.hamster3.application.blog.vo.ResponseVO; import cn.hamster3.application.blog.vo.attach.AttachInfoResponseVO; import cn.hamster3.application.blog.vo.user.*; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Pageable; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; -import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -24,6 +26,7 @@ import org.springframework.web.bind.annotation.PathVariable; import java.util.List; import java.util.UUID; +@Slf4j @Service public class UserService implements IUserService { @Resource @@ -43,34 +46,28 @@ public class UserService implements IUserService { @Override public @NotNull ResponseVO loginUser(@NotNull UserLoginRequireVO requireVO) { - UserEntity userEntity = userRepo.findByEmailIgnoreCaseWithPermission(requireVO.getEmail()).orElse(null); - if (userEntity == null) { - return ResponseVO.failed("未找到该邮箱!"); - } - if (!passwordEncoder.matches(requireVO.getPassword(), userEntity.getPassword())) { - return ResponseVO.failed("密码错误!"); - } - - List userPermissions = userEntity.getPermissions().stream() - .map(UserPermissions::getAuthority) - .toList(); - - BlogUser blogUser = new BlogUser( - userEntity.getEmail(), - userEntity.getPassword(), - userPermissions, - userEntity.getId() - ); - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - blogUser, - requireVO.getPassword(), - blogUser.getAuthorities() - ); - authenticationManager.authenticate(token); - SecurityContextHolder.getContext().setAuthentication(token); + Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken( + requireVO.getEmail(), + requireVO.getPassword() + )); + SecurityContextHolder.getContext().setAuthentication(authenticate); return ResponseVO.success(); } + @Override + public @NotNull ResponseVO currentUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Object userDetails = authentication.getDetails(); + if (userDetails instanceof BlogUser user) { + return ResponseVO.success( + userRepo.findById(user.getUuid()) + .map(o -> userMapper.entityToInfoVO(o)) + .orElse(null) + ); + } + return ResponseVO.failed("not login."); + } + @Override public @NotNull ResponseVO createUser(@NotNull UserCreateRequireVO requireVO) { UserEntity entity = userMapper.voToEntity(requireVO); @@ -85,6 +82,7 @@ public class UserService implements IUserService { } entity.setPassword(passwordEncoder.encode(entity.getPassword())); + log.info("prepare to save userinfo: {}", entity); UserEntity save = userRepo.save(entity); return ResponseVO.success("注册成功!", userMapper.entityToRegisterVO(save)); @@ -136,6 +134,13 @@ public class UserService implements IUserService { return ResponseVO.success(); } + @Override + public @NotNull ResponseVO> getAllUserInfo(@NotNull Pageable pageable) { + return PageableResponseVO.success( + userRepo.findAll(pageable).map(o -> userMapper.entityToInfoVO(o)) + ); + } + @Override public @NotNull ResponseVO getUserInfo(UUID id) { return userRepo.findById(id) @@ -145,7 +150,7 @@ public class UserService implements IUserService { @Override public @NotNull ResponseVO> getUserAttaches(@PathVariable UUID userID) { - UserEntity userEntity = userRepo.findByIdWithAttach(userID); + UserEntity userEntity = userRepo.findById(userID).orElse(null); if (userEntity == null) { return ResponseVO.failed("未找到该用户!"); } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/PageableResponseVO.java b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/PageableResponseVO.java new file mode 100644 index 0000000..86af5f9 --- /dev/null +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/PageableResponseVO.java @@ -0,0 +1,31 @@ +package cn.hamster3.application.blog.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.data.domain.Page; + +import java.util.List; + +@Data +@AllArgsConstructor +public class PageableResponseVO { + private int page; + private int size; + private long totalElements; + private int totalPage; + private List data; + + public static ResponseVO> success(Page page) { + return ResponseVO.success(of(page)); + } + + public static PageableResponseVO of(Page page) { + return new PageableResponseVO<>( + page.getNumber(), + page.getSize(), + page.getTotalElements(), + page.getTotalPages(), + page.getContent() + ); + } +} diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/ResponseVO.java b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/ResponseVO.java index ed0796b..10f4ca9 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/ResponseVO.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/ResponseVO.java @@ -5,9 +5,6 @@ import lombok.Data; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.PrintWriter; -import java.io.StringWriter; - @Data @AllArgsConstructor public class ResponseVO { @@ -34,11 +31,4 @@ public class ResponseVO { return new ResponseVO<>(403, msg, null); } - public static ResponseVO failed(Exception e) { - StringWriter writer = new StringWriter(); - e.printStackTrace(new PrintWriter(writer)); - // StringWriter 不需要 close() - return new ResponseVO<>(403, e.getMessage(), writer.toString()); - } - } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserInfoResponseVO.java b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserInfoResponseVO.java index 9a32163..23de9cc 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserInfoResponseVO.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserInfoResponseVO.java @@ -1,14 +1,17 @@ package cn.hamster3.application.blog.vo.user; import cn.hamster3.application.blog.constant.UserPermissions; +import lombok.AllArgsConstructor; +import lombok.Data; import java.util.Set; import java.util.UUID; +@Data +@AllArgsConstructor public class UserInfoResponseVO { private UUID id; private String email; private String nickname; - private String password; private Set permissions; } diff --git a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserLoginRequireVO.java b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserLoginRequireVO.java index 9f261d7..fa9e9a4 100644 --- a/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserLoginRequireVO.java +++ b/blog-backend/src/main/java/cn/hamster3/application/blog/vo/user/UserLoginRequireVO.java @@ -2,11 +2,9 @@ package cn.hamster3.application.blog.vo.user; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; import lombok.Data; @Data -@AllArgsConstructor public class UserLoginRequireVO { @Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", message = "邮箱不合法!") private String email; diff --git a/blog-backend/src/main/resources/application-dev.yml b/blog-backend/src/main/resources/application-dev.yml index 1951496..44ac15b 100644 --- a/blog-backend/src/main/resources/application-dev.yml +++ b/blog-backend/src/main/resources/application-dev.yml @@ -7,7 +7,7 @@ spring: ddl-auto: update # open-in-view: true show-ddl: true - # show-sql: true + show-sql: true autoconfigure: exclude: # - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration