簡體   English   中英

如何在Spring Security中忽略端點?

[英]How to ignore endpoint in Spring Security?

我正在嘗試實現JWT。 我有兩個端點:用於返回生成的JWT令牌的身份驗證的/api/auth/signin和應該基於標頭中的JWT令牌返回用戶的/api/auth/me 我正在嘗試將Spring Security配置為僅對授權用戶具有對/api**訪問權限,並且需要排除/api/auth/signin這是擴展WebSecurityConfigurerAdapter類中的configure()方法:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/api**")
            .httpBasic().disable()
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/auth/signin").permitAll()
                .anyRequest().authenticated()
            .and()
            .addFilterBefore(jwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
}

但是它仍然為/api/auth/signin signin調用JwtAuthorizationFilter。 我還嘗試通過以下方法忽略此端點:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(HttpMethod.POST,"/api/auth/signin");
}

還有其他方法可以忽略它嗎?或者permitAll()permitAll() ignoring()應該以不同的方式使用?

您需要一個AbstractAuthenticationProcessingFilter過濾器來在/ api / auth / signin上生成JWT令牌,以及一個GenericFilterBean來檢索身份驗證對象並將其放入SecurityContextHolder

以下鏈接中有一個很好的示例:

https://auth0.com/blog/securing-spring-boot-with-jwts/

http.antMatcher("/api**")
                .httpBasic().disable()
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            // We filter the api/login requests
            .addFilterBefore(new JWTLoginFilter("/api/auth/signin", authenticationManager()),
                    UsernamePasswordAuthenticationFilter.class)
            // And filter other requests to check the presence of JWT in header
            .addFilterBefore(new jwtAuthorizationFilter(),
                    UsernamePasswordAuthenticationFilter.class);

而且我不確定是否可以從響應正文中的JWTLoginFilter中的successAuthentication()返回生成的令牌

該示例在響應的Authorization標頭中返回令牌。 但是如果您想在體內返回令牌。 您可以使用以下代碼:

static void addAuthentication(HttpServletResponse res, String username) {
        String JWT = Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
//        res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
        JSONObject tokenJson = new JSONObject();
        tokenJson.put(SecurityConstants.JWT_TOKEN, JWT);
        tokenJson.put(SecurityConstants.USERNAME, username);
        try(PrintWriter writer = res.getWriter()) {
            writer.print(tokenJson.toJSONString());
            writer.flush();
        } catch (IOException e) {
            LOG.error("error ...");
        }
//        res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
    }

為什么不創建兩種類型的端點:

  1. 授權的API:“ / api / auth / **”
  2. 未經授權的API:“ / api / noauth / **”

然后僅對“ / api / auth / **”配置安全性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM