From bbb8a85d9d13656eba305fa020c5d74176a01810 Mon Sep 17 00:00:00 2001 From: "Stormeye.Wu" Date: Wed, 12 Sep 2018 18:59:02 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=90=8E=E5=8F=B0=E6=B7=BB=E5=8A=A0=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81][=E6=96=B0=E5=A2=9E]:=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/simple/config/KaptchaConfig.java | 32 ++++++++++ .../java/com/simple/config/ShiroConfig.java | 1 + .../com/simple/controller/HomeController.java | 47 ++++++++++++-- .../java/com/simple/utils/ShiroUtils.java | 61 +++++++++++++++++++ .../java/com/simple/common/ErrorCode.java | 2 + pom.xml | 6 ++ 6 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 mallinkAdmin/src/main/java/com/simple/config/KaptchaConfig.java create mode 100644 mallinkAdmin/src/main/java/com/simple/utils/ShiroUtils.java diff --git a/mallinkAdmin/src/main/java/com/simple/config/KaptchaConfig.java b/mallinkAdmin/src/main/java/com/simple/config/KaptchaConfig.java new file mode 100644 index 000000000..39a36e9c6 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/simple/config/KaptchaConfig.java @@ -0,0 +1,32 @@ +package com.simple.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + + +/** + * 生成验证码配置 + * + * @author stormeye.wu + * @email wugq@mippoint.com + * @date 2017-04-20 19:22 + */ +@Configuration +public class KaptchaConfig { + + @Bean + public DefaultKaptcha producer() { + Properties properties = new Properties(); + properties.put("kaptcha.border", "no"); + properties.put("kaptcha.textproducer.font.color", "black"); + properties.put("kaptcha.textproducer.char.space", "5"); + Config config = new Config(properties); + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/mallinkAdmin/src/main/java/com/simple/config/ShiroConfig.java b/mallinkAdmin/src/main/java/com/simple/config/ShiroConfig.java index 70edeaaf7..948d3b637 100644 --- a/mallinkAdmin/src/main/java/com/simple/config/ShiroConfig.java +++ b/mallinkAdmin/src/main/java/com/simple/config/ShiroConfig.java @@ -120,6 +120,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/carCallback/**","anon"); filterChainDefinitionMap.put("/wxMallApply/add","anon"); filterChainDefinitionMap.put("/wxMallApply/sendvalidationcode","anon"); + filterChainDefinitionMap.put("/captcha.jpg", "anon"); // filterChainDefinitionMap.put("/role/**", "corsFilter,token"); filterChainDefinitionMap.put("/**", "corsFilter,token,authc"); // filterChainDefinitionMap.put("/**", "anon"); diff --git a/mallinkAdmin/src/main/java/com/simple/controller/HomeController.java b/mallinkAdmin/src/main/java/com/simple/controller/HomeController.java index d737fa627..e44428563 100644 --- a/mallinkAdmin/src/main/java/com/simple/controller/HomeController.java +++ b/mallinkAdmin/src/main/java/com/simple/controller/HomeController.java @@ -1,6 +1,9 @@ package com.simple.controller; import com.github.pagehelper.PageInfo; +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.Producer; +import com.simple.common.ErrorCode; import com.simple.common.ResultData; import com.simple.domain.po.MallRolePermission; import com.simple.domain.po.MallUserInfo; @@ -8,8 +11,10 @@ import com.simple.domain.po.MallUserRole; import com.simple.service.MallRolePermissionService; import com.simple.service.MallUserRoleService; import com.simple.shiro.UserSession; +import com.simple.utils.ShiroUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.io.IOUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; @@ -17,10 +22,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import javax.imageio.ImageIO; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; @RestController @@ -28,15 +37,43 @@ import org.springframework.web.bind.annotation.RestController; public class HomeController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private Producer producer; + @Autowired private MallUserRoleService mallUserRoleService; @Autowired private MallRolePermissionService mallRolePermissionService; + @RequestMapping("/captcha.jpg") + public void captcha(HttpServletResponse response)throws ServletException, IOException { + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + + //生成文字验证码 + String text = producer.createText(); + //生成图片验证码 + BufferedImage image = producer.createImage(text); + //保存到shiro session + ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text); + + ServletOutputStream out = response.getOutputStream(); + ImageIO.write(image, "jpg", out); + IOUtils.closeQuietly(out); + } + @ApiOperation("登录") @PostMapping("/doLogin") - public ResultData login(@RequestBody MallUserInfo user) { + public ResultData login(@RequestBody MallUserInfo user, String captcha) { + if (captcha != null) { + String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY); + if(!captcha.equalsIgnoreCase(kaptcha)){ + return new ResultData(ErrorCode.KAPCHA_NOT_EQUAL); + } + } + ResultData data = new ResultData(); if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword())) { // throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR); diff --git a/mallinkAdmin/src/main/java/com/simple/utils/ShiroUtils.java b/mallinkAdmin/src/main/java/com/simple/utils/ShiroUtils.java new file mode 100644 index 000000000..810ba5eb2 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/simple/utils/ShiroUtils.java @@ -0,0 +1,61 @@ +package com.simple.utils; + +import com.simple.common.ErrorCode; +import com.simple.domain.po.MallUserInfo; +import com.simple.exception.MallinkException; +import com.simple.shiro.UserSession; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; + +/** + * Shiro工具类 + * + * @author stormeye.wu + * @email wugq@mippoint.com + * @date 2016年11月12日 上午9:49:19 + */ +public class ShiroUtils { + + public static Session getSession() { + return SecurityUtils.getSubject().getSession(); + } + + public static Subject getSubject() { + return SecurityUtils.getSubject(); + } + + public static MallUserInfo getUserInfo() { + return (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo); + } + + public static Long getUserId() { + return getUserInfo().getId(); + } + + public static void setSessionAttribute(Object key, Object value) { + getSession().setAttribute(key, value); + } + + public static Object getSessionAttribute(Object key) { + return getSession().getAttribute(key); + } + + public static boolean isLogin() { + return SecurityUtils.getSubject().getPrincipal() != null; + } + + public static void logout() { + SecurityUtils.getSubject().logout(); + } + + public static String getKaptcha(String key) { + Object kaptcha = getSessionAttribute(key); + if (kaptcha == null) { + throw new MallinkException(ErrorCode.KAPCHA_NOT_VALID); + } + getSession().removeAttribute(key); + return kaptcha.toString(); + } + +} diff --git a/mallinkService/src/main/java/com/simple/common/ErrorCode.java b/mallinkService/src/main/java/com/simple/common/ErrorCode.java index 129aa18d9..39f119743 100644 --- a/mallinkService/src/main/java/com/simple/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/simple/common/ErrorCode.java @@ -54,6 +54,8 @@ public enum ErrorCode{ USER_IS_LOCKED(2003, "用户已经被锁定不能登录,请与管理员联系"), NEW_USER_FAILD(2004, "创建新用户失败"), BUSER_NOT_IN_APP(2005, "用户不是此app用户"), + KAPCHA_NOT_VALID(2006, "验证码已失效"), + KAPCHA_NOT_EQUAL(2007, "验证码不正确"), /** * 商场/商户 diff --git a/pom.xml b/pom.xml index c59cd5ab1..a9c890591 100644 --- a/pom.xml +++ b/pom.xml @@ -222,6 +222,12 @@ 2.8.5 + + com.github.axet + kaptcha + 0.0.9 + + com.github.binarywang weixin-java-miniapp