chenweida пре 7 година
родитељ
комит
2ffe9a060d

+ 8 - 0
base/common-security/src/main/java/com.yihu.base.security/SercurityConfig.java

@ -1,5 +1,6 @@
package com.yihu.base.security;
import com.yihu.base.security.sms.mobile.DefaultMobileCheck;
import com.yihu.base.security.sms.sender.DefaultSmsCodeSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -44,4 +45,11 @@ public class SercurityConfig {
        return new DefaultSmsCodeSender();
    }
    @Bean
    @ConditionalOnMissingBean
    public DefaultMobileCheck defaultMobileCheck() {
        logger.info("使用默认的手机号验证规则");
        return new DefaultMobileCheck();
    }
}

+ 20 - 4
base/common-security/src/main/java/com.yihu.base.security/sms/controller/SmsController.java

@ -1,15 +1,18 @@
package com.yihu.base.security.sms.controller;
import com.yihu.base.security.properties.SecurityProperties;
import com.yihu.base.security.sms.mobile.MobileCheck;
import com.yihu.base.security.sms.process.SmsValidateCodeProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.ServletWebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
 * Created by chenweida on 2017/12/5.
@ -18,6 +21,8 @@ import javax.servlet.http.HttpServletResponse;
public class SmsController {
    @Autowired
    private SmsValidateCodeProcessor smsValidateCodeProcessor;
    @Autowired
    private MobileCheck mobileCheck;
    /**
     * 创建验证码
@ -33,8 +38,19 @@ public class SmsController {
            throws Exception {
        //获取手机号
        String mobile = request.getParameter(SecurityProperties.mobileLoginAccountKey);
        //发送短信验证码并且保存到redis中
        smsValidateCodeProcessor.create(new ServletWebRequest(request, response));
        //验证手机号是否正确
        if (!mobileCheck.checkMobile(mobile)) {
            //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            response.setHeader("content-type", "text/html;charset=UTF-8");
            response.setStatus(HttpStatus.NOT_IMPLEMENTED.value());//参数错误
            PrintWriter pw = response.getWriter();
            pw.write(new String("电话号码格式错误"));
            pw.flush();
        } else {
            //发送短信验证码并且保存到redis中
            smsValidateCodeProcessor.create(new ServletWebRequest(request, response));
        }
    }
}

+ 2 - 8
base/common-security/src/main/java/com.yihu.base.security/sms/filter/SmsvalidateCodeFilter.java

@ -40,12 +40,7 @@ public class SmsvalidateCodeFilter extends OncePerRequestFilter implements Initi
    private SmsValidateCodeProcessor smsValidateCodeProcessor;
    /*
     * (non-Javadoc)
     *
     * @see
     * org.springframework.web.filter.OncePerRequestFilter#doFilterInternal(
     * javax.servlet.http.HttpServletRequest,
     * javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
     *   短信验证码登陆过滤器
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
@ -54,8 +49,7 @@ public class SmsvalidateCodeFilter extends OncePerRequestFilter implements Initi
            if (pathMatcher.match(SecurityProperties.mobileSendSms, request.getRequestURI())) {
                logger.info("校验请求(" + request.getRequestURI() + ")中的验证码");
                try {
                    smsValidateCodeProcessor
                            .validate(new ServletWebRequest(request, response));
                    smsValidateCodeProcessor.validate(new ServletWebRequest(request, response));
                    logger.info("验证码校验通过");
                } catch (ValidateCodeException exception) {
                    authenticationFailureHandler.onAuthenticationFailure(request, response, exception);

+ 44 - 0
base/common-security/src/main/java/com.yihu.base.security/sms/mobile/DefaultMobileCheck.java

@ -0,0 +1,44 @@
package com.yihu.base.security.sms.mobile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Created by chenweida on 2017/12/8.
 */
public class DefaultMobileCheck implements MobileCheck {
    @Override
    public Boolean checkMobile(String mobile) {
        return checkCellphone(mobile);
    }
    /**
     * 验证手机号码
     * <p>
     * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
     * 联通号码段:130、131、132、136、185、186、145
     * 电信号码段:133、153、180、189
     *
     * @param cellphone
     * @return
     */
    public static boolean checkCellphone(String cellphone) {
        String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$";
        return check(cellphone, regex);
    }
    /**
     * 使用正则表达式进行表单验证
     */
    public static boolean check(String str, String regex) {
        boolean flag = false;
        try {
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            flag = matcher.matches();
        } catch (Exception e) {
            flag = false;
        }
        return flag;
    }
}

+ 10 - 0
base/common-security/src/main/java/com.yihu.base.security/sms/mobile/MobileCheck.java

@ -0,0 +1,10 @@
package com.yihu.base.security.sms.mobile;
/**
 * Created by chenweida on 2017/12/8.
 * 验证码验证
 */
public interface MobileCheck {
    Boolean checkMobile(String mobile);
}

+ 9 - 11
base/common-security/src/main/java/com.yihu.base.security/sms/process/SmsValidateCodeProcessor.java

@ -34,16 +34,15 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
    private SmsValidateCodeGenerator smsValidateCodeGenerator;
    /*
     * (non-Javadoc)
     *
     * @see
     * com.imooc.security.core.validate.code.ValidateCodeProcessor#create(org.
     * springframework.web.context.request.ServletWebRequest)
     *  生成验证码
     */
    @Override
    public void create(ServletWebRequest request) throws Exception {
        //生成校验码
        ValidateCode validateCode = generate(request);
        //保存校验码
        save(request, validateCode);
        //发送校验码到手机号
        send(request, validateCode);
    }
@ -66,8 +65,9 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
     */
    private void save(ServletWebRequest request, ValidateCode validateCode) {
        JSONObject jo = new JSONObject();
        jo.put("code", validateCode.getCode());
        jo.put("expireTime", validateCode.getExpireTimeString());
        jo.put("code", validateCode.getCode());//保存验证码
        jo.put("expireTime", validateCode.getExpireTimeString()); //保存超时时间
        jo.put("createTime", validateCode.getCreateTimeString()); //保存超时时间
        redisTemplate.opsForValue().set(key(request), jo.toString());
    }
@ -92,6 +92,7 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
            ValidateCode validateCode = new ValidateCode();
            validateCode.setCode(jo.getString("code"));
            validateCode.setExpireTimeString(jo.getString("expireTime"));
            validateCode.setCreateTimeString(jo.getString("createTime"));
            return validateCode;
        } else {
            return null;
@ -99,7 +100,7 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
    }
    /**
     * 拼凑放在redis的key
     * 拼凑放在redis的key  格式 security:oauth2:smsLogin:{手机号}
     *
     * @param request
     * @return
@ -122,12 +123,9 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
    @SuppressWarnings("unchecked")
    @Override
    public void validate(ServletWebRequest request) {
        String sessionKey = key(request);
        //获取验证码
        ValidateCode validateCode = get(request);
        String codeInRequest;
        //获取请求中的验证码
        try {

+ 2 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/sender/DefaultSmsCodeSender.java

@ -3,6 +3,7 @@
 */
