Nginx鑒權(quán)、限流問題
更新時(shí)間:2024年06月19日 10:49:48 作者:yancqitcode
這篇文章主要介紹了Nginx鑒權(quán)、限流問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
一、Nginx鑒權(quán)
1. 依賴模塊 依賴模塊
- 依賴模塊
http_auth_request_module
- 驗(yàn)證是否安裝
nginx -V 2>&1 | grep -- 'http_auth_request_module'
2. Nginx配置
server
{
listen 80;
location = /checkToken {
internal;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header via $request_uri;
proxy_pass $auth_request_url;
}
location = /auth401 {
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
if ( $arg_via = "001" ) {
return 401 "{\"msg\":\"登錄憑證為空\",\"opCode\":\"001\",\"operateSuccess\":false}";
}
if ( $arg_via = "002" ) {
return 401 "{\"msg\":\"登錄憑證失效\",\"opCode\":\"002\",\"operateSuccess\":false}";
}
if ( $arg_via = "003" ) {
return 401 "{\"msg\":\"賬戶無權(quán)限\",\"opCode\":\"003\",\"operateSuccess\":false}";
}
}
location /test/api/ {
set $auth_request_url "http://127.0.0.1:8080/test/api/token/check?token=$arg_token";
auth_request /checkToken;
auth_request_set $auth_via $upstream_http_via;
error_page 401 = /auth401?via=$auth_via;
proxy_pass http://127.0.0.1:8080/test/api/;
}
}
3. Rest接口
- 驗(yàn)證的Redis賬戶權(quán)限內(nèi)容
- TokenRest.java
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.Set;
@RestController
@RequestMapping("/api/token")
public class TokenRest {
@Resource
private RedisTemplate redisTemplate;
@GetMapping(value="check")
public void checkRest(HttpServletRequest request, HttpServletResponse response) {
response.setStatus(401);
try {
String url = request.getHeader("via");
if (StringUtils.isNotEmpty(url) && url.contains("?")) {
url = url.substring(0, url.indexOf("?"));
}
// 白名單跳過驗(yàn)證
String flag = (String) redisTemplate.opsForHash().get("whiteCache", url);
if (StringUtils.isNotEmpty(flag)) {
response.setStatus(200);
return;
}
// 從Head或url中獲取token
String token = request.getParameter("token");
if (StringUtils.isEmpty(token) || "null".equals(token)) {
token = request.getHeader("Authorization");
if (token!=null && token.startsWith("Bearer ")) {
token = token.substring(7);
}
}
if (StringUtils.isEmpty(token) || "null".equals(token)) {
response.setHeader("via", "001");
return;
}
// 從Redis中獲取賬戶信息
String accountId = (String) redisTemplate.opsForValue().get(token);
if (accountId == null) {
response.setHeader("via", "002");
return;
}
Map<String, String> info = (Map<String, String>) redisTemplate.opsForValue().get(accountId);
if (info == null) {
response.setHeader("via", "003");
return;
}
String[] roleIds = info.get("roles").split(",");
for (String roleId : roleIds) {
Set<String> securityUrls = (Set<String>) redisTemplate.opsForHash().get("funcCache",roleId);
if (securityUrls.contains(url)) {
flag = "1";
break;
}
}
if ("1".equals(flag)) {
response.setStatus(200);
} else {
response.setHeader("via", "003");
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
- 驗(yàn)證的Redis賬戶權(quán)限內(nèi)容

二、Nginx限流
1. 簡介
Nginx限流是一種用于保護(hù)系統(tǒng)資源、防止惡意攻擊和控制流量的技術(shù)。
- 控制速率:使用
ngx_http_limit_req_module模塊,可以限制每個(gè)IP地址單位時(shí)間內(nèi)的請(qǐng)求數(shù)。 - 控制連接數(shù):使用
ngx_http_limit_conn_module模塊,可以限制每個(gè)IP地址同時(shí)保持的連接數(shù)。
2. 控制速率
- nginx.conf
http
{
limit_req_zone $binary_remote_addr zone=limit_req:10m rate=2r/s;
}
| 項(xiàng) | 說明 |
|---|---|
| binary_remote_addr | 表示通過客戶端IP來限制 |
| zone | 共享內(nèi)存區(qū)存儲(chǔ)訪問信息 |
| limit_req:10m | 名字為limit_req的內(nèi)存區(qū)域,存儲(chǔ)16萬IP地址 |
| rate=2r/s | 表示每秒最多處理2個(gè)請(qǐng)求 |
server
{
location = /test.htm {
limit_req zone=limit_req burst=10 nodelay;
alias C:/nginx/html/test.htm;
}
}
| 項(xiàng) | 說明 |
|---|---|
| burst=10 | 突發(fā)請(qǐng)求不超過10個(gè) |
| nodelay | 不延遲處理超過限制的請(qǐng)求 |
3. 控制連接數(shù)
- nginx.conf
http
{
limit_conn_zone $binary_remote_addr zone=limit_conn:10m;
}
| 項(xiàng) | 說明 |
|---|---|
| binary_remote_addr | 表示通過客戶端IP來限制 |
| zone | 共享內(nèi)存區(qū)存儲(chǔ)訪問信息 |
| limit_conn:10m | 名字為limit_conn的內(nèi)存區(qū)域,存儲(chǔ)16萬IP地址 |
server
{
location = /test.htm {
limit_conn limit_conn 2;
alias C:/nginx/html/test.htm;
}
}
| 項(xiàng) | 說明 |
|---|---|
| limit_conn 2 | 同一個(gè)IP地址只允許保持2個(gè)連接 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx中proxy_set_header參數(shù)的實(shí)現(xiàn)
本文詳細(xì)介紹了Nginx中proxy_set_header指令的用法,通過設(shè)置不同的請(qǐng)求頭信息,可以實(shí)現(xiàn)更靈活的反向代理功能,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
nginx服務(wù)器異常502 bad gateway原因排查
這篇文章主要介紹了nginx服務(wù)器異常502 bad gateway原因排查,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
nginx配置域名訪問時(shí)域名后出現(xiàn)兩個(gè)斜杠//的解決方法
最近這兩天重新寫了一下我的個(gè)人網(wǎng)站,在阿里云新買了一臺(tái)服務(wù)器,配置好以后出現(xiàn)了一個(gè)問題,就是輸入域名后域名地址會(huì)自動(dòng)在后面追加兩個(gè)斜桿,需要的朋友可以參考下2020-07-07

