diff --git a/common/common-utils/pom.xml b/common/common-utils/pom.xml index 40082a6..09b891c 100644 --- a/common/common-utils/pom.xml +++ b/common/common-utils/pom.xml @@ -23,5 +23,10 @@ httpclient 4.5.14 + + javax.xml.bind + jaxb-api + 2.1 + diff --git a/common/common-utils/src/main/java/cn/bunny/common/utils/JwtHelper.java b/common/common-utils/src/main/java/cn/bunny/common/utils/JwtHelper.java index f8a792e..de2422e 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/utils/JwtHelper.java +++ b/common/common-utils/src/main/java/cn/bunny/common/utils/JwtHelper.java @@ -11,7 +11,7 @@ public class JwtHelper { public static String createToken(Long userId, String userName) { return Jwts.builder() - .setSubject("OA-USER") + .setSubject("Bunny-USER") .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) .claim("userId", userId) .claim("userName", userName) @@ -27,7 +27,6 @@ public class JwtHelper { Claims claims = claimsJws.getBody(); Integer userId = (Integer) claims.get("userId"); return userId.longValue(); - // return 1L; } public static String getUserName(String token) { diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java index f62701b..82f1b5a 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java @@ -3,6 +3,7 @@ package cn.bunny.common.service.config; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -17,4 +18,18 @@ public class WebMvcConfiguration implements WebMvcConfigurer { registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } + + /** + * 跨域配置 + * + * @param registry 跨域注册表 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + // 是否发送Cookies + .allowCredentials(true) + // 放行哪些原始域 + .allowedOriginPatterns("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").exposedHeaders("*"); + } } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java index 26ad7fb..2910d37 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java @@ -2,6 +2,7 @@ package cn.bunny.common.service.context; public class BaseContext { private static final ThreadLocal userId = new ThreadLocal<>(); + private static final ThreadLocal username = new ThreadLocal(); private static final ThreadLocal wareId = new ThreadLocal<>(); private static final ThreadLocal adminId = new ThreadLocal<>(); @@ -18,6 +19,14 @@ public class BaseContext { userId.remove(); } + public static String getUsername() { + return username.get(); + } + + public static void setUsername(String _username) { + username.set(_username); + } + // adminId 相关 public static Long getAdminId() { return adminId.get(); diff --git a/common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java b/common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java index 5c70d0b..d589e84 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java +++ b/common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java @@ -1,14 +1,17 @@ package cn.bunny.security.config; import cn.bunny.security.custom.CustomPasswordEncoder; -import cn.bunny.security.handelr.*; +import cn.bunny.security.filter.TokenAuthenticationFilter; +import cn.bunny.security.handelr.SecurityAccessDeniedHandler; +import cn.bunny.security.handelr.SecurityAuthenticationEntryPoint; import cn.bunny.security.service.MyUserDetailsService; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.ProviderManager; +import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; @@ -19,8 +22,7 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.web.SecurityFilterChain; - -import static org.springframework.security.config.Customizer.withDefaults; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity @@ -32,62 +34,52 @@ public class WebSecurityConfig { private MyUserDetailsService myUserDetailsService; @Autowired private CustomPasswordEncoder customPasswordEncoder; - @Autowired - private AuthenticationConfiguration authenticationConfiguration; @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.authorizeHttpRequests(authorize -> { - authorize.requestMatchers("/", "/test/**", "/diagram-viewer/**", "/editor-app/**", "/*.html", - "/admin/system/index/login", - "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**", "/doc.html").permitAll().anyRequest().authenticated(); - }); - - // 注销登录 - httpSecurity - .logout(logout -> { - logout.logoutSuccessHandler(new SecurityLogoutSuccessHandler()); + authorize.requestMatchers("/", "/test/**", "/diagram-viewer/**", "/editor-app/**", "/*.html", "/admin/system/index/login", + "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**", "/doc.html").permitAll().anyRequest().authenticated(); }) + // 前端段分离不需要---禁用明文验证 + .httpBasic(AbstractHttpConfigurer::disable) + // 前端段分离不需要---禁用默认登录页 + .formLogin(AbstractHttpConfigurer::disable) + // 前端段分离不需要---禁用退出页 + .logout(AbstractHttpConfigurer::disable) + // 前端段分离不需要---csrf攻击 + .csrf(AbstractHttpConfigurer::disable) + // 跨域访问权限 + .cors(AbstractHttpConfigurer::disable) + // 前后端分离不需要---因为是无状态的 + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling(exception -> { // 请求未授权接口 exception.authenticationEntryPoint(new SecurityAuthenticationEntryPoint()); // 没有权限访问 exception.accessDeniedHandler(new SecurityAccessDeniedHandler()); }) - // 后登录的账号会使先登录的账号失效 - .sessionManagement(session -> { - // 禁用session - session.sessionCreationPolicy(SessionCreationPolicy.STATELESS); - // 最大登录数为1 - session.maximumSessions(1) - // 可以获取到所有登录的用户,以及登录状态,设置session状态 - .sessionRegistry(sessionRegistry()) - // 有相同用户已登录时 - .expiredSessionStrategy(new SecuritySessionInformationExpiredStrategy()); - // 会话失效,同时内容 - session.invalidSessionStrategy(new SecurityInvalidSessionStrategy()); - }); - // 关闭csrf攻击 - httpSecurity.csrf(AbstractHttpConfigurer::disable); - // 跨域访问权限 - httpSecurity.cors(withDefaults()); - // 记住我 - httpSecurity.rememberMe(e -> e.rememberMeParameter("rememberBunny").rememberMeCookieName("rememberBunny").key("BunnyKey")); - // 自定义过滤器 - // httpSecurity.addFilterAt(loginFilter(), UsernamePasswordAuthenticationFilter.class); - // httpSecurity.addFilterBefore(new TokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class); - // httpSecurity.addFilter(new TokenLoginFilter(authenticationConfiguration, redisTemplate)); + // 记住我 + .rememberMe(e -> e.rememberMeParameter("rememberBunny").rememberMeCookieName("rememberBunny").key("BunnyKey")) + // 自定义过滤器 + // .addFilterAt(TokenLoginFilter(), UsernamePasswordAuthenticationFilter.class) + // .addFilter(new TokenLoginFilter(redisTemplate)) + .addFilterBefore(new TokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class); return httpSecurity.build(); } - // 自定义用户认证和密码 @Bean - public AuthenticationManager authenticationManager() { + public AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setPasswordEncoder(customPasswordEncoder); provider.setUserDetailsService(myUserDetailsService); - return new ProviderManager(provider); + return provider; + } + + @Bean + public AuthenticationManager authenticationManager(@NotNull AuthenticationConfiguration config) throws Exception { + return config.getAuthenticationManager(); } @Bean diff --git a/common/spring-security/src/main/java/cn/bunny/security/custom/CustomAuthorizationManager.java b/common/spring-security/src/main/java/cn/bunny/security/custom/CustomAuthorizationManager.java index 8c088f2..7e09fb9 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/custom/CustomAuthorizationManager.java +++ b/common/spring-security/src/main/java/cn/bunny/security/custom/CustomAuthorizationManager.java @@ -14,6 +14,7 @@ import java.util.function.Supplier; public class CustomAuthorizationManager implements AuthorizationManager { @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext object) { + String token = object.getRequest().getHeader("token"); return null; } } diff --git a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java b/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java index 2ac9138..bc7511e 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java +++ b/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java @@ -1,13 +1,13 @@ package cn.bunny.security.filter; -import cn.bunny.common.result.Result; -import cn.bunny.common.utils.ResponseUtil; -import cn.bunny.enums.ResultCodeEnum; +import cn.bunny.common.service.context.BaseContext; +import cn.bunny.common.utils.JwtHelper; import com.alibaba.fastjson2.JSON; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.jetbrains.annotations.NotNull; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -28,40 +28,46 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { } @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - // 如果是登录接口,直接放行 - if ("/admin/system/index/login".equals(request.getRequestURI())) { - chain.doFilter(request, response); + protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain chain) throws ServletException, IOException { + String token = request.getHeader("token"); + + // login请求就没token,直接放行,因为后边有其他的过滤器 + if (token == null) { + doFilter(request, response, chain); return; } + // 如果是登录接口,直接放行 UsernamePasswordAuthenticationToken authentication = getAuthentication(request); - - if (authentication != null) { - SecurityContextHolder.getContext().setAuthentication(authentication); - chain.doFilter(request, response); - } else { - ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_MOBLE_ERROR)); - } + SecurityContextHolder.getContext().setAuthentication(authentication); + chain.doFilter(request, response); } private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { - // 请求头是否有Token + // 请求头是否有token String token = request.getHeader("token"); - if (!StringUtils.hasText(token)) { - Object authObject = redisTemplate.opsForValue().get(token); - String authString = JSON.toJSONString(authObject); - if (StringUtils.hasText(authString)) { - List maplist = JSON.parseArray(authString, Map.class); - System.out.println(maplist); - List authList = new ArrayList<>(); - for (Map map : maplist) { - String authority = (String) map.get("roleList"); - authList.add(new SimpleGrantedAuthority(authority)); + if (!StringUtils.isEmpty(token)) { + String username = JwtHelper.getUserName(token); + if (!StringUtils.isEmpty(username)) { + // 当前用户信息放到ThreadLocal里面 + BaseContext.setUserId(JwtHelper.getUserId(token)); + BaseContext.setUsername(username); + + // 通过username从redis获取权限数据 + String authString = (String) redisTemplate.opsForValue().get(username); + // 把redis获取字符串权限数据转换要求集合类型 List + if (!StringUtils.isEmpty(authString)) { + List maplist = JSON.parseArray(authString, Map.class); + System.out.println(maplist); + List authList = new ArrayList<>(); + for (Map map : maplist) { + String authority = (String) map.get("authority"); + authList.add(new SimpleGrantedAuthority(authority)); + } + return new UsernamePasswordAuthenticationToken(username, null, authList); + } else { + return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); } - return new UsernamePasswordAuthenticationToken(token, null, authList); - } else { - return new UsernamePasswordAuthenticationToken(token, null, new ArrayList<>()); } } return null; diff --git a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java b/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java index 0ae2a91..b992753 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java +++ b/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java @@ -1,6 +1,7 @@ package cn.bunny.security.filter; import cn.bunny.common.result.Result; +import cn.bunny.common.utils.JwtHelper; import cn.bunny.common.utils.ResponseUtil; import cn.bunny.enums.ResultCodeEnum; import cn.bunny.security.custom.CustomUser; @@ -12,7 +13,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @@ -21,13 +21,12 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import java.util.UUID; public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { private final RedisTemplate redisTemplate; - public TokenLoginFilter(AuthenticationConfiguration authenticationConfiguration, RedisTemplate redisTemplate) throws Exception { - this.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); + // 构造方法 + public TokenLoginFilter(RedisTemplate redisTemplate) { this.setPostOnly(false); // 指定登录接口及提交方式,可以指定任意路径 this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/admin/system/index/login", "POST")); @@ -36,7 +35,8 @@ public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { // 登录认证 // 获取输入的用户名和密码,调用方法认证 - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException { try { // 获取用户信息 LoginVo loginVo = new ObjectMapper().readValue(request.getInputStream(), LoginVo.class); @@ -54,10 +54,10 @@ public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { // 获取当前用户 CustomUser customUser = (CustomUser) auth.getPrincipal(); // 生成token - String token = UUID.randomUUID().toString(); + String token = JwtHelper.createToken(customUser.getSysUser().getId(), customUser.getSysUser().getUsername()); - // 获取当前用户权限数据,放到Redis里面 key:token value:权限数据 - redisTemplate.opsForValue().set(token, JSON.toJSONString(customUser.getAuthorities())); + // 获取当前用户权限数据,放到Redis里面 key:username value:权限数据 + redisTemplate.opsForValue().set(customUser.getUsername(), JSON.toJSONString(customUser.getAuthorities())); // 返回 Map map = new HashMap<>(); @@ -69,4 +69,4 @@ public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) { ResponseUtil.out(response, Result.error(null, ResultCodeEnum.LOGIN_MOBLE_ERROR)); } -} \ No newline at end of file +} diff --git a/service/src/main/java/cn/bunny/service/controller/BaseController.java b/service/src/main/java/cn/bunny/service/controller/BaseController.java index bf0b790..046b69d 100644 --- a/service/src/main/java/cn/bunny/service/controller/BaseController.java +++ b/service/src/main/java/cn/bunny/service/controller/BaseController.java @@ -4,6 +4,8 @@ import cn.bunny.common.result.Result; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.session.SessionInformation; import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.userdetails.User; @@ -25,6 +27,13 @@ public class BaseController { return "欢迎访问"; } + @Operation(summary = "Security上下文对象", description = "Security上下文对象") + @GetMapping("/test/getSecurityHolder") + public Result getSecurityHolder() { + SecurityContext context = SecurityContextHolder.getContext(); + return Result.success(context); + } + @Operation(summary = "当前所有登录的用户", description = "当前所有登录的用户") @GetMapping("/test/getAllUserLogin") public Result getAllUserLogin() { diff --git a/service/src/main/java/cn/bunny/service/security/MyUserDetailsService.java b/service/src/main/java/cn/bunny/service/security/MyUserDetailsService.java index 629dc06..18ca414 100644 --- a/service/src/main/java/cn/bunny/service/security/MyUserDetailsService.java +++ b/service/src/main/java/cn/bunny/service/security/MyUserDetailsService.java @@ -5,8 +5,8 @@ import cn.bunny.common.service.exception.BunnyException; import cn.bunny.entity.system.SysRole; import cn.bunny.entity.system.SysUser; import cn.bunny.security.custom.CustomUser; +import cn.bunny.service.mapper.SysRoleMapper; import cn.bunny.service.mapper.SysUserMapper; -import cn.bunny.service.service.SysRoleService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -21,11 +21,12 @@ public class MyUserDetailsService implements cn.bunny.security.service.MyUserDet @Autowired private SysUserMapper sysUserMapper; @Autowired - private SysRoleService sysRoleService; + private SysRoleMapper sysRoleMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + List sysRoleList = sysRoleMapper.selectList(null); if (sysUser == null) { throw new UsernameNotFoundException(MessageConstant.USER_DOES_NOT_EXIST); } @@ -34,7 +35,6 @@ public class MyUserDetailsService implements cn.bunny.security.service.MyUserDet throw new BunnyException(MessageConstant.ACCOUNT_LOCKED); } - List sysRoleList = sysRoleService.list(); List roleAuthoritieList = sysRoleList.stream().map(SysRole::getRoleCode).toList(); return new CustomUser(sysUser, AuthorityUtils.createAuthorityList(roleAuthoritieList)); } diff --git a/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java index dd1a0db..c20c89f 100644 --- a/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java +++ b/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java @@ -2,6 +2,7 @@ package cn.bunny.service.service.impl; import cn.bunny.common.constant.MessageConstant; import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.common.utils.JwtHelper; import cn.bunny.common.utils.SnowflakeIdGenerator; import cn.bunny.entity.system.Login; import cn.bunny.entity.system.SysUser; @@ -16,8 +17,6 @@ import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; @@ -48,7 +47,6 @@ public class SysUserServiceImpl extends ServiceImpl impl public Login login(LoginVo vo) { String username = vo.getUsername(); String password = vo.getPassword(); - long snowId = snowflakeIdGenerator.nextId(); // 查询用户信息 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SysUser::getUsername, username); @@ -69,12 +67,13 @@ public class SysUserServiceImpl extends ServiceImpl impl if (!md5DigestAsHexPassword.equals(sysUser.getPassword())) { throw new BunnyException(MessageConstant.PASSWORD_ERROR); } - - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(vo.getUsername(), vo.getPassword()); - Authentication authenticate = authenticationManager.authenticate(authentication); - redisTemplate.opsForValue().set(String.valueOf(snowId), authenticate); // 添加token - return Login.builder().token(String.valueOf(snowId)).build(); + String token = JwtHelper.createToken(sysUser.getId(), sysUser.getUsername()); + // UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(vo.getUsername(), vo.getPassword()); + // Authentication authenticate = authenticationManager.authenticate(authentication); + // long snowId = snowflakeIdGenerator.nextId(); + // redisTemplate.opsForValue().set(String.valueOf(snowId), authenticate); + return Login.builder().token(token).build(); } /** diff --git a/service/src/main/java/cn/bunny/service/task/TemplateTask.java b/service/src/main/java/cn/bunny/service/task/TemplateTask.java index 3016f27..d28941b 100644 --- a/service/src/main/java/cn/bunny/service/task/TemplateTask.java +++ b/service/src/main/java/cn/bunny/service/task/TemplateTask.java @@ -2,11 +2,13 @@ package cn.bunny.service.task; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +@Component @Slf4j public class TemplateTask { - @Scheduled(cron = "0/1 * * * * ?") + @Scheduled(cron = "0/1 5 * * * ?") public void templateTask() { - log.warn("TemplateTask..."); + log.info("定时任务执行..."); } } diff --git a/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java b/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java new file mode 100644 index 0000000..f952f74 --- /dev/null +++ b/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java @@ -0,0 +1,27 @@ +package cn.bunny; + +import cn.bunny.security.custom.CustomPasswordEncoder; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.crypto.password.PasswordEncoder; + +@SpringBootTest(classes = CustomPasswordEncoder.class) +class CustomPasswordEncoderTest { + @Autowired + private CustomPasswordEncoder customPasswordEncoder; + @Autowired + private PasswordEncoder passwordEncoder; + + @Test + void testCustomPasswordEncoder() { + String encode = customPasswordEncoder.encode("111111"); + System.out.println(encode); + } + + @Test + void testPasswordEncoder() { + String encode = passwordEncoder.encode("111111"); + System.out.println(encode); + } +} \ No newline at end of file