摘要:工程除了提供后端的路由轉(zhuǎn)發(fā),還可以做全局的過(guò)濾器,所以我選擇在這個(gè)工程里面寫登陸校驗(yàn)功能。如果校驗(yàn)成功,返回登陸成功,否則,返回登陸失敗。前端再根據(jù)登陸情況做路由跳轉(zhuǎn)。登陸成功登陸失敗最后,貼一下啟動(dòng)類的代碼
先簡(jiǎn)單說(shuō)一下我們工程的架構(gòu):前端工程是采用react,后端工程采用spring-cloud,里面分為zuul工程和其他功能模塊。zuul工程除了提供后端的路由轉(zhuǎn)發(fā),還可以做全局的過(guò)濾器,所以我選擇在這個(gè)工程里面寫登陸校驗(yàn)功能。
session配置這里使用redis存儲(chǔ)session信息。
下載依賴,在pom.xml里面加入
org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis
配置session存儲(chǔ),在application.yml里面加入
session: store-type: redis timeout: 30 redis: database: 0 host: password: port: 6379 timeout: 300000
session超時(shí),在application.yml里面配置timeout貌似沒(méi)有效果,我們?cè)趩?dòng)類里面加入超時(shí)配置注解
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)
添加redis類配置,新建一個(gè)redisConfig類,然后寫入
package com.config; import org.springframework.context.annotation.Configuration; @Configuration public class RedisConfig { public RedisConfig() { } }過(guò)濾器
這里使用zuulFilter,實(shí)現(xiàn)了每個(gè)http請(qǐng)求都經(jīng)過(guò)這個(gè)過(guò)濾器,然后通過(guò)session中是否存在用戶名,判斷session是否超時(shí)。如果超時(shí)就返回錯(cuò)誤提示,前端再根據(jù)超時(shí)的http請(qǐng)求碼進(jìn)行跳轉(zhuǎn)。
package com.config; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.ztesoft.cloud.Service.StaffService; import com.ztesoft.cloud.model.User; import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletRequest; public class WebSecurityFilter extends ZuulFilter { @Override public String filterType() { return "pre";//前置過(guò)濾器 } @Override public int filterOrder() { return 0;//優(yōu)先級(jí)為0,數(shù)字越大,優(yōu)先級(jí)越低 } @Override public boolean shouldFilter() { return true;//是否執(zhí)行該過(guò)濾器,此處為true,說(shuō)明需要過(guò)濾 } @Autowired private StaffService staffService; @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String queryString = request.getQueryString(); Object username = request.getSession().getAttribute("username"); Object password = request.getSession().getAttribute("password"); User user = new User(); if(username != null) { user.setUsername(username.toString()); } if(password != null) { user.setPassword(password.toString()); } Boolean verifyResult = this.staffService.verifyLoginUser(user); //queryString.indexOf("tag=process") > -1)是為了外系統(tǒng)調(diào)用這個(gè)系統(tǒng)跳過(guò)登陸約定傳過(guò)來(lái)的值 if ((queryString != null && queryString.indexOf("tag=process") > -1) || verifyResult) { ctx.setSendZuulResponse(true);// 對(duì)該請(qǐng)求進(jìn)行路由 ctx.setResponseStatusCode(200); ctx.set("isSuccess", true);// 設(shè)值,可以在多個(gè)過(guò)濾器時(shí)使用 return null; } else { ctx.setSendZuulResponse(false);// 過(guò)濾該請(qǐng)求,不對(duì)其進(jìn)行路由 ctx.setResponseStatusCode(401);// 返回錯(cuò)誤碼,應(yīng)該是401 ctx.setResponseBody("session is out of time");// 返回錯(cuò)誤內(nèi)容 ctx.set("isSuccess", false); return null; } } }
這里還需要在啟動(dòng)類中注入這個(gè)類
@Bean public WebSecurityFilter accessFilter() { return new WebSecurityFilter(); }登陸的代碼
主要就是把前端傳來(lái)的用戶名密碼放到session中,并進(jìn)行校驗(yàn)。如果校驗(yàn)成功,返回登陸成功,否則,返回登陸失敗。前端再根據(jù)登陸情況做路由跳轉(zhuǎn)。
package com.controller; @RestController @RequestMapping(value = "/system") public class SystemController extends JdkSerializationRedisSerializer implements Serializable { @Autowired private StaffService staffService; @PostMapping("login") public ResponseEntitylogin(@RequestBody User user, HttpSession session) { session.setAttribute("username", user.getUsername()); session.setAttribute("password", user.getPassword()); Boolean ret = this.staffService.verifyLoginUser(user); if(ret == true) { return new ResponseEntity<>("登陸成功", HttpStatus.OK); } return new ResponseEntity<>("登陸失敗", HttpStatus.NON_AUTHORITATIVE_INFORMATION); } }
最后,貼一下啟動(dòng)類的代碼
@SpringBootApplication @EnableDiscoveryClient @EnableZuulProxy @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE) @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = RibbonConfig.class)) @RibbonClients(defaultConfiguration = RibbonConfig.class) public class PlatformWebApplication { @Bean public WebSecurityFilter accessFilter() { return new WebSecurityFilter(); } public static void main(String[] args) { SpringApplication.run(PlatformWebApplication.class, args); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72808.html
摘要:截獲頁(yè)面錯(cuò)誤處理邏輯關(guān)于權(quán)限等授權(quán)信息,可以直接放到中實(shí)現(xiàn)緩存。我認(rèn)為也是不錯(cuò)的。源碼奉上分支溫馨提示平時(shí)測(cè)試代碼可能比較亂。如果更好的實(shí)現(xiàn),讓我學(xué)習(xí),讓我我進(jìn)步,請(qǐng)聯(lián)系我。 關(guān)于驗(yàn)證大致分為兩個(gè)方面: 用戶登錄時(shí)的驗(yàn)證; 用戶登錄后每次訪問(wèn)時(shí)的權(quán)限認(rèn)證 主要解決方法:使用自定義的Shiro Filter 項(xiàng)目搭建: 這是一個(gè)spring-boot 的web項(xiàng)目,不了解spring...
摘要:一旦最基本的應(yīng)用創(chuàng)建好了,你可以給他加上安全防護(hù)。一旦成功登出了,我們的應(yīng)用程序重定向到到并顯示相應(yīng)的登陸成功的消息。這標(biāo)記該應(yīng)用程序是一個(gè)應(yīng)用程序,并激活一些關(guān)鍵行為,比如創(chuàng)建一個(gè)。一旦應(yīng)用程序啟動(dòng),用瀏覽器訪問(wèn)。 原網(wǎng)頁(yè) https://spring.io/guides/gs/securing-web/ 本指南將引導(dǎo)您完成創(chuàng)建一個(gè)資源由Spring Security的保護(hù)的一個(gè)簡(jiǎn)單...
摘要:無(wú)攔截器一般情況下直接用就可以搞定了有攔截器比如需要對(duì)用戶身份進(jìn)行驗(yàn)證瀏覽器在發(fā)送請(qǐng)求時(shí)可能這個(gè)我還要去一下不會(huì)帶上驗(yàn)證信息在攔截器那里就沒(méi)通過(guò)進(jìn)而結(jié)束請(qǐng)求而前面方法的執(zhí)行是在攔截器后面不會(huì)起作用當(dāng)然在攔截器那里判斷如果是方法就通過(guò)也沒(méi)問(wèn)題 無(wú)攔截器 @CrossOrigin 一般情況下,直接用@CrossOrigin就可以搞定了 @CrossOrigin(origins = ...
摘要:背景這段時(shí)間較忙,有些想念小紅,為了表達(dá)我對(duì)小紅的思念之情,決定將啟動(dòng)的研究一下,看看是否能夠自定義,讓我天天能夠看到她。 背景 這段時(shí)間較忙,有些想念小紅,為了表達(dá)我對(duì)小紅的思念之情,決定將spring boot啟動(dòng)的banner研究一下,看看是否能夠自定義,讓我天天能夠看到她。 展示 經(jīng)過(guò)調(diào)研,發(fā)現(xiàn)自定義banner是一個(gè)輕松愉快的過(guò)程,忍不住讓我多啟動(dòng)幾次,先看看效果:(省略了一...
摘要:為了達(dá)到很好的效果,我們使用來(lái)對(duì)的緩存進(jìn)行管理配置會(huì)話管理器,對(duì)會(huì)話時(shí)間進(jìn)行控制手動(dòng)清空緩存由于驗(yàn)證用戶名和密碼之前,一般需要驗(yàn)證驗(yàn)證碼的。 前言 本文主要講解的知識(shí)點(diǎn)有以下: Shiro授權(quán)過(guò)濾器使用 Shiro緩存 與Ehcache整合 Shiro應(yīng)用->實(shí)現(xiàn)驗(yàn)證碼功能 記住我功能 一、授權(quán)過(guò)濾器測(cè)試 我們的授權(quán)過(guò)濾器使用的是permissionsAuthorization...
閱讀 1785·2021-11-15 11:37
閱讀 3056·2021-11-04 16:05
閱讀 1922·2021-10-27 14:18
閱讀 2755·2021-08-12 13:30
閱讀 2500·2019-08-29 14:18
閱讀 2086·2019-08-29 13:07
閱讀 2024·2019-08-27 10:54
閱讀 2726·2019-08-26 12:15