作者 朱兆平

匿名者路由缓存处理

图片登录验证码
@@ -4,13 +4,18 @@ @@ -4,13 +4,18 @@
4 */ 4 */
5 package com.tianbo.warehouse; 5 package com.tianbo.warehouse;
6 6
  7 +import com.google.code.kaptcha.impl.DefaultKaptcha;
  8 +import com.google.code.kaptcha.util.Config;
7 import org.mybatis.spring.annotation.MapperScan; 9 import org.mybatis.spring.annotation.MapperScan;
8 import org.springframework.boot.SpringApplication; 10 import org.springframework.boot.SpringApplication;
9 import org.springframework.boot.autoconfigure.SpringBootApplication; 11 import org.springframework.boot.autoconfigure.SpringBootApplication;
10 import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 12 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  13 +import org.springframework.context.annotation.Bean;
11 import org.springframework.scheduling.annotation.EnableScheduling; 14 import org.springframework.scheduling.annotation.EnableScheduling;
12 import org.springframework.transaction.annotation.EnableTransactionManagement; 15 import org.springframework.transaction.annotation.EnableTransactionManagement;
13 16
  17 +import java.util.Properties;
  18 +
14 @SpringBootApplication 19 @SpringBootApplication
15 @EnableScheduling 20 @EnableScheduling
16 @EnableEurekaClient 21 @EnableEurekaClient
@@ -22,5 +27,24 @@ public class WarehouseApplication { @@ -22,5 +27,24 @@ public class WarehouseApplication {
22 SpringApplication.run(WarehouseApplication.class, args); 27 SpringApplication.run(WarehouseApplication.class, args);
23 } 28 }
24 29
  30 + /*声明验证码生成策略属性 Bean*/
  31 + @Bean
  32 + public DefaultKaptcha captchaProducer(){
  33 + DefaultKaptcha captchaProducer =new DefaultKaptcha();
  34 + Properties properties =new Properties();
  35 + properties.setProperty("kaptcha.border","yes");
  36 + properties.setProperty("kaptcha.border.color","105,179,90");
  37 + properties.setProperty("kaptcha.textproducer.font.color","red");
  38 + properties.setProperty("kaptcha.image.width","125");
  39 + properties.setProperty("kaptcha.image.height","60");
  40 + properties.setProperty("kaptcha.textproducer.font.size","36");
  41 + properties.setProperty("kaptcha.session.key","code");
  42 + properties.setProperty("kaptcha.textproducer.char.length","4");
  43 + properties.setProperty("kaptcha.textproducer.font.names","宋体,楷体,微软雅黑");
  44 + Config config=new Config(properties);
  45 + captchaProducer.setConfig(config);
  46 + return captchaProducer;
  47 + }
  48 +
