| 
					
				 | 
			
			
				@ -2,6 +2,8 @@ package com.yihu.jw.security.oauth2.provider.endpoint; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.fasterxml.jackson.databind.ObjectMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.google.code.kaptcha.impl.DefaultKaptcha; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.google.code.kaptcha.util.Config; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.entity.base.login.BaseLoginLogDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.entity.base.patient.BasePatientDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.entity.ylzinfo.OauthYlzConfigDO; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -20,6 +22,9 @@ import com.yihu.jw.security.service.OauthYlzConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.security.utils.DateUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.security.utils.SerializeUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.utils.security.RSAUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import io.swagger.annotations.Api; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import io.swagger.annotations.ApiOperation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import io.swagger.annotations.ApiParam; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.commons.collections.map.HashedMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.slf4j.LoggerFactory; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -49,21 +54,24 @@ import org.springframework.web.context.request.RequestContextHolder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.web.context.request.ServletRequestAttributes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.annotation.PostConstruct; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.imageio.ImageIO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.servlet.http.Cookie; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.servlet.http.HttpServletRequest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.servlet.http.HttpServletResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.servlet.http.HttpSession; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.awt.image.BufferedImage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.io.ByteArrayOutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.security.KeyPair; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.security.PrivateKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.security.interfaces.RSAPrivateKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.security.interfaces.RSAPublicKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.text.SimpleDateFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.Date; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.HashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.UUID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.concurrent.TimeUnit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import sun.misc.BASE64Encoder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * <p> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -74,6 +82,7 @@ import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * @author Progr1mmer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * @created on 2018/8/29 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@Api(description = "认证服务") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@RestController 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				public class WlyyLoginEndpoint extends AbstractEndpoint { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -109,6 +118,7 @@ public class WlyyLoginEndpoint extends AbstractEndpoint { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private OauthWlyyConfigService oauthWlyyConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @PostConstruct 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private void init() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        super.setTokenGranter(tokenGranter); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -122,6 +132,8 @@ public class WlyyLoginEndpoint extends AbstractEndpoint { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *                    captcha 验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *                    password 密码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *                    username 用户名/手机/身份证号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *                    key 图形验证码键值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *                    text 用户输入的图形验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *                    login_type 用户类型 1或默认为user,2:医生登录,3:患者登录,4:第三方同步账号登录,5.易联众居民健康卡授权登录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param httpSession 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -129,6 +141,16 @@ public class WlyyLoginEndpoint extends AbstractEndpoint { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @RequestMapping(value = "/oauth/login", method = RequestMethod.POST) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public ResponseEntity<Oauth2Envelop<WlyyUserSimple>> login(@RequestParam Map<String, String> parameters, HttpSession httpSession) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //图形验证码验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String key = parameters.get("key"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String text = parameters.get("text"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(org.apache.commons.lang3.StringUtils.isNotBlank(key)&& org.apache.commons.lang3.StringUtils.isNotBlank(text)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(!verifyCaptcha(key,text)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new InvalidRequestException("img_captcha error"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String username = parameters.get("username"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (StringUtils.isEmpty(username)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw new InvalidRequestException("username"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -832,4 +854,49 @@ public class WlyyLoginEndpoint extends AbstractEndpoint { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return ObjEnvelop.getSuccess("success",map); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @RequestMapping(value = "/oauth/imgCaptcha", method = RequestMethod.GET) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @ApiOperation("生成验证码") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public ObjEnvelop createCaptcha()throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return ObjEnvelop.getSuccess("success",generateCaptcha()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private Map<String, String> generateCaptcha() throws IOException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        DefaultKaptcha captchaProducer = new DefaultKaptcha(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Properties properties = new Properties(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        properties.put("kaptcha.textproducer.font.color", "blue"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        properties.put("kaptcha.textproducer.font.size", "45"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        properties.put("kaptcha.textproducer.char.length", "4"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        properties.put("kaptcha.textproducer.char.string","0123456789QWERTYUIOPLKJHGFDSAZXCVBNM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Config config = new Config(properties); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        captchaProducer.setConfig(config); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String captchaText = captchaProducer.createText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        BufferedImage image = captchaProducer.createImage(captchaText); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImageIO.write(image, "png", outputStream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String base64Img = new BASE64Encoder().encode(outputStream.toByteArray()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        base64Img = "data:image/jpeg;base64,"+base64Img.replaceAll("\n", "").replaceAll("\r", "");//格式化处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String key = "hwlyy:captcha:" + UUID.randomUUID().toString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Map<String, String> data = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        data.put("key", key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        data.put("image", base64Img); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        data.put("format", "png"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        redisTemplate.opsForValue().set(key,captchaText.toLowerCase(),5, TimeUnit.MINUTES); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public boolean verifyCaptcha(String key,String text){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        boolean pass = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String captcha = redisTemplate.opsForValue().get(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (org.apache.commons.lang3.StringUtils.isNotBlank(captcha)&& captcha.equals(text.toLowerCase())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            pass = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redisTemplate.delete(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return pass; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |