第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 Spring Security 為基本身份驗(yàn)證和 JWT 配置多種身份驗(yàn)證類型

使用 Spring Security 為基本身份驗(yàn)證和 JWT 配置多種身份驗(yàn)證類型

慕村225694 2023-08-23 14:32:52
我有一個(gè) API,需要通過兩種不同的方式來保護(hù):1) 對(duì)除 1 之外的所有請(qǐng)求 URL 使用 JWT,這些請(qǐng)求 URL 需要通過基本身份驗(yàn)證進(jìn)行保護(hù)2) 一個(gè) url 的基本身份驗(yàn)證。我已經(jīng)為 JWT 和基本身份驗(yàn)證設(shè)置了安全配置。我的問題是,當(dāng)我使用有效的用戶名和密碼向基本身份驗(yàn)證 URL 發(fā)出請(qǐng)求時(shí),它成功地對(duì)我進(jìn)行了身份驗(yàn)證,并完成了在 cassandra 中存儲(chǔ)數(shù)據(jù)的工作。然后,我希望必須通過 /api/login 為所有其他請(qǐng)求 URL 生成令牌,并將其添加到 Authorization: Bearer {Token} 標(biāo)頭中。但是,如果我通過基本身份驗(yàn)證進(jìn)行了身份驗(yàn)證,則我可以訪問其他 URL(受 JWT 身份驗(yàn)證保護(hù)),甚至無需在請(qǐng)求中包含令牌。當(dāng)我在沒有使用基本身份驗(yàn)證的情況下訪問受 JWT 保護(hù)的 URL 時(shí),我必須在標(biāo)頭中發(fā)送令牌,并且它會(huì)按預(yù)期工作。我應(yīng)該期待這個(gè)嗎?我相信,即使我通過一個(gè)端點(diǎn)的基本身份驗(yàn)證進(jìn)行了身份驗(yàn)證,我仍然應(yīng)該在所有其他受保護(hù)的 JWT 端點(diǎn)的請(qǐng)求中發(fā)送令牌。我找到了這個(gè)答案: SpringBoot multipleauthenticationadapter還有這篇文章: https://docs.spring.io/spring-security/site/docs/4.2.x/reference/htmlsingle/#multiple-httpsecurity并嘗試實(shí)施解決方案,但所解釋的問題仍然出現(xiàn)。使用 BasicAuthEntryPoint 類:public class CustomBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {    private static final Gson gson = new Gson();    @Override    public void commence(final HttpServletRequest request, final HttpServletResponse response,            final AuthenticationException authException) throws IOException, ServletException {        // Authentication failed, send error response.        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);        PrintWriter writer = response.getWriter();        writer.println(gson.toJson("HTTP Status 401 : " + authException.getMessage()));    }    @Override    public void afterPropertiesSet() throws Exception {        setRealmName("Realm");        super.afterPropertiesSet();    }還有 JWT impl:@Componentpublic class JwtAuthenticationTokenFilter extends OncePerRequestFilter {    @Value("${jwt.header}")    private String tokenHeader;我希望這是有道理的。如果還有其他問題,請(qǐng)告訴我,但似乎無法解決這個(gè)問題。我首先添加了“特殊情況”,這是基本身份驗(yàn)證的一個(gè) url,但仍然沒有任何區(qū)別。謝謝
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊

您在安全配置中發(fā)布的代碼@Order(1)


@Override

protected void configure(HttpSecurity http) throws Exception {

    http.csrf().disable().authorizeRequests().antMatchers("/v1/crash/consumeCrashBoxxEvent").hasRole("ADMIN").and()

            .httpBasic().authenticationEntryPoint(getBasicAuthEntryPoint()).and().sessionManagement()

            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

}

如果這正是您正在使用的代碼,則@Order(2)不會(huì)咨詢您的配置。這將是死配置。
讓我解釋!
http.authorizeRequests()==http.antMatcher("/**").authorizeRequests()

在你的第一個(gè)配置中,你使用了通配符,你的配置結(jié)果是

  • /v1/crash/consumeCrashBoxxEvent如果用戶經(jīng)過身份驗(yàn)證并且具有 ADMIN 角色,則可以訪問

  • Rest of URL's如果用戶通過身份驗(yàn)證則可以訪問

讓我猜猜發(fā)生了什么!
1. 您正在點(diǎn)擊 URL /v1/crash/consumeCrashBoxxEvent,否則any URL系統(tǒng)將提示您進(jìn)行基本身份驗(yàn)證。
2. 身份驗(yàn)證成功后,您可以訪問任何 URL,因?yàn)槟墙?jīng)過身份驗(yàn)證的用戶。

但是,如果我通過基本身份驗(yàn)證進(jìn)行了身份驗(yàn)證,則我可以訪問其他 URL(受 JWT 身份驗(yàn)證保護(hù)),甚至無需在請(qǐng)求中包含令牌。

因?yàn)檎缥宜f,您可以訪問任何 URL,因?yàn)槟墙?jīng)過身份驗(yàn)證的用戶

當(dāng)我在沒有使用基本身份驗(yàn)證的情況下訪問受 JWT 保護(hù)的 URL 時(shí),我必須在標(biāo)頭中發(fā)送令牌,并且它會(huì)按預(yù)期工作

檢查沒有令牌您是否可以訪問。因?yàn)橐坏┠ㄟ^基本身份驗(yàn)證登錄,就不會(huì)從服務(wù)器端注銷(即使您重新啟動(dòng)服務(wù)器)。只有關(guān)閉瀏覽器才能實(shí)現(xiàn)注銷。因此,您可以通過關(guān)閉并再次啟動(dòng)瀏覽器來測(cè)試它。并通過不發(fā)送 JWT 令牌來測(cè)試它。
還要確保您的請(qǐng)求到達(dá) JwtAuthenticationTokenFilter,放入調(diào)試日志進(jìn)行驗(yàn)證。

正如您的問題中有很多抽象,除非您發(fā)布完整的代碼,否則很難準(zhǔn)確預(yù)測(cè)正在發(fā)生的情況。

如果我的預(yù)測(cè)與實(shí)際有所偏差,請(qǐng)?jiān)谠u(píng)論中告訴我。



查看完整回答
反對(duì) 回復(fù) 2023-08-23
?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

這是通過使用 Praveen Kumar Lalasangi 的上述答案中提供的信息解決的。


對(duì)方法的一個(gè)小改變configure就達(dá)到了目的。更新是:


@Override

    protected void configure(HttpSecurity http) throws Exception {

      http.csrf().disable()

      .antMatcher(crashBoxxConsumeEndpoint).authorizeRequests().anyRequest()

      .hasRole("ADMIN")

      .and().httpBasic().authenticationEntryPoint(getBasicAuthEntryPoint())

      .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    }


查看完整回答
反對(duì) 回復(fù) 2023-08-23
  • 2 回答
  • 0 關(guān)注
  • 244 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)