国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Security的API Key實(shí)現(xiàn)SpringBoot 接口安全

這篇具有很好參考價(jià)值的文章主要介紹了Spring Security的API Key實(shí)現(xiàn)SpringBoot 接口安全。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Spring Security的API Key實(shí)現(xiàn)SpringBoot 接口安全

Spring Security 提供了各種機(jī)制來保護(hù)我們的 REST API。其中之一是 API 密鑰。API 密鑰是客戶端在調(diào)用 API 調(diào)用時(shí)提供的令牌。

在本教程中,我們將討論如何在Spring Security中實(shí)現(xiàn)基于API密鑰的身份驗(yàn)證。
API Keys
一些REST API使用API密鑰進(jìn)行身份驗(yàn)證。API密鑰是一個(gè)標(biāo)記,用于向API客戶端標(biāo)識(shí)API,而無需引用實(shí)際用戶。標(biāo)記可以作為查詢字符串或在請(qǐng)求頭中發(fā)送。

一 添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

二 驗(yàn)證請(qǐng)求頭的API KEY

public class AuthenticationService {
    private static final String AUTH_TOKEN_HEADER_NAME = "X-API-KEY";
    private static final String AUTH_TOKEN = "Baeldung";

    public static Authentication getAuthentication(HttpServletRequest request) {
        String apiKey = request.getHeader(AUTH_TOKEN_HEADER_NAME);

        if ((apiKey == null) || !apiKey.equals(AUTH_TOKEN)) {
            throw new BadCredentialsException("Invalid API Key");
        }

        return new ApiKeyAuthentication(apiKey, AuthorityUtils.NO_AUTHORITIES);
    }
}

在這里,我們檢查請(qǐng)求頭是否包含 API Key,如果為空 或者Key值不等于密鑰,那么就拋出一個(gè) BadCredentialsException。如果請(qǐng)求頭包含 API Key,并且驗(yàn)證通過,則將密鑰添加到安全上下文中,然后調(diào)用下一個(gè)安全過濾器。getAuthentication 方法非常簡(jiǎn)單,我們只是比較 API Key 頭部和密鑰是否相等。

為了構(gòu)建 Authentication 對(duì)象,我們必須使用 Spring Security 為了標(biāo)準(zhǔn)身份驗(yàn)證而構(gòu)建對(duì)象時(shí)使用的相同方法。所以,需要擴(kuò)展 AbstractAuthenticationToken 類并手動(dòng)觸發(fā)身份驗(yàn)證。

三 擴(kuò)展AbstractAuthenticationToken

為了成功地實(shí)現(xiàn)我們應(yīng)用的身份驗(yàn)證功能,我們需要將傳入的API Key轉(zhuǎn)換為AbstractAuthenticationToken類型的身份驗(yàn)證對(duì)象。AbstractAuthenticationToken類實(shí)現(xiàn)了Authentication接口,表示一個(gè)認(rèn)證請(qǐng)求的主體和認(rèn)證信息。

public class ApiKeyAuthentication extends AbstractAuthenticationToken {
    private final String apiKey;

    public ApiKeyAuthentication(String apiKey,
        Collection<?extends GrantedAuthority> authorities) {
        super(authorities);
        this.apiKey = apiKey;
        setAuthenticated(true);
    }

    @Override
    public Object getCredentials() {
        return null;
    }

    @Override
    public Object getPrincipal() {
        return apiKey;
    }
}

ApiKeyAuthentication 類是類型為 AbstractAuthenticationToken 的對(duì)象,其中包含從 HTTP 請(qǐng)求中獲取的 apiKey 信息。在構(gòu)造方法中使用 setAuthenticated(true) 方法。因此,Authentication對(duì)象包含 apiKey 和authenticated字段
springsecurity api key,SpringSecurity學(xué)習(xí)筆記,接口安全,API KEYS,SpringSecurity

四 創(chuàng)建自定義過濾器

實(shí)現(xiàn)思路是從請(qǐng)求頭中獲取API Key,然后使用我們的配置檢查秘鑰。在這種情況下,我們需要在Spring Security 配置類中添加一個(gè)自定義的Filter。

我們將從實(shí)現(xiàn)GenericFilterBean開始。GenericFilterBean是一個(gè)基于javax.servlet.Filter接口的簡(jiǎn)單Spring實(shí)現(xiàn)。

public class AuthenticationFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
      throws IOException, ServletException {
        try {
            Authentication authentication = AuthenticationService.getAuthentication((HttpServletRequest) request);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        } catch (Exception exp) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            httpResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
            PrintWriter writer = httpResponse.getWriter();
            writer.print(exp.getMessage());
            writer.flush();
            writer.close();
        }

        filterChain.doFilter(request, response);
    }
}