25 } 49 }
26 50
  1 +package com.tianbo.warehouse.controller;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +
  5 +import com.google.code.kaptcha.impl.DefaultKaptcha;
  6 +
  7 +import com.thoughtworks.xstream.core.util.Base64Encoder;
  8 +import com.tianbo.warehouse.controller.response.ResultJson;
  9 +import com.tianbo.warehouse.model.ROLE;
  10 +import com.tianbo.warehouse.service.RoleService;
  11 +
  12 +import com.tianbo.warehouse.util.RedisUtils;
  13 +
  14 +import lombok.extern.slf4j.Slf4j;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.web.bind.annotation.PostMapping;
  17 +import org.springframework.web.bind.annotation.RequestMapping;
  18 +import org.springframework.web.bind.annotation.RestController;
  19 +
  20 +import javax.imageio.ImageIO;
  21 +
  22 +import javax.servlet.http.Cookie;
  23 +import javax.servlet.http.HttpServletRequest;
  24 +import javax.servlet.http.HttpServletResponse;
  25 +import javax.servlet.http.HttpSession;
  26 +import java.awt.image.BufferedImage;
  27 +import java.io.ByteArrayOutputStream;
  28 +import java.io.IOException;
  29 +import java.util.HashMap;
  30 +import java.util.List;
  31 +import java.util.Map;
  32 +import java.util.UUID;
  33 +
  34 +@Slf4j
  35 +@RestController()
  36 +@RequestMapping("/anonymous")
  37 +public class AnonymousController {
  38 +
  39 + @Autowired
  40 + RoleService roleService;
  41 +
  42 + @Autowired
  43 + RedisUtils redisUtils;
  44 +
  45 + @Autowired
  46 + private DefaultKaptcha captchaProducer;
  47 +
  48 + /**
  49 + * 配置匿名者可以访问的路由,并更新到redis,匿名者默认可以访问的role_name =ROLE_anonymous
  50 + * 此方法会将所有符合权限组名=ROLE_anonymous的权限更新到redis中,供gateway调用判断权限
  51 + * @return
  52 + */
  53 + @PostMapping("initAnonymousRoute")
  54 + public ResultJson initAnonymousRoute(){
  55 + List<ROLE> list = roleService.getROLE_anonymousPermList();
  56 + String json = JSON.toJSONString(list);
  57 + boolean result= redisUtils.set("ROLE_anonymous_routers", json,0);
  58 + return result ? new ResultJson("200","匿名者权限配置成功") :new ResultJson("500","匿名者权限配置失败");
  59 + }
  60 +
  61 + /**
  62 + * 生成验证码
  63 + */
  64 + @RequestMapping(value = "/randCode")
  65 + public ResultJson getRandCode(){
  66 +
  67 + // 获取验证码上的文字
  68 + String capText = captchaProducer.createText();
  69 +
  70 + // 将文件渲染到图片上
  71 + BufferedImage bi = captchaProducer.createImage(capText);
  72 + ByteArrayOutputStream outputStream = null;
  73 + outputStream = new ByteArrayOutputStream();
  74 + Base64Encoder encoder = new Base64Encoder();
  75 + Map<String,Object> map = new HashMap<>();
  76 + String verifyToken = "";
  77 + try {
  78 + verifyToken = UUID.randomUUID().toString();
  79 + redisUtils.set("verifyToken_" + verifyToken,capText,120);
  80 + ImageIO.write(bi, "jpeg", outputStream);
  81 + map.put("verifyImg","data:image/jpeg;base64,"+encoder.encode(outputStream.toByteArray()));
  82 + } catch (IOException e) {
  83 + e.printStackTrace();
  84 + return new ResultJson("500","verify get error");
  85 + }
  86 + return new ResultJson("200","verify get ok",map,verifyToken);
  87 +
  88 + }
  89 +}
1 package com.tianbo.warehouse.controller; 1 package com.tianbo.warehouse.controller;
2 2
  3 +import com.tianbo.warehouse.controller.response.ResultJson;
3 import org.springframework.web.bind.annotation.GetMapping; 4 import org.springframework.web.bind.annotation.GetMapping;
  5 +import org.springframework.web.bind.annotation.PostMapping;
