認證服務(Oauth、分佈式集羣session共享問題、單點登錄)

1.註冊

好玩的代碼倒計時

1.頁面js提交註冊請求到認證服務
在這裏插入圖片描述
在這裏插入圖片描述

自定義視圖映射將無實際業務意義只進行頁面跳轉的請求抽取到viewcontroller中

路徑映射默認都是get訪問的
在這裏插入圖片描述

使用阿里雲的短信驗證碼

參考第三發接口文檔,原理就是請求短信服務地址並設置http的請求頭(服務地址,appcode,和method)和參數(驗證碼,模板,公司簽名,手機號)

此處應注意不應該是頁面直接短服務,而是頁面ajax請求認證服務,認證服務遠程調用短信服務發送驗證碼
註冊頁調用

2.認證服務的遠程調用第三方短信服務發送短信並存入緩存並返回註冊頁面(接口放刷,驗證碼的再校驗,配合redis實現)
在這裏插入圖片描述

3.提交註冊表單到會員服務,驗證通過進行數據庫持久化
防止註冊表單重複提交
註冊成功後使用重定向防止註冊表單重複提交,可使用RedirectAttribute redirectAttribute代替Model mode作爲參數 爲重定攜帶數據,利用session,將數據放到session中只要跳到下一個頁面取出這個數據,session裏面的數據就會被刪除,

在這裏插入圖片描述
持久化代碼

在這裏插入圖片描述

md5鹽值加密
在這裏插入圖片描述
spring提供的加密器的加密與匹配
在這裏插入圖片描述

登錄

頁面提交請求到認證服務,認證服務遠程調用member

2.社交登錄

在這裏插入圖片描述

2.1OAuth2.0簡介

在這裏插入圖片描述
![在這裏

2.2微博登錄示例

2.2.1.進入微博開放平臺

在這裏插入圖片描述
創建微連接設置應用名稱等信息,設置回調地址(回調地址就是我們自己開發的應用)
在這裏插入圖片描述

2.2.2.基本使用流程

1.引導需要授權的用戶到如下地址:替換下面的client_id爲我們應用的App Key,替換redirect_uri爲我們的商城應用

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

2.如果用戶同意授權,頁面跳轉至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE
在這裏插入圖片描述
3.換取Access Token(一個code只能換取一個Access Token)
client_id: 申請應用時分配的AppKey。
client_secret:申請應用時分配的AppSecret。
grant_type:請求的類型,填寫authorization_code
redirect_uri: 回調地址,需需與註冊應用裏的回調地址一致。
code:第二步獲取的code值

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE

拿到Access Token之後就可以使用Access Token去訪問所有微博提供的接口並獲取信息

在調用微博接口時應注意要保證client_secret及Access Token的安全性(不可暴露)。

2.3示例:

在這裏插入圖片描述

2.3.1.接受頁面請求,根據code換取包含Access Token信息的json數據

在這裏插入圖片描述

2.3.2.處理包含Access Token信息的json數據

1.使用json(包含Access Token)在線格式轉換將json轉爲javabean,並放入項目中

在這裏插入圖片描述
2.處理json(包含Access Token)轉爲我們生成的bean
在這裏插入圖片描述

2.2.3.處理社交用戶是登錄還是註冊

根據json信息獲取社交應用中的用戶信息並插入數據庫
使用json數據中的uid作爲該微博帳戶關聯wwmall應用的唯一標識
每次使用社交登陸獲取的Access Token值會變,但uid是相同的所以我們用uid關聯社交應用與我們的應用
判斷當前社交用戶是否登陸過,如果是第一次就註冊在系統中,如果不是第一次就直接登錄

在這裏插入圖片描述
在這裏插入圖片描述

2.2.4.登錄成功返回登錄

在這裏插入圖片描述
登錄成功將用戶信息放入session中
在這裏插入圖片描述

2.4session 不共享問題

分佈式session出現不共享原因
session原理
在這裏插入圖片描述
由於session的原理導致在分佈式集羣應用環境下導致session不共享問題
在這裏插入圖片描述

2.5分佈式session共享解決方案

2.5.1集羣服務session不共享解決方案()

2.5.1.1session賦值方案(高集羣環境下不可取)

在這裏插入圖片描述

2.5.1.2session存儲在客戶端中(不安全,cookie存儲內容有上限)

在這裏插入圖片描述

2.5.1.3利用負載均衡機制(使用IP的hash一致性)將同一個用戶的請求負載均衡到同一服務

在這裏插入圖片描述

2.5.1.4最終解決方案:統一存儲到redis中

在這裏插入圖片描述

2.5.2分佈式應用session不共享解決方案

父域名wwmall.com ,子域名auth.wwmall.com, 子域名product.wwmall.com
子域名之間cookie是不能共享的。

2.5.2.1子域session共享

我們在存取session時將瀏覽器需要存儲的cookie域名都指定爲父域名
在這裏插入圖片描述

2.5.2.2整合spring session解決session跨域問題

引入依賴

<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
	</dependency>

配置文件配置

spring.session.store-type=redis #會話存儲類型。
server.servlet.session.timeout =#會話超時。如果未指定持續時間後綴,則使用秒。
spring.session.redis.flush-mode = on_save#會話刷新模式。
spring.session.redis.namespace = spring:session#用於存儲會話的鍵的命名空間

在主類上使用@EnableRedisHttpSession即可將session存在redis中
這將創建具有springSessionRepositoryFilter該實現名稱的Spring bean Filter。該過濾器負責替換HttpSessionSpring Session支持的實現。

編寫配置類設置cookie的domian屬性,並設置序列化到redis的規則使用阿里提供的序列化器
在這裏插入圖片描述

在這裏插入圖片描述

2.5.2.3springsession核心原理(使用裝飾者模式將原生的request包裝以後,想獲取session都去包裝後的request中獲取)

在這裏插入圖片描述
在這裏插入圖片描述

3.多系統-----單點登錄

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章