xiongzhu 3 лет назад
Родитель
Сommit
ee89d337a9

+ 1 - 1
src/main/java/com/izouma/nineth/config/CacheConfig.java

@@ -33,7 +33,7 @@ import java.util.Map;
 
 @Configuration
 @AutoConfigureAfter({RedisAutoConfiguration.class, CacheAutoConfiguration.class})
-@EnableRedisRepositories
+@EnableRedisRepositories(basePackages = "com.izouma.nineth.repo.redis")
 public class CacheConfig {
 
     @Bean

+ 3 - 1
src/main/java/com/izouma/nineth/config/RedisKeys.java

@@ -31,5 +31,7 @@ public class RedisKeys {
 
     public static final String BLACK_LIST = "blackList::";
 
-    private static final String VIP_COLLECTION_LIST = "vipCollectionList";
+    public static final String VIP_COLLECTION_LIST = "vipCollectionList";
+
+    public static final String JWT_TOKEN = "jwtToken::";
 }

+ 0 - 3
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -23,9 +23,6 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     @Query("update User u set u.del = true where u.id = ?1")
     void softDelete(Long id);
 
-    @Cacheable("user")
-    User findByUsernameAndDelFalse(String username);
-
     List<User> findAllByAuthoritiesContainsAndDelFalse(Authority authority);
 
     Optional<User> findByOpenIdAndDelFalse(String openId);

+ 2 - 7
src/main/java/com/izouma/nineth/repo/UserTokenRepo.java

@@ -1,14 +1,9 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.UserToken;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.keyvalue.repository.KeyValueRepository;
 import org.springframework.stereotype.Repository;
 
-import javax.transaction.Transactional;
-import java.util.Optional;
-
 @Repository
-public interface UserTokenRepo extends CrudRepository<UserToken, String> {
+public interface UserTokenRepo extends KeyValueRepository<UserToken, String> {
 }

+ 11 - 13
src/main/java/com/izouma/nineth/security/JwtAuthorizationTokenFilter.java

@@ -48,9 +48,9 @@ public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
             try {
                 username = jwtTokenUtil.getUsernameFromToken(authToken);
             } catch (IllegalArgumentException e) {
-                log.error("an error occurred during getting username from token", e);
+                log.error("an error occurred during getting username from token");
             } catch (ExpiredJwtException e) {
-                log.warn("the token is expired and not valid anymore", e);
+                log.warn("the token is expired and not valid anymore");
             } catch (SignatureException e) {
                 log.error(e.getMessage());
             }
@@ -67,19 +67,17 @@ public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
             UserDetails userDetails;
             try {
                 userDetails = userDetailsService.loadUserByUsername(username);
+
+                // For simple validation it is completely sufficient to just check the token integrity. You don't have to call
+                // the database compellingly. Again it's up to you ;)
+                if (jwtTokenUtil.validateToken(authToken, userDetails)) {
+                    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+                    authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+                    SecurityContextHolder.getContext().setAuthentication(authentication);
+                }
             } catch (Exception e) {
                 //response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage());
-                chain.doFilter(request, response);
-                return;
-            }
-
-
-            // For simple validation it is completely sufficient to just check the token integrity. You don't have to call
-            // the database compellingly. Again it's up to you ;)
-            if (jwtTokenUtil.validateToken(authToken, userDetails)) {
-                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
-                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
-                SecurityContextHolder.getContext().setAuthentication(authentication);
+                log.error(e.getMessage());
             }
         }
 

+ 13 - 14
src/main/java/com/izouma/nineth/security/JwtTokenUtil.java

@@ -1,21 +1,22 @@
 package com.izouma.nineth.security;
 
-import com.izouma.nineth.domain.UserToken;
-import com.izouma.nineth.repo.UserTokenRepo;
+import com.izouma.nineth.config.RedisKeys;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Clock;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import io.jsonwebtoken.impl.DefaultClock;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Component;
 
 import java.io.Serializable;
+import java.time.Duration;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Optional;
+import java.util.Objects;
 import java.util.function.Function;
 
 @Component
@@ -30,11 +31,11 @@ public class JwtTokenUtil implements Serializable {
     private Clock     clock = DefaultClock.INSTANCE;
     private JwtConfig jwtConfig;
 
-    private final UserTokenRepo userTokenRepo;
+    private final RedisTemplate<String, Object> redisTemplate;
 
-    public JwtTokenUtil(JwtConfig jwtConfig, UserTokenRepo userTokenRepo) {
+    public JwtTokenUtil(JwtConfig jwtConfig, RedisTemplate<String, Object> redisTemplate) {
         this.jwtConfig = jwtConfig;
-        this.userTokenRepo = userTokenRepo;
+        this.redisTemplate = redisTemplate;
     }
 
     public String getUsernameFromToken(String token) {
@@ -63,11 +64,9 @@ public class JwtTokenUtil implements Serializable {
 
     private Boolean isTokenExpired(String token) {
         final Date expiration = getExpirationDateFromToken(token);
-        Optional<UserToken> userToken = userTokenRepo.findById(getUsernameFromToken(token));
-        if (!userToken.isPresent()) {
-            return true;
-        }
-        if (!token.equals(userToken.get().getToken())) {
+        String username = getUsernameFromToken(token);
+        Object redisToken = redisTemplate.opsForValue().get(RedisKeys.JWT_TOKEN + username);
+        if (redisToken != null && !Objects.equals(redisToken, token)) {
             return true;
         }
         return expiration.before(clock.now());
@@ -86,8 +85,8 @@ public class JwtTokenUtil implements Serializable {
         JwtUser jwtUser = (JwtUser) userDetails;
         Map<String, Object> claims = new HashMap<>();
         String token = doGenerateToken(claims, userDetails.getUsername());
-        userTokenRepo.deleteById(jwtUser.getUser().getUsername());
-        userTokenRepo.save(new UserToken(jwtUser.getUser().getUsername(), token));
+        redisTemplate.opsForValue().set(RedisKeys.JWT_TOKEN + userDetails.getUsername(),
+                token, Duration.ofDays(30));
         return token;
     }
 
@@ -100,7 +99,7 @@ public class JwtTokenUtil implements Serializable {
                 .setSubject(subject)
                 .setIssuedAt(createdDate)
                 .setExpiration(expirationDate)
-                .signWith(SignatureAlgorithm.HS512, jwtConfig.getSecret())
+                .signWith(SignatureAlgorithm.HS256, jwtConfig.getSecret())
                 .compact();
     }
 

+ 3 - 2
src/main/java/com/izouma/nineth/security/JwtUser.java

@@ -8,6 +8,7 @@ import org.springframework.security.core.userdetails.UserDetails;
 import java.time.ZoneId;
 import java.util.Collection;
 import java.util.Date;
+import java.util.Optional;
 
 /**
  * Created by stephan on 20.03.16.
@@ -18,7 +19,7 @@ public class JwtUser implements UserDetails {
 
     private final Collection<? extends GrantedAuthority> authorities;
     private final Date                                   lastPasswordResetDate;
-    private       User                                   user;
+    private final User                                   user;
 
     public JwtUser(User user, Collection<? extends GrantedAuthority> authorities) {
         this.authorities = authorities;
@@ -33,7 +34,7 @@ public class JwtUser implements UserDetails {
 
     @Override
     public String getUsername() {
-        return user.getUsername();
+        return Optional.ofNullable(user.getId()).map(Object::toString).orElse(null);
     }
 
     @JsonIgnore

+ 2 - 1
src/main/java/com/izouma/nineth/security/JwtUserDetailsService.java

@@ -15,7 +15,8 @@ public class JwtUserDetailsService implements UserDetailsService {
 
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-        User user = userRepo.findByUsernameAndDelFalse(username);
+        Long userId = Long.parseLong(username);
+        User user = userRepo.findById(userId).orElseThrow(null);
 
         if (user == null) {
             throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));

+ 29 - 80
src/main/java/com/izouma/nineth/service/UserService.java

@@ -45,7 +45,7 @@ import org.springframework.data.domain.PageImpl;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import javax.persistence.criteria.Predicate;
@@ -81,6 +81,7 @@ public class UserService {
     private RocketMQTemplate              rocketMQTemplate;
     private GeneralProperties             generalProperties;
     private RedisTemplate<String, Object> redisTemplate;
+    private PasswordEncoder               passwordEncoder;
 
     public User update(User user) {
         if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
@@ -145,14 +146,33 @@ public class UserService {
     }
 
     public User create(UserRegister userRegister) {
+        long ts = System.currentTimeMillis();
         User user = new User();
         BeanUtils.copyProperties(userRegister, user);
         user.setShareRatio(sysConfigService.getBigDecimal("share_ratio"));
         user.setAuthStatus(AuthStatus.NOT_AUTH);
         if (StringUtils.isNotBlank(userRegister.getPassword())) {
-            user.setPassword(new BCryptPasswordEncoder().encode(userRegister.getPassword()));
+            user.setPassword(passwordEncoder.encode(userRegister.getPassword()));
         }
-        return userRepo.save(user);
+        log.info("copy user {}ms", System.currentTimeMillis() - ts);
+        ts = System.currentTimeMillis();
+        user = userRepo.save(user);
+        log.info("save user {}ms", System.currentTimeMillis() - ts);
+        return user;
+    }
+
+    public User create(String username, String phone, String password) {
+        long ts = System.currentTimeMillis();
+        User user = new User();
+        user.setUsername(username);
+        user.setPhone(phone);
+        user.setShareRatio(BigDecimal.ZERO);
+        user.setAuthStatus(AuthStatus.NOT_AUTH);
+        log.info("copy user {}ms", System.currentTimeMillis() - ts);
+        ts = System.currentTimeMillis();
+        user = userRepo.save(user);
+        log.info("save user {}ms", System.currentTimeMillis() - ts);
+        return user;
     }
 
     @EventListener
@@ -246,79 +266,8 @@ public class UserService {
     }
 
     public User testPhoneRegister(String phone) {
-        if (phone == null) {
-            phone = "19" + RandomStringUtils.randomNumeric(11);
-        }
-        String password = "123456";
-        String inviteCode = null;
-        Long invitor = null;
-        Long collectionId = null;
-        String name = "9th_" + RandomStringUtils.randomAlphabetic(8);
-        Invite invite = null;
-        if (StringUtils.isNotBlank(inviteCode)) {
-            invite = inviteRepo.findFirstByCode(inviteCode).orElse(null);
-        }
-        Collection collection;
-        if (collectionId != null) {
-            collection = collectionRepo.findById(collectionId).orElseThrow(new BusinessException("无藏品"));
-//            if (!collection.isOnShelf() || !collection.isSalable()) {
-//                collectionId = null;
-//            } else if (collection.isScheduleSale()) {
-//                if (collection.getStartTime().isAfter(LocalDateTime.now())) {
-//                    collectionId = null;
-//                }
-//            }
-            // 只看是否开去分享
-            if (ObjectUtils.isEmpty(collection.getOpenQuota()) || !collection.getOpenQuota()) {
-                collectionId = null;
-            }
-        }
-        User user = create(UserRegister.builder()
-                .username(name)
-                .nickname(name)
-                .password(password)
-                .avatar(Constants.DEFAULT_AVATAR)
-                .phone(phone)
-                .invitorPhone(Optional.ofNullable(invite).map(Invite::getPhone).orElse(null))
-                .invitorName(Optional.ofNullable(invite).map(Invite::getName).orElse(null))
-                .inviteCode(Optional.ofNullable(invite).map(Invite::getCode).orElse(null))
-                .collectionInvitor(invitor)
-                .collectionId(collectionId)
-                .build());
-        if (invite != null) {
-            inviteRepo.increaseNum(invite.getId());
-        }
-
-        // 加积分
-//        if (collectionId != null && invitor != null) {
-//            // 额度或者额度为空, 库存不为空
-//            if (collection.getStock() > 0 && (collection.getVipQuota() > 0 || ObjectUtils.isEmpty(collection.getVipQuota()))) {
-//                int countUser = userRepo.countAllByCollectionIdAndCollectionInvitor(collectionId, invitor);
-//                // 邀请人数
-//                if (countUser >= collection.getAssignment()) {
-//                    int point = pointRecordRepo.countByUserIdAndCollectionId(invitor, collectionId);
-//                    // 是否已有积分
-//                    if (point <= 0) {
-//                        long count = userRepo.countAllByCollectionIdAndCollectionInvitor(collectionId, invitor);
-//                        if (count >= collection.getAssignment()) {
-//                            // 扣除藏品额度
-//                            if (ObjectUtils.isNotEmpty(collection.getVipQuota())) {
-//                                collectionService.decreaseQuota(collectionId, 1);
-//                            }
-//                            userRepo.updateVipPoint(invitor, 1);
-//                            pointRecordRepo.save(PointRecord.builder()
-//                                    .collectionId(collectionId)
-//                                    .userId(invitor)
-//                                    .type("VIP_POINT")
-//                                    .point(1)
-//                                    .build());
-//
-//                        }
-//                    }
-//                }
-//            }
-//        }
-        return user;
+        return create(RandomStringUtils.randomNumeric(30),
+                RandomStringUtils.randomNumeric(30), "123456");
     }
 
     public void del(Long id) {
@@ -361,7 +310,7 @@ public class UserService {
             throw new BusinessException("账号或密码错误");
         }
         if (StringUtils.isNoneEmpty(user.getPassword()) &&
-                !new BCryptPasswordEncoder().matches(password, user.getPassword())) {
+                !passwordEncoder.matches(password, user.getPassword())) {
             throw new BusinessException("账号或密码错误");
         }
 
@@ -476,7 +425,7 @@ public class UserService {
 
     public String setPassword(Long userId, String password) {
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
-        user.setPassword(new BCryptPasswordEncoder().encode(password));
+        user.setPassword(passwordEncoder.encode(password));
         user = userRepo.save(user);
         return jwtTokenUtil.generateToken(JwtUserFactory.create(user));
     }
@@ -552,13 +501,13 @@ public class UserService {
         if (!StringUtils.equals(phone, user.getPhone())) {
             throw new BusinessException("验证码无效");
         }
-        user.setTradeCode(new BCryptPasswordEncoder().encode(tradeCode));
+        user.setTradeCode(passwordEncoder.encode(tradeCode));
         userRepo.save(user);
     }
 
     public void verifyTradeCode(Long userId, String tradeCode) {
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
-        if (!new BCryptPasswordEncoder().matches(tradeCode, user.getTradeCode())) {
+        if (!passwordEncoder.matches(tradeCode, user.getTradeCode())) {
             throw new BusinessException("校验失败");
         }
     }

+ 9 - 1
src/main/java/com/izouma/nineth/web/TestClassController.java

@@ -7,6 +7,7 @@ import com.izouma.nineth.repo.TestClassRepo;
 import com.izouma.nineth.service.TestClassService;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
@@ -17,6 +18,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/testClass")
 @AllArgsConstructor
+@Slf4j
 public class TestClassController extends BaseController {
     private TestClassService testClassService;
     private TestClassRepo    testClassRepo;
@@ -24,7 +26,13 @@ public class TestClassController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public TestClass save() {
-        return testClassRepo.save(new TestClass("aaa"));
+        long ts = System.currentTimeMillis();
+        TestClass t = new TestClass("aaa");
+        log.info("create testClass {}ms", System.currentTimeMillis() - ts);
+        ts = System.currentTimeMillis();
+        t = testClassRepo.save(t);
+        log.info("save testClass {}ms", System.currentTimeMillis() - ts);
+        return t;
     }
 
     @PostMapping("/save1")

+ 2 - 2
src/main/resources/logback-spring.xml

@@ -8,7 +8,7 @@
                 <pattern>${CONSOLE_LOG_PATTERN}</pattern>
             </encoder>
         </appender>
-        <root level="DEBUG">
+        <root level="INFO">
             <appender-ref ref="CONSOLE"/>
         </root>
         <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
@@ -77,7 +77,7 @@
                 <maxHistory>60</maxHistory>
             </rollingPolicy>
         </appender>
-        <root level="DEBUG">
+        <root level="INFO">
             <appender-ref ref="FILE"/>
         </root>
         <!--        <logger name="org.hibernate.SQL" level="DEBUG"/>-->

+ 21 - 1
src/test/java/com/izouma/nineth/CommonTest.java

@@ -7,7 +7,9 @@ import com.google.common.base.Splitter;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.BlindBoxItem;
+import com.izouma.nineth.domain.TestClass;
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.utils.AESEncryptUtil;
 import com.izouma.nineth.utils.TokenUtils;
 import com.izouma.nineth.web.BaseController;
@@ -455,6 +457,24 @@ public class CommonTest {
 
     @Test
     public void aasdf() {
-        System.out.println(new BCryptPasswordEncoder().matches("123456","$2a$10$hYKQk3SKDqpK2QPDFqGdLekKWFcHs8rvou0hV4TxFy.ylL8PTBo5a"));
+        System.out.println(new BCryptPasswordEncoder().matches("123456", "$2a$10$hYKQk3SKDqpK2QPDFqGdLekKWFcHs8rvou0hV4TxFy.ylL8PTBo5a"));
+    }
+
+
+    @Test
+    public void asdfsad() {
+        long t = System.currentTimeMillis();
+        User user = new User();
+        user.setUsername("342353315");
+        user.setPhone("123123123");
+        user.setShareRatio(BigDecimal.ZERO);
+        user.setAuthStatus(AuthStatus.NOT_AUTH);
+        System.out.println(System.currentTimeMillis() - t + "ms");
+
+
+        long t1 = System.currentTimeMillis();
+        TestClass testClass = new TestClass();
+
+        System.out.println(System.currentTimeMillis() - t1 + "ms");
     }
 }

+ 0 - 2
src/test/java/com/izouma/nineth/service/UserServiceTest.java

@@ -42,8 +42,6 @@ public class UserServiceTest extends ApplicationTests {
 
     @Test
     public void findByUsernameAndDelFalse1() {
-        userRepo.findByUsernameAndDelFalse("admin");
-        userRepo.findByUsernameAndDelFalse("admin");
     }
 
     @Test