简体   繁体   中英

How to add jwt authendication header with all requests in spring security?

I followed this link and set up the jwt authentication. It is working fine. All requests are made from java script by attaching the authentication header like below in that.

    $.ajax({
        url: "/user",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        headers: "Authorization": token,
        success: function (data, textStatus, jqXHR) {
            var $userInfoBody = $userInfo.find("#userInfoBody");

            $userInfoBody.append($("<div>").text("Username: " + data.username));
            $userInfoBody.append($("<div>").text("Email: " + data.email));

            var $authorityList = $("<ul>");
            data.authorities.forEach(function (authorityItem) {
                $authorityList.append($("<li>").text(authorityItem.authority));
            });
            var $authorities = $("<div>").text("Authorities:");
            $authorities.append($authorityList);
            $userInfoBody.append($authorities);
            $userInfo.show();
        }
    });

But I want this to be attached to all the subsequent requests not via javascript.

Here is my security Config

httpSecurity
            // we don't need CSRF because our token is invulnerable
            .csrf()
            .disable()
            .exceptionHandling()
            .authenticationEntryPoint(unauthorizedHandler)
            .and()
            // don't create session
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            // .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            // allow anonymous resource requests
            .antMatchers(HttpMethod.GET, "/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js")
            .permitAll().antMatchers("/auth/**").permitAll().antMatchers("/vendors/**").permitAll()
            .antMatchers("/production/images/**").permitAll().anyRequest().authenticated().and().formLogin()
            .loginPage("/login").loginProcessingUrl("/loginprocess").failureUrl("/?loginFailure=true").permitAll();

Here is my authentication filter

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String authToken = httpRequest.getHeader(this.tokenHeader);
    // authToken.startsWith("Bearer ")
    // String authToken = header.substring(7);
    String username = jwtTokenUtil.getUsernameFromToken(authToken);
    System.out.println("Token is " + authToken);
    System.out.println("Username is " + username);
    System.out.println("Audience is from " + jwtTokenUtil.getAudienceFromToken(authToken));
    if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
        UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
        System.out.println(userDetails.getAuthorities());
        if (jwtTokenUtil.validateToken(authToken, userDetails)) {
            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                    userDetails, null, userDetails.getAuthorities());
            authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
            SecurityContextHolder.getContext().setAuthentication(authentication);
        } else {
            System.out.println("Token is invalid ");
        }
    }
    chain.doFilter(request, response);
}

How can I attach the authentication header to the response from the server after authentication. So that all the subsequent requests will automatically go with that authentication header.

Is the approach I am thinking is correct? Or any other best approach is there?

The front end is responsible for adding the header to every request, not the back end. If you don't want to do this using JS, you can use a secure, httponly cookie. When you set a cookie form the backend, it will include it on every subsequent request to the domain it was issued from.

However, there are some security concerns with using a cookie. This article does a good job of explaining the security considerations.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM