电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法

瀏覽:24日期:2023-07-11 10:47:35

本文個(gè)人博客地址:https://www.leafage.top/posts/detail/21697I2R

最近幾天在改造項(xiàng)目,需要將gateway整合security在一起進(jìn)行認(rèn)證和鑒權(quán),之前gateway和auth是兩個(gè)服務(wù),auth是shiro寫(xiě)的一個(gè),一個(gè)filter和一個(gè)配置,內(nèi)容很簡(jiǎn)單,生成token,驗(yàn)證token,沒(méi)有其他的安全檢查,然后讓對(duì)項(xiàng)目進(jìn)行重構(gòu)。

先是要整合gateway和shiro,然而因?yàn)間ateway是webflux,而shiro-spring是webmvc,所以沒(méi)搞成功,如果有做過(guò)并成功的,請(qǐng)告訴我如何進(jìn)行整合,非常感謝。

那整合security呢,因?yàn)閟pring cloud gateway基于webflux,所以網(wǎng)上很多教程是用不了的,webflux的配置會(huì)有一些變化,具體看如下代碼示例:

import io.leafage.gateway.api.HypervisorApi;import io.leafage.gateway.handler.ServerFailureHandler;import io.leafage.gateway.handler.ServerSuccessHandler;import io.leafage.gateway.service.JdbcReactiveUserDetailsService;import org.springframework.context.annotation.Bean;import org.springframework.http.HttpMethod;import org.springframework.http.HttpStatus;import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;import org.springframework.security.config.web.server.ServerHttpSecurity;import org.springframework.security.core.userdetails.ReactiveUserDetailsService;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.crypto.password.PasswordEncoder;import org.springframework.security.web.server.SecurityWebFilterChain;import org.springframework.security.web.server.authentication.HttpStatusServerEntryPoint;import org.springframework.security.web.server.authentication.ServerAuthenticationFailureHandler;import org.springframework.security.web.server.authentication.ServerAuthenticationSuccessHandler;import org.springframework.security.web.server.authentication.logout.HttpStatusReturningServerLogoutSuccessHandler;import org.springframework.security.web.server.csrf.CookieServerCsrfTokenRepository;/** * spring security config . * * @author liwenqiang 2019/7/12 17:51 */@EnableWebFluxSecuritypublic class ServerSecurityConfiguration { // 用于獲取遠(yuǎn)程數(shù)據(jù) private final HypervisorApi hypervisorApi; public ServerSecurityConfiguration(HypervisorApi hypervisorApi) {this.hypervisorApi = hypervisorApi; } /** * 密碼配置,使用BCryptPasswordEncoder * * @return BCryptPasswordEncoder 加密方式 */ @Bean protected PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(); } /** * 用戶(hù)數(shù)據(jù)加載 * * @return JdbcReactiveUserDetailsService 接口 */ @Bean public ReactiveUserDetailsService userDetailsService() {// 自定義的ReactiveUserDetails 實(shí)現(xiàn)return new JdbcReactiveUserDetailsService(hypervisorApi); } /** * 安全配置 */ @Bean SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {http.formLogin(f -> f.authenticationSuccessHandler(authenticationSuccessHandler()).authenticationFailureHandler(authenticationFailureHandler())).logout(l -> l.logoutSuccessHandler(new HttpStatusReturningServerLogoutSuccessHandler())).csrf(c -> c.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())).authorizeExchange(a -> a.pathMatchers(HttpMethod.OPTIONS).permitAll().anyExchange().authenticated()).exceptionHandling(e -> e.authenticationEntryPoint(new HttpStatusServerEntryPoint(HttpStatus.UNAUTHORIZED)));return http.build(); } /** * 登陸成功后執(zhí)行的處理器 */ private ServerAuthenticationSuccessHandler authenticationSuccessHandler() {return new ServerSuccessHandler(); } /** * 登陸失敗后執(zhí)行的處理器 */ private ServerAuthenticationFailureHandler authenticationFailureHandler() {return new ServerFailureHandler(); }}

上面的示例代碼,是我開(kāi)源項(xiàng)目中的一段,一般的配置就如上面寫(xiě)的,就可以使用了,但是由于我們之前的項(xiàng)目中的是shiro,然后有一個(gè)自定義的加密解密的邏輯。

首先說(shuō)明一下情況,之前那一套加密(前端MD5,不加鹽,然后數(shù)據(jù)庫(kù)存儲(chǔ)的是加鹽后的數(shù)據(jù)和對(duì)應(yīng)的鹽(每個(gè)賬號(hào)一個(gè)),要登錄比較之前對(duì)密碼要獲取動(dòng)態(tài)的鹽,然后加鹽進(jìn)行MD5,再進(jìn)行對(duì)比,但是在配置的時(shí)候是沒(méi)法獲取某一用戶(hù)的鹽值)

所以上面的一版配置是沒(méi)法通過(guò)驗(yàn)證的,必須在驗(yàn)證之前,給請(qǐng)求的密碼混合該賬號(hào)對(duì)應(yīng)的鹽進(jìn)行二次加密后在對(duì)比,但是這里就有問(wèn)題了:

security 框架提供的幾個(gè)加密解密工具沒(méi)有MD5的方式; security 配置加密解密方式的時(shí)候,無(wú)法填入動(dòng)態(tài)的賬號(hào)的加密鹽;

對(duì)于第一個(gè)問(wèn)題還好處理,解決方式是:自定義加密解密方式,然后注入到配置類(lèi)中,示例如下:

import cn.hutool.crypto.SecureUtil;import com.ichinae.imis.gateway.utils.SaltUtil;import org.springframework.security.crypto.codec.Utf8;import org.springframework.security.crypto.password.PasswordEncoder;import java.security.MessageDigest;/** * 自定義加密解密 */public class MD5PasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence charSequence) {String salt = SaltUtil.generateSalt();return SecureUtil.md5(SecureUtil.md5(charSequence.toString()) + salt); } @Override public boolean matches(CharSequence charSequence, String encodedPassword) {byte[] expectedBytes = bytesUtf8(charSequence.toString());byte[] actualBytes = bytesUtf8(charSequence.toString());return MessageDigest.isEqual(expectedBytes, actualBytes); } private static byte[] bytesUtf8(String s) {// need to check if Utf8.encode() runs in constant time (probably not).// This may leak length of string.return (s != null) ? Utf8.encode(s) : null; }}

第二個(gè)問(wèn)題的解決辦法,找了很多資料,也沒(méi)有找到,后來(lái)查看security的源碼發(fā)現(xiàn),可以在UserDetailsService接口的findByUsername()方法中,在返回UserDetails實(shí)現(xiàn)的時(shí)候,使用默認(rèn)實(shí)現(xiàn)User的UserBuilder內(nèi)部類(lèi)來(lái)解決這個(gè)問(wèn)題,因?yàn)閁serBuilder類(lèi)中有一個(gè)屬性,passwordEncoder屬性,它是Fucntion<String, String>類(lèi)型的,默認(rèn)實(shí)現(xiàn)是 password -> password,即對(duì)密碼不做任何處理,先看下它的源碼:

Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法

