代码之家  ›  专栏  ›  技术社区  ›  sanjay

试图生成JWT令牌,但遇到问题无法调用“org.apache.commons.logging.Log.isDebugEnabled()”,因为“this.logger”为null

  •  0
  • sanjay  · 技术社区  · 1 年前

    我正试图在我的spring-boot项目中创建JWT令牌(spring-boot3.1.4,java17,JWT 0.11.5) 但我面临的问题如下:

    [INFO] [org.springframework.aop.framework.CglibAopProxy] -Unable to proxy interface-implementing method [public final void org.springframework.web.filter.OncePerRequestFilter.doFilter(jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse,jakarta.servlet.FilterChain) throws jakarta.servlet.ServletException,java.io.IOException] because it is marked as final: Consider using interface-based JDK proxies instead!`your text`
    [2024-01-19 03:07:01,117] [NDC21_3_RETAILER_ADAPTOR] [] [] [] [] [] [] [INFO] [org.springframework.aop.framework.CglibAopProxy] -Unable to proxy interface-implementing method [public final void org.springframework.web.filter.GenericFilterBean.init(jakarta.servlet.FilterConfig) throws jakarta.servlet.ServletException] because it is marked as final: Consider using interface-based JDK proxies instead!
    [2024-01-19 03:07:01,177] [NDC21_3_RETAILER_ADAPTOR] [] [] [] [] [] [] [ERROR] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/contentmarketplace]] -Exception starting filter [jwtAuthFilter]
    java.lang.NullPointerException: Cannot invoke "org.apache.commons.logging.Log.isDebugEnabled()" because "this.logger" is null
        at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:239)
    
    
    import java.io.IOException;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import com.sa.v2.retaileradapters.service.impl.UserDetailsServiceImpl;
    
    import jakarta.servlet.FilterChain;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    @Component
    public class JwtAuthFilter extends OncePerRequestFilter {
    
        @Autowired
        private JwtService jwtService;
    
        @Autowired
        UserDetailsServiceImpl userDetailsServiceImpl;
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    
            String authHeader = request.getHeader("Authorization");
            String token = null;
            String username = null;
            if(authHeader != null && authHeader.startsWith("Bearer ")){
                token = authHeader.substring(7);
                username = jwtService.extractUsername(token);
            }
    
            if(username != null && SecurityContextHolder.getContext().getAuthentication() == null){
                UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(username);
                if(jwtService.validateToken(token, userDetails)){
                    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                    authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                    SecurityContextHolder.getContext().setAuthentication(authenticationToken);
                }
    
            }
    
            filterChain.doFilter(request, response);
        }
    }
    
    
    
    
    import java.security.Key;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.function.Function;
    
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.stereotype.Component;
    
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import io.jsonwebtoken.io.Decoders;
    import io.jsonwebtoken.security.Keys;
    
    @Component
    public class JwtService {
    
        public static final String SECRET = "357638792F423F4428472B4B6250655368566D597133743677397A2443264629";
    
        public String extractUsername(String token) {
            return extractClaim(token, Claims::getSubject);
        }
    
        public Date extractExpiration(String token) {
            return extractClaim(token, Claims::getExpiration);
        }
    
        public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
            final Claims claims = extractAllClaims(token);
            return claimsResolver.apply(claims);
        }
    
        private Claims extractAllClaims(String token) {
            return Jwts
                    .parserBuilder()
                    .setSigningKey(getSignKey())
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        }
    
        private Boolean isTokenExpired(String token) {
            return extractExpiration(token).before(new Date());
        }
    
        public Boolean validateToken(String token, UserDetails userDetails) {
            final String username = extractUsername(token);
            return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
        }
    
    
    
        public String GenerateToken(String username){
            Map<String, Object> claims = new HashMap<>();
            return createToken(claims, username);
        }
    
    
    
        private String createToken(Map<String, Object> claims, String username) {
    
            return Jwts.builder()
                    .setClaims(claims)
                    .setSubject(username)
                    .setIssuedAt(new Date(System.currentTimeMillis()))
                    .setExpiration(new Date(System.currentTimeMillis()+1000*60*1))
                    .signWith(getSignKey(), SignatureAlgorithm.HS256).compact();
        }
    
        private Key getSignKey() {
            byte[] keyBytes = Decoders.BASE64.decode(SECRET);
            return Keys.hmacShaKeyFor(keyBytes);
        }
    }
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.authentication.AuthenticationProvider;
    import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
    import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
    import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.http.SessionCreationPolicy;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.web.SecurityFilterChain;
    import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
    
    import com.sa.v2.retaileradapters.security.JwtAuthFilter;
    import com.sa.v2.retaileradapters.service.impl.UserDetailsServiceImpl;
    
    @Configuration
    @EnableWebSecurity
    @EnableMethodSecurity
    public class SecurityConfig {
    
        @Autowired
        JwtAuthFilter jwtAuthFilter;
    
        @Bean
        public UserDetailsService userDetailsService() {
            return new UserDetailsServiceImpl();
        }
    
        @Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
            return http.csrf().disable()
                    .authorizeHttpRequests()
                    .requestMatchers("/api/v1/login").permitAll()
                    //.requestMatchers("/contentmarketplace/login").permitAll()
                    .and()
                    .authorizeHttpRequests().requestMatchers("contentmarketplace/ndc/v21/**")
                    .authenticated()
                    .and()
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .authenticationProvider(authenticationProvider())
                    .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class).build();
    
        }
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        @Bean
        public AuthenticationProvider authenticationProvider() {
            DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
            authenticationProvider.setUserDetailsService(userDetailsService());
            authenticationProvider.setPasswordEncoder(passwordEncoder());
            return authenticationProvider;
    
        }
    
        @Bean
        public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
            return config.getAuthenticationManager();
        }
    }
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.authentication.BadCredentialsException;
    import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.sa.v2.retaileradapters.DTO.AuthRequestDTO;
    import com.sa.v2.retaileradapters.DTO.JwtResponseDTO;
    import com.sa.v2.retaileradapters.security.JwtService;
    import com.sa.v2.retaileradapters.service.impl.UserDetailsServiceImpl;
    
    @RestController
    public class AuthController {
        
        @Autowired
        JwtService jwtService;
        
        @Autowired
        AuthenticationManager authenticationManager;
        
        @Autowired
        UserDetailsServiceImpl userDetailsService;
        
        @PostMapping("/api/v1/login")
        public JwtResponseDTO AuthenticateAndGetToken(@RequestBody AuthRequestDTO authRequestDTO){
            
            this.doAuthenticate(authRequestDTO.getUsername(), authRequestDTO.getPassword());
            
            UserDetails userDetails = userDetailsService.loadUserByUsername(authRequestDTO.getUsername());
            
            //String token = this.jwtService.GenerateToken(userDetails.getUsername());
            String token = this.jwtService.GenerateToken(authRequestDTO.getUsername());
            
            return  JwtResponseDTO.builder()
                    .accessToken(token)
                    .build();
    
        }
        
         private void doAuthenticate(String email, String password) {
    
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(email, password);
                try {
                    authenticationManager.authenticate(authentication);
    
    
                } catch (BadCredentialsException e) {
                    throw new BadCredentialsException(" Invalid Username or Password  !!");
                }
    
            }
    
            @ExceptionHandler(BadCredentialsException.class)
            public String exceptionHandler() {
                return "Credentials Invalid !!";
            }
    }
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Component;
    
    import com.sa.v2.retaileradapters.entity.UserInfo;
    import com.sa.v2.retaileradapters.helper.CustomUserDetails;
    import com.sa.v2.retaileradapters.repository.UserRepo;
    
    @Component
    public class UserDetailsServiceImpl implements UserDetailsService {
    
        @Autowired
        private UserRepo userRepository;
    
        private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
            logger.debug("Entering in loadUserByUsername Method...");
            UserInfo user = userRepository.findByUsername(username);
            if(user == null){
                logger.error("Username not found: " + username);
                throw new UsernameNotFoundException("could not found user..!!");
            }
            logger.info("User Authenticated Successfully..!!!");
            return new CustomUserDetails(user);
        }
    }
    
    
    
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    
    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.core.authority.SimpleGrantedAuthority;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.stereotype.Component;
    
    import com.sa.v2.retaileradapters.entity.UserInfo;
    import com.sa.v2.retaileradapters.entity.UserRole;
    
    @Component
    public class CustomUserDetails extends UserInfo implements UserDetails {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private String username;
        private String password;
        Collection<? extends GrantedAuthority> authorities;
    
        public CustomUserDetails(UserInfo byUsername) {
            this.username = byUsername.getUsername();
            this.password= byUsername.getPassword();
            List<GrantedAuthority> auths = new ArrayList<>();
    
            for(UserRole role : byUsername.getRoles()){
    
                auths.add(new SimpleGrantedAuthority(role.getName().toUpperCase()));
            }
            this.authorities = auths;
        }
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return authorities;
        }
    
        @Override
        public String getPassword() {
            return password;
        }
    
        @Override
        public String getUsername() {
            return username;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }
    
        @Override
        public boolean isEnabled() {
            return true;
        }
    
    
    

    我希望生成jwt令牌并解决异常。为什么会出现异常?这个问题的解决方案是什么?

    0 回复  |  直到 1 年前