package com.yihu.base.security.sms.sender;
import com.yihu.base.security.sms.exception.ValidateCodeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@ -18,7 +19,7 @@ public class DefaultSmsCodeSender implements SmsCodeSender {
     * @see com.imooc.security.core.validate.code.sms.SmsCodeSender#send(java.lang.String, java.lang.String)
     */
    @Override
    public void send(String mobile, String code) {
    public void send(String mobile, String code) throws ValidateCodeException {
        logger.info("向手机" + mobile + "发送短信验证码" + code);
    }

+ 3 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/sender/SmsCodeSender.java

@ -3,12 +3,14 @@
 */
package com.yihu.base.security.sms.sender;
import com.yihu.base.security.sms.exception.ValidateCodeException;
/**
 * @author chenweida
 *
 */
public interface SmsCodeSender {
	
	void send(String mobile, String code);
	void send(String mobile, String code) throws ValidateCodeException;
}

+ 15 - 0
base/common-security/src/main/java/com.yihu.base.security/sms/vo/ValidateCode.java

@ -18,7 +18,10 @@ public class ValidateCode implements Serializable {
    private LocalDateTime expireTime;
    private LocalDateTime createTime=LocalDateTime.now();
    public ValidateCode() {
    }
    public ValidateCode(String code, int expireIn) {
@ -59,4 +62,16 @@ public class ValidateCode implements Serializable {
    public void setExpireTimeString(String strTime) {
        expireTime = LocalDateTime.parse(strTime, DateTimeFormatter.ISO_DATE_TIME);
    }
    public LocalDateTime getCreateTime() {
        return createTime;
    }
    public String getCreateTimeString() {
        return createTime.format(DateTimeFormatter.ISO_DATE_TIME);
    }
    public void setCreateTimeString(String createTime) {
        this.createTime = LocalDateTime.parse(createTime, DateTimeFormatter.ISO_DATE_TIME);
    }
}

+ 18 - 0
svr/svr-demo/src/main/java/com/yihu/jw/service/MySmsCodeSender.java

@ -0,0 +1,18 @@
package com.yihu.jw.service;
import com.yihu.base.security.sms.sender.SmsCodeSender;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
/**
 * Created by chenweida on 2017/12/8.
 */
@Service
@Primary
public class MySmsCodeSender implements SmsCodeSender {
    @Override
    public void send(String mobile, String code) {
        System.out.println("发送号码:"+mobile);
        System.out.println("发送验证码:"+code);
    }
}