[英]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);
}
為什么不創建兩種類型的端點:
然后僅對“ / api / auth / **”配置安全性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.