When
I am doing jwt login , I want to call findByUsernameAndPassword function in UserService, but when I use @AutoWired to create object in class CustomAuthenticationFilter it gets NullpointerException and it makes me unable to find User My code : UserRepository
import com.insmart.app.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username = ?1")
User findByUsername(String username);
@Query("SELECT u FROM User u WHERE u.username = ?1 AND u.password = ?2")
User findByUsernameAndPassword(String username, String password);
}
My code : UserService
package com.insmart.app.service;
import com.insmart.app.model.User;
import com.insmart.app.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService{
@Autowired
private UserRepository userRepository;
public User save(User user) {
user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
return userRepository.save(user);
}
public User findById(Long id) {
return userRepository.findById(id).get();
}
public void deleteById(Long id) {
userRepository.deleteById(id);
}
public List<User> findAll() {
return userRepository.findAll();
}
public User update(User user,Long id) {
User user1 = userRepository.findById(id).get();
user1.setDescription(user.getDescription());
user1.setName(user.getName());
user1.setEmail(user.getEmail());
user1.setPassword(user.getPassword());
return userRepository.save(user);
}
public User findByUsername(String username) {
return userRepository.findByUsername(username);
}
public User findByUsernameAndPassword(String username,String password) {
return userRepository.findByUsernameAndPassword(username,password);
}
}
My code : CustomAuthenticationFilter
package com.insmart.app.filter;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.insmart.app.model.Organization;
import com.insmart.app.model.User;
import com.insmart.app.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.Date;
import java.util.stream.Collectors;
@Slf4j
@RequiredArgsConstructor
public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final AuthenticationManager authenticationManager;
@Autowired
UserService userService;
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = new User();
userService = new UserService();
try {
user = userService.findByUsernameAndPassword(username,password);
log.info("\n username: {} \n password: {}",username,password);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword(),Collections.emptyList());
log.info("attemptAuthentication {}",authenticationToken);
return authenticationManager.authenticate(authenticationToken);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
User user =(User) authResult.getPrincipal();
Algorithm algorithm = Algorithm.HMAC256("secret".getBytes());
String accessToken = JWT.create().
withSubject(user.getUsername()).
withExpiresAt(new Date(System.currentTimeMillis()+10*60*1000)).
withIssuer(request.getRequestURL().toString()).
withClaim("roles",user.getOrganizations().stream().map(Organization::getOrganization).collect(Collectors.toList())).
sign(algorithm);
String refreshToken = JWT.create().
withSubject(user.getUsername()).
withExpiresAt(new Date(System.currentTimeMillis()+30*60*1000)).
withIssuer(request.getRequestURL().toString()).
sign(algorithm);
response.setHeader("access-token",accessToken);
response.setHeader("refresh-token",refreshToken);
}
}
My code : SecurityConfig
package com.insmart.app.config;
import com.insmart.app.filter.CustomAuthenticationFilter;
import lombok.RequiredArgsConstructor;
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.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
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;
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN")
.authorities("ACCESS_TEST1","ACCESS_TEST2")
.and()
.withUser("user")
.password(passwordEncoder().encode("user"))
.roles("USER")
.authorities("ACCESS_TEST1");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// http.authorizeRequests().anyRequest().permitAll();
http
.authorizeRequests()
.antMatchers("/css/**", "/index").permitAll()
.antMatchers("/user/**").authenticated()
.and()
.formLogin().loginPage("/login")
.and()
.logout()
.logoutUrl("/logout");
http.addFilter(new CustomAuthenticationFilter((authenticationManagerBean())));
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
I want to use findByUsernameAndPassword in CustomAuthenticationFilter class, So I used @Autowired in UserService, I tried adding @Service in CustomAuthenticationFilter class it doesn't work either. I hope you can help me. I appreciate your help