JWTとの認証が必要なREST APIを作成しました。JWTトークンを使用している場合、Springブートセキュリティコンテキストがnullを返します
私の実装では、私は現在のユーザーを返すようにしようとすると、私はいつもnull
リターンを受け取るhttps://auth0.com/blog/securing-spring-boot-with-jwts/
で見つけたコードと非常によく似ています。
マイコード:
WebSecurity社:
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests()
// login
.antMatchers(HttpMethod.POST, "/login")
.permitAll()
.anyRequest()
.authenticated()
.and()
.addFilterBefore(new JWTLoginFilter(
"/login", authenticationManager(), logService), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
JWTAuthenticationFilter:
public class JWTAuthenticationFilter extends GenericFilterBean {
@Override
public void doFilter(
ServletRequest req,
ServletResponse res,
FilterChain filterChain) throws IOException, ServletException {
Authentication authentication = TokenAuthenticationService.getAuthentication((HttpServletRequest)req);
SecurityContextHolder.getContext().setAuthentication(authentication);
filterChain.doFilter(req, res);
}
}
JWTは、[OK]を働いているので、私は、JWT認証のすべてのコードが含まれていません、ユーザーアクセス。 問題はフィルタまたはいくつかの設定にあると私は信じています。
public Authentication getAuthentication() {
return SecurityContextHolder.getContext().getAuthentication();
}
が、これは働いていません。
その後、私は次のコード(http://www.baeldung.com/get-user-in-spring-securityの方法4)で、service
またはcontroller
上の現在のユーザーを取得するためにfacade
を作りました。 - SecurityContextHolder.getContext()
[email protected]ffffff: Null authentication
が返されました。 - SecurityContextHolder.getContext().getAuthentication()
が返されましたnull
オブジェクトです。
更新(およびソリューション):
私のコントローラで、私はこのコードを使用した場合、:
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
を私は、現在のユーザーが、私のサービスでは、まったく同じコードを取得することができます動作しません。 、そして私のサービスはそう
@Async
public CompletableFuture<Optional<ViewUserDto>> findByLogin(String login) throws InterruptedException {
...
}
非同期(async)で、ここで見つけるコードを使用: しかし、その後、私はSecurityContext
は、別のスレッド(https://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.htmlソース):上の「失われた」であることを覚えてhttps://stackoverflow.com/a/40347437/4794469を、すべてが正常に動作します。 これが私のコードに何らかの副作用をもたらす可能性があるかどうかは分かりません(すべての単体テストが機能します)
これは今でも試しましたが、問題は解決しません。まだnull認証 –