4 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestMapping;
5 import org.springframework.web.bind.annotation.RestController; 7 import org.springframework.web.bind.annotation.RestController;
6 8
@@ -16,5 +18,4 @@ public class IndexController { @@ -16,5 +18,4 @@ public class IndexController {
16 } 18 }
17 19
18 20
19 -  
20 } 21 }
@@ -27,15 +27,6 @@ import java.util.Properties; @@ -27,15 +27,6 @@ import java.util.Properties;
27 @RestController 27 @RestController
28 public class MainController { 28 public class MainController {
29 29
30 - @Autowired  
31 - private DefaultKaptcha captchaProducer;  
32 -  
33 - @Autowired  
34 - private UserService userService;  
35 -  
36 - @Autowired  
37 - private RedisUtils redisUtils;  
38 -  
39 @GetMapping("/error") 30 @GetMapping("/error")
40 public String error(){ 31 public String error(){
41 return "error"; 32 return "error";
@@ -45,75 +36,4 @@ public class MainController { @@ -45,75 +36,4 @@ public class MainController {
45 public String main(){ 36 public String main(){
46 return "main"; 37 return "main";
47 } 38 }
48 -  
49 - /**  
50 - * 生成验证码  
51 - */  
52 - @RequestMapping(value = "/randCode")  
53 - public void getRandCode(HttpServletRequest request, HttpServletResponse response){  
54 -  
55 - HttpSession session = request.getSession();  
56 -  
57 -  
58 - response.setDateHeader("Expires", 0);  
59 -  
60 - // Set standard HTTP/1.1 no-cache headers.  
61 - response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");  
62 -  
63 - // Set IE extended HTTP/1.1 no-cache headers (use addHeader).  
64 - response.addHeader("Cache-Control", "post-check=0, pre-check=0");  
65 -  
66 - // Set standard HTTP/1.0 no-cache header.  
67 - response.setHeader("Pragma", "no-cache");  
68 -  
69 - // 设置返回文件类型  
70 - response.setContentType("image/jpeg");  
71 -  
72 - // 获取验证码上的文字  
73 - String capText = captchaProducer.createText();  
74 -  
75 - // 将验证码上的文字保存在session中  
76 - session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);  
77 -  
78 - //缓存存储登录验证码信息  
79 - redisUtils.set(session.getId(),capText,60);  
80 -  
81 -  
82 - String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);  
83 -  
84 - log.info("验证码为:"+code);  
85 -  
86 -  
87 - // 将文件渲染到图片上  
88 - BufferedImage bi = captchaProducer.createImage(capText);  
89 - ServletOutputStream out = null;  
90 - try {  
91 - out = response.getOutputStream();  
92 - ImageIO.write(bi, "jpeg", out);  
93 - out.flush();  
94 - } catch (IOException e) {  
95 - e.printStackTrace();  
96 - }  
97 -  
98 -  
99 - }  
100 -  
101 - /*声明验证码生成策略属性 Bean*/  
102 - @Bean  
103 - public DefaultKaptcha captchaProducer(){  
104 - DefaultKaptcha captchaProducer =new DefaultKaptcha();  
105 - Properties properties =new Properties();  
106 - properties.setProperty("kaptcha.border","yes");  
107 - properties.setProperty("kaptcha.border.color","105,179,90");  
108 - properties.setProperty("kaptcha.textproducer.font.color","red");  
109 - properties.setProperty("kaptcha.image.width","125");  
110 - properties.setProperty("kaptcha.image.height","60");  
111 - properties.setProperty("kaptcha.textproducer.font.size","36");  
112 - properties.setProperty("kaptcha.session.key","code");  
113 - properties.setProperty("kaptcha.textproducer.char.length","4");  
114 - properties.setProperty("kaptcha.textproducer.font.names","宋体,楷体,微软雅黑");  
115 - Config config=new Config(properties);  
116 - captchaProducer.setConfig(config);  
117 - return captchaProducer;  
118 - }  
119 } 39 }
@@ -40,4 +40,11 @@ public class ResultJson<T> implements Serializable{ @@ -40,4 +40,11 @@ public class ResultJson<T> implements Serializable{
40 this.msg = msg; 40 this.msg = msg;
41 this.data = data; 41 this.data = data;
42 } 42 }
  43 +
  44 + public ResultJson(String code, String msg, T data,String jwtToken) {
  45 + this.code = code;
  46 + this.msg = msg;
  47 + this.data = data;
  48 + this.jwtToken = jwtToken;
  49 + }
43 } 50 }
@@ -16,6 +16,7 @@ import org.springframework.security.web.authentication.preauth.PreAuthenticatedC @@ -16,6 +16,7 @@ import org.springframework.security.web.authentication.preauth.PreAuthenticatedC
16 import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 16 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
17 import org.springframework.stereotype.Component; 17 import org.springframework.stereotype.Component;
18 18
  19 +import javax.servlet.http.Cookie;
