欧美精品123_精品露脸国产偷人在视频_日韩美女免费线视频_成人av三级

用戶登錄界面(用戶登錄界面設計)

前沿拓展:

用戶登錄界面

運行輸入“control userpasswords2”把里邊的勾去掉就可以了


前言

本文通過圖示及代碼的方式介紹用戶登錄流程及技術實現,內容包括用戶登錄,用戶驗證,如何獲取**作用戶的信息以及一些黑名單及匿名接口如何免驗證相關的實現。

結合**相關知識食用更佳

業務圖解

對于用戶登錄來說、涉及到了用戶注冊、登錄驗證幾個方面,通過流程圖演示如何處理(新用戶/老用戶)登錄

用戶登錄界面(用戶登錄界面設計)

流程解讀客戶端-登錄界面(通常手機驗證碼登錄) 1.填寫手機號 2.發送驗證碼 3.填寫驗證碼 4.勾選新用戶自動注冊服務端-用戶驗證 1.驗證賬號驗證碼是否正確 2.驗證用戶是否存在(不存在出初始化用戶信息) 3.完成驗證生成token 4.將token返回給客戶端用戶信息設計

字段

描述

類型

是否唯一

telephone

手機號

varchar

nickname

昵稱

varchar

根據業務決定是否可重復

account

賬號

varchar

password

密碼

varchar

create_time

創建時間

datetime

modify_time

修改時間

datetime

…省略小程序授權碼等等、根據自身業務進行增加

驗證流程圖解用戶登錄界面(用戶登錄界面設計)

登錄驗證流程涉及到了兩個接口,兩個緩存。1.獲取驗證碼接口,給手機號發送驗證碼并設置驗證碼緩存,設置過期時間;2.登錄接口,提交手機號及驗證碼,讀取緩存進行匹配驗證,成功則生成token返回給客戶端,客戶端登錄成功,登錄后請求頭攜帶token進行業務請求即可。

關于token過期時間

通常我們token的過期時間是根據客戶端的類型來定義的,app的過期時間會更長一些(通常一個星期),web端過期時間以小時為單位,如果控制過期時間可以將web登錄和app登錄拆分為兩個接口(能夠分流,接口壓力更小),或者是根據請求頭信息進行判斷即可,是移動端就設置7天,是web端就設置兩小時。

關于業務請求token驗證

登錄成功后,客戶端每次請求都會攜帶token,通常我們會有一個**來進行token驗證,**用于登錄驗證的核心就是登錄成功后寫入的token作為key,值為用戶基礎信息的緩存,圖解如下:

用戶登錄界面(用戶登錄界面設計)

驗證成功后,重寫內部請求頭,將用戶的的id,賬號,昵稱信息放入請求頭中,這樣可以方便業務系統獲取當前**作用戶信息以及權限控制等等

關于登出**作

用戶攜帶token請求登出接口,登出接口對token對應的緩存進行刪除**作,返回401即可,客戶端獲取到401就會跳轉到登錄頁面

關于匿名請求(免登錄)

通常匿名請求放行有兩種方案,1.授權token,為token設置單位時間內請求次數;2.配置路徑放行規則,對請求接口路徑進行正則匹配,符合正則規則的進行放行

方案1:授權token,限制單位時間請求次數

優點就是雖然是免登錄接口,但是接口的**作對象可以追溯,請求次數可控,避免被非法利用;缺點就是需要更多的編碼及配置工作

技術實現1.提供一個授權token管理頁面,主要管理token使用者,token的值,單位時間訪問次數(如每分鐘60次)2.增刪改查,將授權token存放到緩存中,使用map進行存儲,key為token,值為每分鐘訪問次數3.單位時間計數緩存,過期時間為1分鐘

這時候我們需要在上面的驗證流程圖基礎上進行升級

用戶登錄界面(用戶登錄界面設計)

請求次數檢查代碼實現
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
* 授權token請求限制緩存
*
* @author 熱黃油啤酒
* @since 2021-11-01
*/
@Component
public class AuthTokenRequestLimitCache {

@Autowired
private RedisTemplate<String, Integer> redisTemplate;

private static final String AUTH_TOKEN_LIMIT_KEY_PREFIX = "auth_token_limit";

/**
* 請求次數+1并檢查是否超限
*
* @param token
* @return 是否放行
*/
public boolean incrementWithCheck(String token) {
// 1.獲取token請求次數限制,獲取為null代表授權配置已被修改,此token已經不具備權限
Integer limit = getLimit(token);
if (limit == null) {
return false;
}
// 2.組裝緩存key,讀取緩存
String key = String.join(":", AUTH_TOKEN_LIMIT_KEY_PREFIX, token);
Integer count = redisTemplate.opsForValue().get(key);
// 3.沒有值代表一分鐘內沒有請求產生了
if (count == null) {
// 初始化值
redisTemplate.opsForValue().increment(key);
// 設置過期時間
redisTemplate.expire(key, 1L, TimeUnit.MINUTES);
return true;
}
// 自增并獲取當前值 大于限制的話 返回false **過濾器返回提示信息(如請求過于頻繁)
Long inc = redisTemplate.opsForValue().increment(key);
return inc <= limit;
}

/**
* 獲取限值
*
* @param token
* @return
*/
public Integer getLimit(String token) {
Object limit = redisTemplate.opsForHash().get("auth_token_limit", token);
return limit == null ? null : (Integer) limit;
}
}
**代碼

對于授權接口,通常是只允許get**作,對數據進行提交或者更新是不被允許的,當然這個是業務層面的,最終取決于系統設計

方案2:請求路徑正則校驗

我們在**的配置文件中增加匿名接口規則,請求到**時,檢查請求的路徑是否符合匿名接口規則,是則放行,不是則進行token校驗,方案比較簡單,只需要對**進行處理即可。

關于黑名單

對于一個系統來說,黑名單是最后一道關卡,所以為了安全我們需要對問題用戶進行黑名單**作,具體實現也比較簡單

1.用戶管理頁面提供一個拉黑的按鈕,拉黑后,這些用戶的id會存儲到一個set**中去2.登錄時候檢查用戶是否在黑名單中,是則拒絕登錄并提示3.如果用戶已經登錄后進行拉黑**作,**會在鑒權通過后檢查用戶是否在黑名單中,是則刪除token對應緩存,返回401,401就會跳到登錄頁,步驟2就會進行攔截。總結

用戶系統是非常基礎的系統,但是很多程序員工作中可能并沒有真正的參與到用戶系統的開發,通過此文可以對用戶登錄流程及配套功能有一個全面的了解。

鏈接:https://juejin.cn/post/7025768845075808286

拓展知識:

原創文章,作者:九賢互聯網實用分享網小編,如若轉載,請注明出處:http://www.uuuxu.com/20220927474988.html

主站蜘蛛池模板: 昭觉县| 常州市| 波密县| 长春市| 内丘县| 永川市| 墨脱县| 巴楚县| 密山市| 盐城市| 富锦市| 兰州市| 浮梁县| 揭东县| 敦化市| 庆元县| 白朗县| 杭锦旗| 铜陵市| 揭阳市| 开封市| 陇西县| 保定市| 伊通| 江都市| 安乡县| 镇巴县| 突泉县| 西安市| 盐源县| 长春市| 达日县| 佛坪县| 绩溪县| 阿勒泰市| 茌平县| 宁阳县| 景谷| 崇明县| 闻喜县| 新巴尔虎右旗|