再看下解決問(wèn)題之前的findByUsername()方法:

@Servicepublic class UserDetailsServiceImpl implements ReactiveUserDetailsService { @Resource private RemoteService remoteService; @Override public Mono<UserDetails> findByUsername(String username) {return remoteService.getUser(username).map(userBO -> User.builder().username(username).password(userBO.getPassword()).authorities(grantedAuthorities(userBO.getAuthorities())).build()); } private Set<GrantedAuthority> grantedAuthorities(Set<String> authorities) {return authorities.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet()); }}

那找到了問(wèn)題的解決方法,就來(lái)改代碼了,如下所示:

新增一個(gè)代碼處理方法

private Function<String, String> passwordEncoder(String salt) { return rawPassword -> SecureUtil.md5(rawPassword + salt);}

然后添加builder鏈

@Servicepublic class UserDetailsServiceImpl implements ReactiveUserDetailsService { @Resource private RemoteService remoteService; @Override public Mono<UserDetails> findByUsername(String username) {return remoteService.getUser(username).map(userBO -> User.builder().passwordEncoder(passwordEncoder(userBO.getSalt())) //在這里設(shè)置動(dòng)態(tài)的鹽.username(username).password(userBO.getPassword()).authorities(grantedAuthorities(userBO.getAuthorities())).build()); } private Set<GrantedAuthority> grantedAuthorities(Set<String> authorities) {return authorities.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet()); } private Function<String, String> passwordEncoder(String salt) {return rawPassword -> SecureUtil.md5(rawPassword + salt); }}

然后跑一下代碼,請(qǐng)求登錄接口,就登陸成功了。

Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法

以上就是Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理的詳細(xì)內(nèi)容,更多關(guān)于Spring Security密碼驗(yàn)證的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 对辊式破碎机-对辊制砂机-双辊-双齿辊破碎机-巩义市裕顺机械制造有限公司 | 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 仿古建筑设计-仿古建筑施工-仿古建筑公司-汉匠古建筑设计院 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 正压密封性测试仪-静态发色仪-导丝头柔软性测试仪-济南恒品机电技术有限公司 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 |