diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfig.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfig.java index 1e8b5db7947a27ec36915220810ecd3cf23be2e9..356b9c7ee620ffa542e455a741a286203b726bc2 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfig.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfig.java @@ -17,7 +17,7 @@ package com.pig4cloud.pig.auth.config; import com.pig4cloud.pig.auth.converter.CustomAccessTokenConverter; -import com.pig4cloud.pig.auth.grant.ResourceOwnerPhoneTokenGranter; +import com.pig4cloud.pig.common.security.grant.ResourceOwnerPhoneTokenGranter; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.component.PigWebResponseExceptionTranslator; @@ -92,8 +92,9 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap // 获取默认授权类型 TokenGranter tokenGranter = endpoints.getTokenGranter(); ArrayList tokenGranters = new ArrayList<>(Arrays.asList(tokenGranter)); - ResourceOwnerPhoneTokenGranter resourceOwnerPhoneTokenGranter = new ResourceOwnerPhoneTokenGranter(authenticationManager, - endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()); + ResourceOwnerPhoneTokenGranter resourceOwnerPhoneTokenGranter = new ResourceOwnerPhoneTokenGranter( + authenticationManager, endpoints.getTokenServices(), endpoints.getClientDetailsService(), + endpoints.getOAuth2RequestFactory()); tokenGranters.add(resourceOwnerPhoneTokenGranter); CompositeTokenGranter compositeTokenGranter = new CompositeTokenGranter(tokenGranters); endpoints.tokenGranter(compositeTokenGranter); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfigurer.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfigurer.java index f8a9c94ddcf4527fe39eb3cd7d1e446b3ce80863..bcb6d41ca58c305e5d4598be4c21e88f26852a2e 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfigurer.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfigurer.java @@ -16,7 +16,7 @@ package com.pig4cloud.pig.auth.config; -import com.pig4cloud.pig.auth.grant.PhoneAuthenticationProvider; +import com.pig4cloud.pig.common.security.grant.PhoneAuthenticationProvider; import com.pig4cloud.pig.common.security.handler.FormAuthenticationFailureHandler; import com.pig4cloud.pig.common.security.handler.SsoLogoutSuccessHandler; import lombok.AllArgsConstructor; @@ -50,9 +50,8 @@ public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override @SneakyThrows protected void configure(HttpSecurity http) { - http.authenticationProvider(phoneAuthenticationProvider()) - .formLogin().loginPage("/token/login").loginProcessingUrl("/token/form") - .failureHandler(authenticationFailureHandler()).and().logout() + http.authenticationProvider(phoneAuthenticationProvider()).formLogin().loginPage("/token/login") + .loginProcessingUrl("/token/form").failureHandler(authenticationFailureHandler()).and().logout() .logoutSuccessHandler(logoutSuccessHandler()).deleteCookies("JSESSIONID").invalidateHttpSession(true) .and().authorizeRequests().antMatchers("/token/**", "/actuator/**", "/mobile/**").permitAll() .anyRequest().authenticated().and().csrf().disable(); @@ -87,7 +86,6 @@ public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { /** * 支持SSO 退出 - * * @return LogoutSuccessHandler */ @Bean @@ -98,7 +96,6 @@ public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { /** * https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-storage-updated * Encoded password does not look like BCrypt - * * @return PasswordEncoder */ @Bean diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java index 63486d741ebdd1366ceab67cc1cf486c4b015392..b15f91e40f7c460c7cd3fb1027814d9b4d1a2687 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java @@ -56,6 +56,10 @@ public interface SecurityConstants { * grant_type */ String REFRESH_TOKEN = "refresh_token"; + + /** + * 手机号登录 + */ String PHONE = "phone"; /** @@ -120,4 +124,9 @@ public interface SecurityConstants { */ long CODE_TIME = 60; + /** + * 验证码长度 + */ + String CODE_SIZE = "6"; + } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/enums/LoginTypeEnum.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/enums/LoginTypeEnum.java index 85bd2ecf1be6d6befbe1b93c09b0ce56d1d727ea..ef4b810bc0d9ba52523ec1a47f78b7e73a2aeda5 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/enums/LoginTypeEnum.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/enums/LoginTypeEnum.java @@ -33,14 +33,9 @@ public enum LoginTypeEnum { PWD("PWD", "账号密码登录"), /** - * QQ登录 + * 验证码登录 */ - QQ("QQ", "QQ登录"), - - /** - * 微信登录 - */ - WECHAT("WX", "微信登录"); + SMS("SMS", "验证码登录"); /** * 类型 diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/PhoneAuthenticationProvider.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/PhoneAuthenticationProvider.java similarity index 51% rename from pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/PhoneAuthenticationProvider.java rename to pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/PhoneAuthenticationProvider.java index efe873de376c6013a6e734b0023f8765da087020..6359b11d6790e99128c61e8c4e44ffd470f5c8fd 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/PhoneAuthenticationProvider.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/PhoneAuthenticationProvider.java @@ -1,14 +1,18 @@ -package com.pig4cloud.pig.auth.grant; +package com.pig4cloud.pig.common.security.grant; +import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.security.service.PigUserDetailsServiceImpl; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; 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.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; /** @@ -16,13 +20,32 @@ import org.springframework.security.crypto.password.PasswordEncoder; * @since 2021-09-14 */ @Slf4j -public class PhoneAuthenticationProvider implements AuthenticationProvider { +public class PhoneAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { @Setter private UserDetailsService userDetailsService; + @Setter private PasswordEncoder passwordEncoder; + /** + * 校验 请求信息userDetails + * @param userDetails 用户信息 + * @param authentication 认证信息 + * @throws AuthenticationException + */ + @Override + protected void additionalAuthenticationChecks(UserDetails userDetails, + UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { + + if (authentication.getCredentials() == null) { + this.logger.debug("Failed to authenticate since no credentials provided"); + throw new BadCredentialsException(this.messages + .getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + + } + @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { @@ -34,29 +57,26 @@ public class PhoneAuthenticationProvider implements AuthenticationProvider { // 手机号 String phone = authentication.getName(); - // 验证码/密码 - // 验证码模式 自己去实现验证码检验 - // 这里的code指的是密码 - String code = authentication.getCredentials().toString(); - - UserDetails userDetails = ((PigUserDetailsServiceImpl) userDetailsService).loadUserByPhone(phone); - - String password = userDetails.getPassword(); - - boolean matches = passwordEncoder.matches(code, password); - if (!matches) { - throw new BeanCreationException("Bad credentials"); + if (StrUtil.equals(phone, "17034642999")) { + throw new UsernameNotFoundException(phone); } + String code = authentication.getCredentials().toString(); + UserDetails userDetails = ((PigUserDetailsServiceImpl) userDetailsService).loadUserByPhone(phone); PhoneAuthenticationToken token = new PhoneAuthenticationToken(userDetails); - token.setDetails(authentication.getDetails()); - return token; } + @Override + protected UserDetails retrieveUser(String phone, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + return null; + } + @Override public boolean supports(Class authentication) { return authentication.isAssignableFrom(PhoneAuthenticationToken.class); } -} \ No newline at end of file + +} diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/PhoneAuthenticationToken.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/PhoneAuthenticationToken.java similarity index 91% rename from pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/PhoneAuthenticationToken.java rename to pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/PhoneAuthenticationToken.java index db0456a28522ad977bfb1e1ad1b39c2121c162b7..4426005956389857984f8f888dc620fb7353a566 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/PhoneAuthenticationToken.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/PhoneAuthenticationToken.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pig.auth.grant; +package com.pig4cloud.pig.common.security.grant; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.authority.AuthorityUtils; @@ -10,7 +10,7 @@ import org.springframework.security.core.userdetails.UserDetails; */ public class PhoneAuthenticationToken extends AbstractAuthenticationToken { - private Object principal; + private final Object principal; // 验证码/密码 private String code; diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/ResourceOwnerPhoneTokenGranter.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/ResourceOwnerPhoneTokenGranter.java similarity index 79% rename from pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/ResourceOwnerPhoneTokenGranter.java rename to pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/ResourceOwnerPhoneTokenGranter.java index b69c13bcf761e92eea279256b211e984d414967e..d396b1ca0534efac898435f97b21167259f4e78c 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/grant/ResourceOwnerPhoneTokenGranter.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/grant/ResourceOwnerPhoneTokenGranter.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pig.auth.grant; +package com.pig4cloud.pig.common.security.grant; import cn.hutool.core.util.StrUtil; import org.springframework.security.authentication.AbstractAuthenticationToken; @@ -27,16 +27,14 @@ public class ResourceOwnerPhoneTokenGranter extends AbstractTokenGranter { private final AuthenticationManager authenticationManager; public ResourceOwnerPhoneTokenGranter(AuthenticationManager authenticationManager, - AuthorizationServerTokenServices tokenServices, - ClientDetailsService clientDetailsService, - OAuth2RequestFactory requestFactory) { + AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, + OAuth2RequestFactory requestFactory) { this(authenticationManager, tokenServices, clientDetailsService, requestFactory, GRANT_TYPE); } protected ResourceOwnerPhoneTokenGranter(AuthenticationManager authenticationManager, - AuthorizationServerTokenServices tokenServices, - ClientDetailsService clientDetailsService, - OAuth2RequestFactory requestFactory, String grantType) { + AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, + OAuth2RequestFactory requestFactory, String grantType) { super(tokenServices, clientDetailsService, requestFactory, grantType); this.authenticationManager = authenticationManager; } @@ -62,13 +60,13 @@ public class ResourceOwnerPhoneTokenGranter extends AbstractTokenGranter { ((AbstractAuthenticationToken) userAuth).setDetails(parameters); try { userAuth = authenticationManager.authenticate(userAuth); - } catch (AccountStatusException ase) { - //covers expired, locked, disabled cases (mentioned in section 5.2, draft 31) + } + catch (AccountStatusException | BadCredentialsException ase) { + // covers expired, locked, disabled cases (mentioned in section 5.2, draft 31) throw new InvalidGrantException(ase.getMessage()); - } catch (BadCredentialsException e) { - // If the phone/code are wrong the spec says we should send 400/invalid grant - throw new InvalidGrantException(e.getMessage()); } + // If the phone/code are wrong the spec says we should send 400/invalid grant + if (userAuth == null || !userAuth.isAuthenticated()) { throw new InvalidGrantException("Could not authenticate user: " + phone); } @@ -76,4 +74,5 @@ public class ResourceOwnerPhoneTokenGranter extends AbstractTokenGranter { OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest); return new OAuth2Authentication(storedOAuth2Request, userAuth); } + } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java index 18f2b189a1f3c23a00a38cfb55f0fb58b0111ba4..198196ab10d9045d55d24a0ae5b88fde20e2e233 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java @@ -62,7 +62,6 @@ public class PigUserDetailsServiceImpl implements UserDetailsService { /** * 用户密码登录 - * * @param username 用户名 * @return */ @@ -84,7 +83,6 @@ public class PigUserDetailsServiceImpl implements UserDetailsService { /** * 手机号码登录 - * * @param phone 手机号码 * @return 用户信息 */ @@ -96,7 +94,6 @@ public class PigUserDetailsServiceImpl implements UserDetailsService { /** * 构建userdetails - * * @param result 用户信息 * @return UserDetails */ diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java index 78a1c63061d7aebbc32c11c686e76378a5c6969f..8c2d742f683399f519896cee78ccc2135152ce5c 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java @@ -70,7 +70,8 @@ public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory infoByPhone(@PathVariable("phone") String phone, @RequestHeader(SecurityConstants.FROM) String from); - /** - * 通过社交账号查询用户、角色信息 - * - * @param inStr appid@code - * @return - */ - @GetMapping("/social/info/{inStr}") - R social(@PathVariable("inStr") String inStr); - /** * 根据部门id,查询对应的用户 id 集合 - * * @param deptIds 部门id 集合 - * @param from 调用标志 + * @param from 调用标志 * @return 用户 id 集合 */ @GetMapping("/user/ids") R> listUserIdByDeptIds(@RequestParam("deptIds") Set deptIds, - @RequestHeader(SecurityConstants.FROM) String from); + @RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/fallback/RemoteUserServiceFallbackImpl.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/fallback/RemoteUserServiceFallbackImpl.java index f11dab68f11e76ae5609e5ff1f65716926eb1d83..23af9e5e7b50e801ecf5363a26d87741719d5797 100755 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/fallback/RemoteUserServiceFallbackImpl.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/fallback/RemoteUserServiceFallbackImpl.java @@ -39,9 +39,8 @@ public class RemoteUserServiceFallbackImpl implements RemoteUserService { /** * 通过用户名查询用户、角色信息 - * * @param username 用户名 - * @param from 内外标志 + * @param from 内外标志 * @return R */ @Override @@ -52,9 +51,8 @@ public class RemoteUserServiceFallbackImpl implements RemoteUserService { /** * 通过手机号码查询用户、角色信息 - * * @param phone 手机号码 - * @param from 调用标志 + * @param from 调用标志 * @return R */ @Override @@ -63,18 +61,6 @@ public class RemoteUserServiceFallbackImpl implements RemoteUserService { return null; } - /** - * 通过社交账号查询用户、角色信息 - * - * @param inStr appid@code - * @return - */ - @Override - public R social(String inStr) { - log.error("feign 查询用户信息失败:{}", inStr, cause); - return null; - } - @Override public R> listUserIdByDeptIds(Set deptIds, String from) { log.error("feign 根据部门ids查询用户Id集合失败:{}", deptIds, cause); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MobileController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MobileController.java new file mode 100644 index 0000000000000000000000000000000000000000..69ddebd3b50edc81d8ed3b4d1bccd2379a76d2e3 --- /dev/null +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MobileController.java @@ -0,0 +1,51 @@ +package com.pig4cloud.pig.admin.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pig.admin.api.entity.SysUser; +import com.pig4cloud.pig.admin.service.MobileService; +import com.pig4cloud.pig.admin.service.SysUserService; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.security.annotation.Inner; +import io.swagger.annotations.Api; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lengleng + * @date 2021/9/16 移动端登录 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/mobile") +@Api(value = "mobile", tags = "手机管理模块") +public class MobileController { + + private final MobileService mobileService; + + private final SysUserService userService; + + @Inner(value = false) + @GetMapping("/{mobile}") + public R sendSmsCode(@PathVariable String mobile) { + return mobileService.sendSmsCode(mobile); + } + + /** + * 获取指定用户全部信息 + * @param phone 手机号 + * @return 用户信息 + */ + @Inner + @GetMapping("/{phone}") + public R infoByPhone(@PathVariable String phone) { + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, phone)); + if (user == null) { + return R.failed(String.format("用户信息为空 %s", phone)); + } + return R.ok(userService.getUserInfo(user)); + } + +} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java index bf00dcbe93c5a20b8498d0d6b854200217e43978..ae191416598d5404d1d510d7ccfc3b171bb8595b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java @@ -94,20 +94,6 @@ public class UserController { return R.ok(userService.getUserInfo(user)); } - /** - * 获取指定用户全部信息 - * @return 用户信息 - */ - @Inner - @GetMapping("/infoByPhone/{phone}") - public R infoByPhone(@PathVariable String phone) { - SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, phone)); - if (user == null) { - return R.failed(String.format("用户信息为空 %s", phone)); - } - return R.ok(userService.getUserInfo(user)); - } - /** * 根据部门id,查询对应的用户 id 集合 * @param deptIds 部门id 集合 diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/MobileService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/MobileService.java new file mode 100644 index 0000000000000000000000000000000000000000..892b8a121ed3caf72dfeddac8191a8d6cc93ec70 --- /dev/null +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/MobileService.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.admin.service; + +import com.pig4cloud.pig.common.core.util.R; + +/** + * @author lengleng + * @date 2018/11/14 + */ +public interface MobileService { + + /** + * 发送手机验证码 + * @param mobile mobile + * @return code + */ + R sendSmsCode(String mobile); + +} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/MobileServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/MobileServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..26495949c73f86091cfbf72581d7bc8a5937a564 --- /dev/null +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/MobileServiceImpl.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.admin.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pig.admin.api.entity.SysUser; +import com.pig4cloud.pig.admin.mapper.SysUserMapper; +import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import com.pig4cloud.pig.common.core.constant.enums.LoginTypeEnum; +import com.pig4cloud.pig.common.core.util.R; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 手机登录相关业务实现 + */ +@Slf4j +@Service +@AllArgsConstructor +public class MobileServiceImpl implements MobileService { + + private final RedisTemplate redisTemplate; + + private final SysUserMapper userMapper; + + /** + * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端 + * @param mobile mobile + * @return code + */ + @Override + public R sendSmsCode(String mobile) { + List userList = userMapper + .selectList(Wrappers.query().lambda().eq(SysUser::getPhone, mobile)); + + if (CollUtil.isEmpty(userList)) { + log.info("手机号未注册:{}", mobile); + return R.ok(Boolean.FALSE, "手机号未注册"); + } + + Object codeObj = redisTemplate.opsForValue() + .get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile); + + if (codeObj != null) { + log.info("手机号验证码未过期:{},{}", mobile, codeObj); + return R.ok(Boolean.FALSE, "验证码发送过频繁"); + } + + String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); + log.debug("手机号生成验证码成功:{},{}", mobile, code); + redisTemplate.opsForValue().set( + CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, + SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + return R.ok(Boolean.TRUE, code); + } + +}