19 import javax.servlet.http.HttpServletRequest; 20 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse; 21 import javax.servlet.http.HttpServletResponse;
21 import javax.servlet.http.HttpSession; 22 import javax.servlet.http.HttpSession;
@@ -53,21 +54,19 @@ public class MyLoginAuthenticationProcessFilter extends AbstractAuthenticationPr @@ -53,21 +54,19 @@ public class MyLoginAuthenticationProcessFilter extends AbstractAuthenticationPr
53 String loginUserName = request.getParameter("username"); 54 String loginUserName = request.getParameter("username");
54 String loginUserPass = request.getParameter("password"); 55 String loginUserPass = request.getParameter("password");
55 String loginVerify = request.getParameter("verify"); 56 String loginVerify = request.getParameter("verify");
  57 + String verifyToken = request.getParameter("verifyToken");
56 58
57 -// //验证码判断  
58 -// HttpSession session = request.getSession();  
59 -// String verify = "";  
60 -//// String verify = redisUtils.get(session.getId());  
61 -// if (session.getAttribute(Constants.KAPTCHA_SESSION_KEY)!=null){  
62 -// verify = session.getAttribute(Constants.KAPTCHA_SESSION_KEY).toString();  
63 -// }  
64 -//  
65 -// if(verify!= null && !verify.equals(loginVerify)){  
66 -// throw new BadCredentialsException("验证码错误!");  
67 -// } 59 + //验证码判断
  60 + String verify = "";
68 61
69 - authRequest = new UsernamePasswordAuthenticationToken(loginUserName,loginUserPass, null);  
70 - authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); 62 + verify = redisUtils.get("verifyToken_" + verifyToken);
  63 +
  64 + if(verify != null && loginVerify != null && verify.equals(loginVerify)){
  65 + authRequest = new UsernamePasswordAuthenticationToken(loginUserName,loginUserPass, null);
  66 + authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
  67 + }else {
  68 + throw new BadCredentialsException("验证码错误!");
  69 + }
71 } catch (BadCredentialsException e){ 70 } catch (BadCredentialsException e){
72 throw new PreAuthenticatedCredentialsNotFoundException(e.getMessage()); 71 throw new PreAuthenticatedCredentialsNotFoundException(e.getMessage());
73 }catch (Exception e) { 72 }catch (Exception e) {
  1 +package com.tianbo.warehouse.service;
  2 +
  3 +public interface LoginService {
  4 +
  5 +}
@@ -4,9 +4,13 @@ import com.github.pagehelper.PageInfo; @@ -4,9 +4,13 @@ import com.github.pagehelper.PageInfo;
4 import com.tianbo.warehouse.model.ROLE; 4 import com.tianbo.warehouse.model.ROLE;
5 import com.tianbo.warehouse.model.RolePermission; 5 import com.tianbo.warehouse.model.RolePermission;
6 6
  7 +import java.util.List;
  8 +
7 public interface RoleService { 9 public interface RoleService {
8 PageInfo<ROLE> findAll(int pageNum, int pageSize, String roleName, String type); 10 PageInfo<ROLE> findAll(int pageNum, int pageSize, String roleName, String type);
9 11
  12 + List<ROLE> getROLE_anonymousPermList();
  13 +
10 int insertSelective(ROLE record); 14 int insertSelective(ROLE record);
11 15
12 int setRolePermissoin(RolePermission record); 16 int setRolePermissoin(RolePermission record);
@@ -46,6 +46,12 @@ public class RoleServiceImp implements RoleService{ @@ -46,6 +46,12 @@ public class RoleServiceImp implements RoleService{
46 return roleMapper.insertSelective(record); 46 return roleMapper.insertSelective(record);
47 } 47 }
48 48
  49 + @Override
  50 + public List<ROLE> getROLE_anonymousPermList() {
  51 + List<ROLE> list = roleMapper.findAll("ROLE_anonymous", null);
  52 + return list;
  53 + }
  54 +
49 @Transactional(rollbackFor = Exception.class) 55 @Transactional(rollbackFor = Exception.class)
50 @Override 56 @Override
51 public int setRolePermissoin(RolePermission record){ 57 public int setRolePermissoin(RolePermission record){