亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Spring Security 為基本身份驗證和 JWT 配置多種身份驗證類型

使用 Spring Security 為基本身份驗證和 JWT 配置多種身份驗證類型

慕村225694 2023-08-23 14:32:52
我有一個 API,需要通過兩種不同的方式來保護:1) 對除 1 之外的所有請求 URL 使用 JWT,這些請求 URL 需要通過基本身份驗證進行保護2) 一個 url 的基本身份驗證。我已經為 JWT 和基本身份驗證設置了安全配置。我的問題是,當我使用有效的用戶名和密碼向基本身份驗證 URL 發出請求時,它成功地對我進行了身份驗證,并完成了在 cassandra 中存儲數據的工作。然后,我希望必須通過 /api/login 為所有其他請求 URL 生成令牌,并將其添加到 Authorization: Bearer {Token} 標頭中。但是,如果我通過基本身份驗證進行了身份驗證,則我可以訪問其他 URL(受 JWT 身份驗證保護),甚至無需在請求中包含令牌。當我在沒有使用基本身份驗證的情況下訪問受 JWT 保護的 URL 時,我必須在標頭中發送令牌,并且它會按預期工作。我應該期待這個嗎?我相信,即使我通過一個端點的基本身份驗證進行了身份驗證,我仍然應該在所有其他受保護的 JWT 端點的請求中發送令牌。我找到了這個答案: SpringBoot multipleauthenticationadapter還有這篇文章: https://docs.spring.io/spring-security/site/docs/4.2.x/reference/htmlsingle/#multiple-httpsecurity并嘗試實施解決方案,但所解釋的問題仍然出現。使用 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;我希望這是有道理的。如果還有其他問題,請告訴我,但似乎無法解決這個問題。我首先添加了“特殊情況”,這是基本身份驗證的一個 url,但仍然沒有任何區別。謝謝
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

您在安全配置中發布的代碼@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)不會咨詢您的配置。這將是死配置。
讓我解釋!
http.authorizeRequests()==http.antMatcher("/**").authorizeRequests()

在你的第一個配置中,你使用了通配符,你的配置結果是

  • /v1/crash/consumeCrashBoxxEvent如果用戶經過身份驗證并且具有 ADMIN 角色,則可以訪問

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

讓我猜猜發生了什么!
1. 您正在點擊 URL /v1/crash/consumeCrashBoxxEvent,否則any URL系統將提示您進行基本身份驗證。
2. 身份驗證成功后,您可以訪問任何 URL,因為您是經過身份驗證的用戶。

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

因為正如我所說,您可以訪問任何 URL,因為您是經過身份驗證的用戶

當我在沒有使用基本身份驗證的情況下訪問受 JWT 保護的 URL 時,我必須在標頭中發送令牌,并且它會按預期工作

檢查沒有令牌您是否可以訪問。因為一旦您通過基本身份驗證登錄,就不會從服務器端注銷(即使您重新啟動服務器)。只有關閉瀏覽器才能實現注銷。因此,您可以通過關閉并再次啟動瀏覽器來測試它。并通過不發送 JWT 令牌來測試它。
還要確保您的請求到達 JwtAuthenticationTokenFilter,放入調試日志進行驗證。

正如您的問題中有很多抽象,除非您發布完整的代碼,否則很難準確預測正在發生的情況。

如果我的預測與實際有所偏差,請在評論中告訴我。



查看完整回答
反對 回復 2023-08-23
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

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


對方法的一個小改變configure就達到了目的。更新是:


@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);

    }


查看完整回答
反對 回復 2023-08-23
  • 2 回答
  • 0 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號