1
0

AuthAspect.java 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package com.nju.edu.eval.aspect.auth;
  2. import com.auth0.jwt.exceptions.JWTVerificationException;
  3. import com.auth0.jwt.interfaces.Claim;
  4. import com.nju.edu.eval.data.entity.User;
  5. import com.nju.edu.eval.exception.MyServiceException;
  6. import com.nju.edu.eval.model.vo.user.PortalUserVO;
  7. import com.nju.edu.eval.service.UserService;
  8. import com.nju.edu.eval.service.convertor.UserConvertor;
  9. import com.nju.edu.eval.model.vo.user.UpdateUserVO;
  10. import com.nju.edu.eval.util.JwtUtil;
  11. import org.aspectj.lang.JoinPoint;
  12. import org.aspectj.lang.annotation.Aspect;
  13. import org.aspectj.lang.annotation.Before;
  14. import org.springframework.beans.BeanUtils;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.context.annotation.Configuration;
  17. import org.springframework.core.annotation.Order;
  18. import org.springframework.web.context.request.RequestContextHolder;
  19. import org.springframework.web.context.request.ServletRequestAttributes;
  20. import javax.servlet.http.HttpServletRequest;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.Objects;
  24. import java.util.Optional;
  25. import java.util.stream.Collectors;
  26. /**
  27. * @author mars
  28. */
  29. @Aspect
  30. @Configuration
  31. @Order(1)
  32. public class AuthAspect {
  33. private final UserService userService;
  34. @Autowired
  35. public AuthAspect(UserService userService) {
  36. this.userService = userService;
  37. }
  38. private User getUserByToken(String token) throws JWTVerificationException {
  39. try {
  40. Claim claim = JwtUtil.parseJwt(token);
  41. PortalUserVO userVO = claim.as(PortalUserVO.class);
  42. return new User(userVO.getId(), userVO.getRole(), userVO.getName(), userVO.getEmail(), userVO.getPhone(), new ArrayList<>(), null);
  43. } catch (MyServiceException e) {
  44. throw new MyServiceException(e.getCode(), e.getMessage());
  45. }
  46. }
  47. @Before(value = "execution(public * com.nju.edu.eval.web.controller.*.*(..)) && @annotation(authorized)")
  48. public void authCheck(JoinPoint joinPoint, Authorized authorized) {
  49. HttpServletRequest httpServletRequest = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
  50. String token = Optional.ofNullable(httpServletRequest.getHeader("Authorization")).
  51. orElseThrow(() -> new MyServiceException("A0223", "用户未获得第三方登录授权"));
  52. User user = getUserByToken(token);
  53. // 创建或者更新用户
  54. if (userService.existsById(user.getId())) {
  55. userService.updateUser(new UpdateUserVO(user.getId(), user.getName(), user.getEmail()));
  56. } else {
  57. //TODO 这里没有对HR和TEACHER作区分
  58. userService.createUser(UserConvertor.convertToVO(user));
  59. }
  60. // 判断切面方法是否包含当前token对应的角色
  61. if (!Arrays.stream(authorized.roles()).collect(Collectors.toList()).contains(user.getRole())) {
  62. throw new MyServiceException("A0301", "访问未授权");
  63. } else {
  64. // 将token的对象赋值给切面方法的user参数
  65. Object[] objects = joinPoint.getArgs();
  66. for (Object o : objects) {
  67. if (o instanceof User) {
  68. System.out.println(user);
  69. BeanUtils.copyProperties(user, o);
  70. break;
  71. }
  72. }
  73. }
  74. }
  75. }