我們只需要實(shí)現(xiàn)doFilter()方法,在這個(gè)方法中我們從請(qǐng)求頭中獲取API Key,并將生成的Authentication對(duì)象設(shè)置到當(dāng)前的SecurityContext實(shí)例中。

然后請(qǐng)求被傳遞給其余的過濾器處理,接著轉(zhuǎn)發(fā)給DispatcherServlet最后到達(dá)我們的控制器。

五 配置類

通過創(chuàng)建建一個(gè)SecurityFilterChain bean,可以通過編程方式把我們上面編寫的自定義過濾器(Filter)進(jìn)行注冊(cè)。

我們需要在 HttpSecurity 實(shí)例上使用 addFilterBefore() 方法在 UsernamePasswordAuthenticationFilter 類之前添加 AuthenticationFilter。

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf()
          .disable()
          .authorizeRequests()
          .antMatchers("/**")
          .authenticated()
          .and()
          .httpBasic()
          .and()
          .sessionManagement()
          .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
          .and()
          .addFilterBefore(new AuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

}

六 測(cè)試

  1. controller
@RestController
public class ResourceController {
    @GetMapping("/home")
    public String homeEndpoint() {
        return "Baeldung !";
    }
}
  1. 啟動(dòng)類
    禁用 Auto-Configuration
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class})
public class ApiKeySecretAuthApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiKeySecretAuthApplication.class, args);
    }
}
  1. 測(cè)試
curl --location --request GET 'http://localhost:8080/home'

結(jié)果返回401
請(qǐng)求頭中加上API Key后,再次請(qǐng)求

curl --location --request GET 'http://localhost:8080/home' \
--header 'X-API-KEY: Baeldung'

結(jié)果返回200文章來源地址http://www.zghlxwxcb.cn/news/detail-840200.html

