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

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

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

瀏覽:87日期:2023-08-31 11:21:02

前言

自動登錄是將用戶的登錄信息保存在用戶瀏覽器的cookie中,當(dāng)用戶下次訪問時,自動實現(xiàn)校驗并建立登錄態(tài)的一種機制。

Spring Security提供了兩種非常好的令牌:

散列算法加密用戶必要的登錄信息并生成令牌 數(shù)據(jù)庫等持久性數(shù)據(jù)存儲機制用的持久化令牌

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

散列加密方案

在Spring Security中加入自動登錄的功能非常簡單:

@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers('/api/user/**').hasRole('user') //user 角色訪問/api/user/開頭的路由 .antMatchers('/api/admin/**').hasRole('admin') //admin 角色訪問/api/admin/開頭的路由 .antMatchers('/api/public/**').permitAll() //允許所有可以訪問/api/public/開頭的路由 .and() .formLogin() .and() .rememberMe().userDetailsService(userDetailsService()); //記住密碼 }

重啟服務(wù)后訪問受限 API,這次在表單登錄頁中多了一個可選框:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

勾選“Remember me on this computer”可選框(簡寫為Remember-me),按照正常的流程登錄,并在開發(fā)者工具中查看瀏覽器cookie,可以看到除JSESSIONID外多了一個值:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

這是Spring Security默認自動登錄的cookie字段。在不配置的情況下,過期時間是兩個星期:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

Spring Security會在每次表單登錄成功之后更新此令牌,具體處理方式在源碼中:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

RememberConfigurer:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

持久化令牌方案

在持久化令牌方案中,最核心的是series和token兩個值,它們都是用MD5散列過的隨機字符串。不同的是,series僅在用戶使用密碼重新登錄時更新,而token會在每一個新的session中都重新生成。

解決了散列加密方案中一個令牌可以同時在多端登錄的問題。每個會話都會引發(fā)token的更新,即每個token僅支持單實例登錄。

自動登錄不會導(dǎo)致series變更,而每次自動登錄都需要同時驗證series和token兩個值,當(dāng)該令牌還未使用過自動登錄就被盜取時,系統(tǒng)會在非法用戶驗證通過后刷新 token 值,此時在合法用戶的瀏覽器中,該token值已經(jīng)失效。當(dāng)合法用戶使用自動登錄時,由于該series對應(yīng)的 token 不同,系統(tǒng)可以推斷該令牌可能已被盜用,從而做一些處理。例如,清理該用戶的所有自動登錄令牌,并通知該用戶可能已被盜號等

Spring Security使用PersistentRememberMeToken來表明一個驗證實體:

public class PersistentRememberMeToken { private final String username; private final String series; private final String tokenValue; private final Date date; public PersistentRememberMeToken(String username, String series, String tokenValue, Date date) { this.username = username; this.series = series; this.tokenValue = tokenValue; this.date = date; } public String getUsername() { return this.username; } public String getSeries() { return this.series; } public String getTokenValue() { return this.tokenValue; } public Date getDate() { return this.date; }}

需要使用持久化令牌方案,需要傳入PersistentTokenRepository的實例:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

PersistentTokenRepository接口主要涉及token的增刪查改四個接口:

Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)

MyPersistentTokenRepositoryImpl使我們實現(xiàn)PersistentTokenRepository接口:

@Servicepublic class MyPersistentTokenRepositoryImpl implements PersistentTokenRepository { @Autowired private JPAPersistentTokenRepository repository; @Override public void createNewToken(PersistentRememberMeToken persistentRememberMeToken) { MyPersistentToken myPersistentToken = new MyPersistentToken(); myPersistentToken.setSeries(persistentRememberMeToken.getSeries()); myPersistentToken.setUsername(persistentRememberMeToken.getUsername()); myPersistentToken.setTokenValue(persistentRememberMeToken.getTokenValue()); myPersistentToken.setUser_last(persistentRememberMeToken.getDate()); repository.save(myPersistentToken); } @Override public void updateToken(String series, String tokenValue, Date lastUsed) { MyPersistentToken myPersistentToken = repository.findBySeries(series); myPersistentToken.setUser_last(lastUsed); myPersistentToken.setTokenValue(tokenValue); repository.save(myPersistentToken); } @Override public PersistentRememberMeToken getTokenForSeries(String series) { MyPersistentToken myPersistentToken = repository.findBySeries(series); PersistentRememberMeToken persistentRememberMeToken = new PersistentRememberMeToken(myPersistentToken.getUsername(), myPersistentToken.getSeries(), myPersistentToken.getTokenValue(), myPersistentToken.getUser_last()); return persistentRememberMeToken; } @Override @Transactional public void removeUserTokens(String username) { repository.deleteByUsername(username); }}

public interface JPAPersistentTokenRepository extends JpaRepository<MyPersistentToken,Long> { MyPersistentToken findBySeries(String series); void deleteByUsername(String username);}

@Entity@Table(name = 'persistent_token')public class MyPersistentToken { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String username; @Column(unique = true) private String series; private String tokenValue; private Date user_last; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSeries() { return series; } public void setSeries(String series) { this.series = series; } public String getTokenValue() { return tokenValue; } public void setTokenValue(String tokenValue) { this.tokenValue = tokenValue; } public Date getUser_last() { return user_last; } public void setUser_last(Date user_last) { this.user_last = user_last; }}

當(dāng)自動登錄認證時,Spring Security 通過series獲取用戶名、token以及上一次自動登錄時間三個信息,通過用戶名確認該令牌的身份,通過對比 token 獲知該令牌是否有效,通過上一次自動登錄時間獲知該令牌是否已過期,并在完整校驗通過之后生成新的token。

總結(jié)

到此這篇關(guān)于Spring Security學(xué)習(xí)之rememberMe自動登錄實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Security rememberMe自動登錄內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 高低温万能试验机-复合材料万能试验机-馥勒仪器 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 仓储笼_金属箱租赁_循环包装_铁网箱_蝴蝶笼租赁_酷龙仓储笼租赁 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 压装机-卧式轴承轮轴数控伺服压装机厂家[铭泽机械] | 密集柜_档案密集柜_智能密集架_密集柜厂家_密集架价格-智英伟业 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | 诗词大全-古诗名句 - 古诗词赏析 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 江苏齐宝进出口贸易有限公司 | 刮板输送机,粉尘加湿搅拌机,螺旋输送机,布袋除尘器 | 密封无忧网 _ 专业的密封产品行业信息网 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 纸塑分离机-纸塑分离清洗机设备-压力筛-碎浆机厂家金双联环保 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 罗氏牛血清白蛋白,罗氏己糖激酶-上海嵘崴达实业有限公司 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 |