增加短信登录方式

master
bynt 1 year ago
parent 0ec15728a7
commit f2358d64c7

@ -1,15 +1,13 @@
package com.baiye.core.util;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
/**
* IP
@ -19,33 +17,69 @@ import java.util.stream.Collectors;
@Slf4j
public class IPUtil {
private static final boolean ipLocal = false;
/**
* ip
*/
public static String getCityInfo(String ip) {
if (ipLocal) {
//待开发
return null;
} else {
return getHttpCityInfo(ip);
}
}
/**
* ip
* 使
*/
public static String getHttpCityInfo(String ip) {
String api = String.format("http://whois.pconline.com.cn/ipJson.jsp?ip=%s&json=true", ip);
String body = HttpRequest.get(api).execute().charset("GBK").body();
return (String) new JSONObject(body).get("addr");
}
public static void main(String[] args) {
ArrayList<String> strings = Lists.newArrayList("", "1");
List<String> collect = strings.stream().filter(s -> StringUtils.isNotBlank(s)).collect(Collectors.toList());
System.out.printf("");
}
private static final boolean ipLocal = false;
public static final String UNKNOWN = "unknown";
public static final int LENGTH = 15;
/**
* ip
*/
public static String getCityInfo(String ip) {
if (ipLocal) {
//待开发
return null;
} else {
return getHttpCityInfo(ip);
}
}
/**
* ip
* 使
*/
public static String getHttpCityInfo(String ip) {
String api = String.format("http://whois.pconline.com.cn/ipJson.jsp?ip=%s&json=true", ip);
String body = HttpRequest.get(api).execute().charset("GBK").body();
return (String) new JSONObject(body).get("addr");
}
/**
* IP 使Nginx request.getRemoteAddr()IP 使X-Forwarded-ForIP
* X-Forwarded-ForunknownIPIP
*/
public static String getIpAddress() {
String ip = null;
try {
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} catch (Exception e) {
log.error("IpUtils ERROR ", e);
}
// 使用代理则获取第一个IP地址
if (StringUtils.isNotEmpty(ip) && ip.length() > LENGTH) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}
}

@ -693,4 +693,19 @@ public class RedisUtils {
log.debug("缓存删除数量:" + count + "个");
log.debug("--------------------------------------------");
}
/**
*
*
* @param k
* @param delta (0)
* @return
*/
public long increment(String k, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(k, delta);
}
}

@ -43,7 +43,7 @@ public class CustomizeUserAuthenticationConverter implements UserAuthenticationC
public Authentication extractAuthentication(Map<String, ?> map) {
if (map.containsKey(USERNAME)) {
Collection<? extends GrantedAuthority> authorities = getAuthorities(map);
Integer id = (Integer) map.get(SecurityConstants.DETAILS_USER_ID);
String id = map.get(SecurityConstants.DETAILS_USER_ID).toString();
String username = (String) map.get(SecurityConstants.DETAILS_USERNAME);
// TODO: 2020/8/10 获取dataScopes
/*LoginUser loginUser = new LoginUser(userId,username,N_A,true,true,true,true,

@ -34,7 +34,7 @@ public class ResourceAuthExceptionEntryPoint implements AuthenticationEntryPoint
Map<String,Object> result = new HashMap<>(6);
result.put("code", HttpStatus.UNAUTHORIZED.value());
if (e!=null){
result.put("msg","error");
result.put("message",ResultCode.USER_ACCOUNT_EXPIRED.getMsg());
result.put("data", ResultCode.USER_ACCOUNT_EXPIRED.getMsg());
}
response.setStatus(HttpStatus.UNAUTHORIZED.value());

@ -3,6 +3,8 @@ package com.baiye.config;
import com.baiye.component.CustomizeBearerTokenExtractor;
import com.baiye.component.CustomizeUserAuthenticationConverter;
import com.baiye.component.ResourceAuthExceptionEntryPoint;
import com.baiye.core.util.RedisUtils;
import com.baiye.handle.CustomAuthenticationFailureHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@ -28,14 +30,18 @@ import org.springframework.web.client.RestTemplate;
@RequiredArgsConstructor
public class ResourceServerSecurityConfig extends ResourceServerConfigurerAdapter {
private final CustomAuthenticationFailureHandler customAuthenticationFailureHandler;
/**
*
*/
private final ResourceAuthExceptionEntryPoint exceptionEntryPoint;
private final RemoteTokenServices remoteTokenServices;
/**
*
*/
@ -56,6 +62,9 @@ public class ResourceServerSecurityConfig extends ResourceServerConfigurerAdapte
*/
private final CustomizeBearerTokenExtractor bearerTokenExtractor;
private final RedisUtils redisUtils;
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
// 去除 ROLE_ 前缀
@ -95,4 +104,6 @@ public class ResourceServerSecurityConfig extends ResourceServerConfigurerAdapte
registry.anyRequest().authenticated()
.and().csrf().disable();
}
}

@ -1,17 +1,23 @@
package com.baiye.controller;
import com.baiye.service.SmsService;
import com.baiye.BadRequestException;
import com.baiye.core.base.api.Result;
import com.baiye.core.util.MobileUtil;
import com.baiye.service.SmsService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Enzo
* @date : 2023/3/15
*/
@Slf4j
@RestController
@RequestMapping("/sms")
@Api(value = "阿里云短信服务")
@ -21,12 +27,12 @@ public class SmsController {
private final SmsService smsService;
@GetMapping("/getCode")
@ResponseBody
public Result<String> sendSMS(@RequestParam String mobile) {
if (StringUtils.isBlank(mobile) || !MobileUtil.checkPhone(mobile)) {
return Result.fail("发送短信失败");
throw new BadRequestException("发送短信失败");
}
return Boolean.TRUE.equals(smsService.sendSms(mobile)) ? Result.success() : Result.fail();
}
}

@ -20,61 +20,61 @@ import java.util.Objects;
*/
public class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
/**
*
*/
private String mobileParameter = Oauth2Constant.DEFAULT_PARAMETER_NAME_MOBILE;
/**
*
*/
private String mobileParameter = Oauth2Constant.DEFAULT_PARAMETER_NAME_MOBILE;
private boolean postOnly = true;
private boolean postOnly = true;
public SmsCodeAuthenticationFilter() {
super(new AntPathRequestMatcher(Oauth2Constant.OAUTH_MOBILE, "POST"));
}
public SmsCodeAuthenticationFilter() {
super(new AntPathRequestMatcher(Oauth2Constant.OAUTH_MOBILE, "POST"));
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (postOnly && !FormSubmitEvent.MethodType.POST.name().equals(request.getMethod())) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (postOnly && !FormSubmitEvent.MethodType.POST.name().equals(request.getMethod())) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
}
// 获取请求中的参数值
String mobile = obtainMobile(request);
// 获取请求中的参数值
String mobile = obtainMobile(request);
if (Objects.isNull(mobile)) {
mobile = "";
}
if (Objects.isNull(mobile)) {
mobile = "";
}
mobile = mobile.trim();
mobile = mobile.trim();
SmsCodeAuthenticationToken authRequest = new SmsCodeAuthenticationToken(mobile);
SmsCodeAuthenticationToken authRequest = new SmsCodeAuthenticationToken(mobile);
// Allow subclasses to set the "details" property
setDetails(request, authRequest);
// Allow subclasses to set the "details" property
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
return this.getAuthenticationManager().authenticate(authRequest);
}
/**
*
*/
protected String obtainMobile(HttpServletRequest request) {
return request.getParameter(mobileParameter);
}
/**
*
*/
protected String obtainMobile(HttpServletRequest request) {
return request.getParameter(mobileParameter);
}
protected void setDetails(HttpServletRequest request, SmsCodeAuthenticationToken authRequest) {
authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
}
protected void setDetails(HttpServletRequest request, SmsCodeAuthenticationToken authRequest) {
authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
}
public void setMobileParameter(String mobileParameter) {
Assert.hasText(mobileParameter, "Mobile parameter must not be empty or null");
this.mobileParameter = mobileParameter;
}
public void setMobileParameter(String mobileParameter) {
Assert.hasText(mobileParameter, "Mobile parameter must not be empty or null");
this.mobileParameter = mobileParameter;
}
public void setPostOnly(boolean postOnly) {
this.postOnly = postOnly;
}
public void setPostOnly(boolean postOnly) {
this.postOnly = postOnly;
}
public final String getMobileParameter() {
return mobileParameter;
}
public final String getMobileParameter() {
return mobileParameter;
}
}

@ -1,15 +1,13 @@
package com.baiye.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.BadRequestException;
import com.baiye.Member;
import com.baiye.User;
import com.baiye.annotation.Inner;
import com.baiye.core.page.PageResult;
import com.baiye.dto.UserDto;
import com.baiye.dto.UserSmallDto;
import com.baiye.query.MemberQueryCriteria;
import com.baiye.query.UserQueryCriteria;
import com.baiye.service.IMemberService;
import com.baiye.service.IUserService;
import com.baiye.util.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -77,4 +75,14 @@ public class MemberController {
return ResponseEntity.ok(this.memberService.createOrUpdate(mobile));
}
@ApiOperation("通过用户id查询用户姓名")
@GetMapping(value = "/info")
public ResponseEntity<Map<String,Object>> queryMemberByUserId(@RequestParam Long id) {
Member member = this.memberService.getById(id);
if (ObjectUtil.isNull(member)){
return ResponseEntity.ok(BeanUtil.beanToMap(member));
}
throw new BadRequestException("查询用户失败");
}
}

@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
@ -133,7 +134,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
@Cacheable(cacheNames = "memberCache", key = "'username:' + #p0")
public UserSmallDto getUserDetailsByMobile(String mobile) {
UserSmallDto userDetails = this.memberMapper.getUserDetails(mobile);
userDetails.setRoleNames(Collections.emptyList());
userDetails.setRoleNames(Lists.newArrayList(userDetails.getUsername()));
userDetails.setPermissions(Collections.emptyList());
return userDetails;
}

@ -19,7 +19,7 @@
</resultMap>
<resultMap id="userDetailsMap" type="com.baiye.dto.UserSmallDto">
<id property="id" column="user_id"/>
<id property="id" column="member_id"/>
<result property="username" column="username"/>
<result property="isAdmin" column="is_admin"/>
<result property="password" column="password"/>
@ -81,7 +81,7 @@
<select id="getUserDetails" resultMap="userDetailsMap">
select me.member_id as id,
select me.member_id,
me.username,
me.password,
me.enabled

@ -1,11 +1,18 @@
package com.baiye.controller;
import com.baiye.feign.UserFeignService;
import com.baiye.util.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* @author Enzo
* @date : 2023/4/17
@ -17,5 +24,13 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/xhs/member")
public class MemberController {
private final UserFeignService userFeignService;
@ApiOperation("获取当前的用户信息")
@GetMapping(value = "/info")
public ResponseEntity<Map<String, Object>> getUserInfo() {
Long currentUserId = SecurityUtils.getCurrentUserId();
return this.userFeignService.getCurrentUserInfo(currentUserId);
}
}

@ -1,7 +1,6 @@
package com.baiye.controller;
import cn.hutool.http.HttpRequest;
import com.baiye.annotation.Inner;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
@ -19,7 +18,6 @@ public class RequestXhsApi {
@GetMapping("/requestXhsApi")
@ApiOperation("验证名称重复")
@Inner(value = false)
public String requestXhsApi(@RequestParam("cid") String cid) {
String requestUrl = "https://creator.xiaohongshu.com/api/galaxy/creator/home/personal_info";
Map<String, String> headMap = new HashMap<>();
@ -44,7 +42,6 @@ public class RequestXhsApi {
}
@GetMapping("/xhsApi")
@Inner(value = false)
public String xhsApi(@RequestParam("cid") String cid) {
String requestUrl = "https://edith.xiaohongshu.com/api/sns/web/v1/user/me";
Map<String, String> map = new HashMap<>();

@ -6,13 +6,30 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
/**
* @author jt
*/
@FeignClient(name = "backstage-server")
public interface UserFeignService {
/**
* id
* @param id
* @return
*/
@ApiOperation("通过用户id查询用户姓名")
@GetMapping(value = "/users/id")
ResponseEntity<String> queryByUserId(@RequestParam Long id);
/**
* id
* @param memberId
* @return
*/
@ApiOperation("通过用户id查询用户姓名")
@GetMapping(value = "/member/info")
ResponseEntity<Map<String,Object>> getCurrentUserInfo(@RequestParam Long memberId);
}

Loading…
Cancel
Save