到了這里,關(guān)于Spring Security的API Key實(shí)現(xiàn)SpringBoot 接口安全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringSecurity源碼分析(一) SpringBoot集成SpringSecurity即Spring安全框架的加載過程

    SpringSecurity源碼分析(一) SpringBoot集成SpringSecurity即Spring安全框架的加載過程

    ? ? ? Spring Security是一個(gè)強(qiáng)大的并且高度可定制化的訪問控制框架。?它基于spring應(yīng)用。 Spring Security是聚焦于為java應(yīng)用提供授權(quán)和驗(yàn)證的框架。像所有的spring項(xiàng)目一樣,Spring Security真正的強(qiáng)大在于可以非常簡(jiǎn)單的拓展功能來實(shí)現(xiàn)自定義的需求。 ? ? ? 在分析SpringBoot集成的Sp

    2024年02月03日
    瀏覽(18)
  • 第六十六天 API安全-接口安全&阿里云KEY%postman&DVWS&XEE&鑒權(quán)&泄露

    第六十六天 API安全-接口安全&阿里云KEY%postman&DVWS&XEE&鑒權(quán)&泄露

    1.HTTP類接口-測(cè)評(píng) 2.RPC類接口-測(cè)評(píng) 3.Web Service類-測(cè)評(píng) 參考鏈接:https://www.jianshu.com/p/e48db27d7c70 內(nèi)容點(diǎn): SOAP(Simple Object Access Protocol)簡(jiǎn)單對(duì)象訪問協(xié)議是交換數(shù)據(jù)的一種協(xié)議規(guī)范, 是一種輕量的、簡(jiǎn)單的、基于XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)的協(xié)議,它被設(shè)計(jì) 成在WEB上

    2024年02月22日
    瀏覽(19)
  • SpringBoot3整合SpringSecurity,實(shí)現(xiàn)自定義接口權(quán)限過濾

    SpringBoot3整合SpringSecurity,實(shí)現(xiàn)自定義接口權(quán)限過濾

    接口權(quán)限過濾是指對(duì)于某些接口或功能,系統(tǒng)通過設(shè)定一定的權(quán)限規(guī)則,只允許經(jīng)過身份認(rèn)證且擁有相應(yīng)權(quán)限的用戶或應(yīng)用程序進(jìn)行訪問和操作 。這種技術(shù)可以有效地保護(hù)系統(tǒng)資源和數(shù)據(jù)安全,防止未授權(quán)的用戶或程序進(jìn)行惡意操作或非法訪問。通常情況下,接口權(quán)限過濾需

    2024年02月08日
    瀏覽(24)
  • SpringSecurity框架快速搭建(SpringBoot整合Security)

    SpringSecurity框架快速搭建(SpringBoot整合Security)

    目錄 Common類 Config類 CorsConfig(解決跨域問題) RedisConfig (Redis數(shù)據(jù)庫配置) Spring Security (配置安全功能的類) expression類(Expression 類通常用于權(quán)限控制和安全策略的定義) SGExpressionRoot(判斷用戶是否具有某個(gè)權(quán)限) Filter類 JwtAuthenticationTokenFilter(解析token看是否放行) Handler類

    2024年02月09日
    瀏覽(21)
  • Spring Security詳細(xì)講解(JWT+SpringSecurity登入案例)

    Spring Security詳細(xì)講解(JWT+SpringSecurity登入案例)

    1.SpringSecurity SpringSecurity 是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架 。它是保護(hù)基于 Spring 的應(yīng)用程序的事實(shí)上的標(biāo)準(zhǔn)。 SpringSecurity 是一個(gè)致力于為 Java 應(yīng)用程序提供身份驗(yàn)證和授權(quán)的框架 。像所有 Spring 項(xiàng)目一樣,Spring Security 的真正強(qiáng)大之處在于它可以如何輕

    2024年02月02日
    瀏覽(23)
  • Spring-Security實(shí)現(xiàn)登錄接口

    Spring-Security實(shí)現(xiàn)登錄接口

    Security 是 Spring 家族中的一個(gè)安全管理框架。相比與另外一個(gè)安全框架 Shiro ,它提供了更豐富的功能,社區(qū)資源也比Shiro豐富。 具體介紹和入門看springSecurity入門 在實(shí)現(xiàn)之前幺要了解一下登錄校驗(yàn)的流程以及 SpringSecurity 的原理以及認(rèn)證流程 1、登錄校驗(yàn)流程 2、 SpringSecurity完

    2024年01月18日
    瀏覽(22)
  • 【Sa-Token】SpringBoot 整合 Sa-Token 快速實(shí)現(xiàn) API 接口簽名安全校驗(yàn)

    在涉及跨系統(tǒng)接口調(diào)用時(shí),我們?nèi)菀着龅揭韵掳踩珕栴}: 請(qǐng)求身份被偽造 請(qǐng)求參數(shù)被篡改 請(qǐng)求被抓包,然后重放攻擊 sa-token api-sign 模塊將幫你輕松解決以上難題。(此插件是內(nèi)嵌到 sa-token-core 核心包中的模塊,開發(fā)者無需再次引入其它依賴,插件直接可用) 假設(shè)我們有如

    2024年02月17日
    瀏覽(20)
  • Spring Security in Action 第三章 SpringSecurity管理用戶

    Spring Security in Action 第三章 SpringSecurity管理用戶

    本專欄將從基礎(chǔ)開始,循序漸進(jìn),以實(shí)戰(zhàn)為線索,逐步深入SpringSecurity相關(guān)知識(shí)相關(guān)知識(shí),打造完整的SpringSecurity學(xué)習(xí)步驟,提升工程化編碼能力和思維能力,寫出高質(zhì)量代碼。希望大家都能夠從中有所收獲,也請(qǐng)大家多多支持。 專欄地址:SpringSecurity專欄 本文涉及的代碼都已

    2024年02月07日
    瀏覽(26)
  • Spring Security安全攔截基礎(chǔ)實(shí)現(xiàn)

    Spring?Security是基于Spring的一個(gè)安全管理框架。它相比Shiro,它的功能更豐富,社區(qū)資源也比Shiro更豐富! 1.導(dǎo)入Maven依賴 2.創(chuàng)建實(shí)體類User 3.訪問數(shù)據(jù)庫并驗(yàn)證用戶密碼 為了偷懶,我這里用的是Mybatis plus,哈哈哈哈 4.添加Spring Security的配置 繼承WebSecurityConfigurerAdapter 類并實(shí)現(xiàn)

    2024年02月15日
    瀏覽(18)
  • SpringBoot整合Spring Security實(shí)現(xiàn)權(quán)限控制

    SpringBoot整合Spring Security實(shí)現(xiàn)權(quán)限控制

    要對(duì)Web資源進(jìn)行保護(hù),最好的辦法莫過于Filter 要想對(duì)方法調(diào)用進(jìn)行保護(hù),最好的辦法莫過于AOP。 Spring Security進(jìn)行認(rèn)證和鑒權(quán)的時(shí)候,就是利用的一系列的Filter來進(jìn)行攔截的。 如圖所示,一個(gè)請(qǐng)求想要訪問到API就會(huì)從左到右經(jīng)過藍(lán)線框里的過濾器,其中 綠色部分是負(fù)責(zé)認(rèn)證的

    2024年02月15日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包