Home > OS >  Hello, im doing a school project and im trying to use spring security with PostgreSQL, i wanna get u
Hello, im doing a school project and im trying to use spring security with PostgreSQL, i wanna get u

Time:11-26

@ComponentScan(basePackages = {"conf"})
@ComponentScan(basePackages = {"application.controller"})
@ComponentScan(basePackages = {"applicaion.model"})
@ComponentScan(basePackages = {"applicaion.dao"})
@ComponentScan(basePackages = {"usersDetails"})
@SpringBootApplication
@EnableJpaRepositories
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Security config part

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {



    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }

    @Override
    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }




    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .permitAll();

    }

    @Bean
    public PasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}

}

User Entity

"felhasznalonev"==username and "felhasznalo"==user in hungarian in the database table has theese names

@Entity
@Table( name="felhasznalo")
public class User {

    @Id
    @GeneratedValue
    private int id;
    
    @Column( unique=true, nullable=false )
    private String felhasznalonev;
    
    @Column( nullable=false )
    private String jelszo;
    
    private int statusz;
    
    public User() {}

    public User(String felhasznalonev,String jelszo,int statusz) {
        this.felhasznalonev=felhasznalonev;
        this.jelszo=jelszo;
        this.statusz=statusz;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFelhasznalonev() {
        return felhasznalonev;
    }

    public void setFelhasznalonev(String email) {
        this.felhasznalonev = email;
    }

    public String getJelszo() {
        return this.jelszo;
    }

    public void setPassword(String password) {
        this.jelszo = password;
    }

    
    @Override
    public String toString() {
        return null;
    }

    public int getStatusz() {
        return statusz;
    }

    public void setStatusz(int statusz) {
        this.statusz = statusz;
    }
    
}

userServiceimpl part

@Service("userDetailsService")
public class UserServiceImpl implements UserService, UserDetailsService  {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository userRepository){
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = findByUsername(username);

        return new UserDetailsImpl(user);
    }

    @Override
    public User findByUsername(String username) {
        return userRepository.findByUsername(username);
    }
}

UserDetailsImpl part

public class UserDetailsImpl implements UserDetails {

    private User user;

    public UserDetailsImpl(User user) {
        this.user = user;
    }
    
    public UserDetailsImpl() {}
    
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Arrays.asList(new SimpleGrantedAuthority("USER"));
    }

    @Override
    public String getPassword() {
        return user.getJelszo();
    }

    @Override
    public String getUsername() {
        return user.getFelhasznalonev();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

UserService part

public interface UserService {
    public User findByUsername(String username);
}

UserRepository

public interface UserRepository extends JpaRepository<User,Integer> {
        
    User findByUsername(String username);
    
}

When i run the code everything looks fine, the basic login page come in, i enter the username/password from the database but nothing happen

and IntellIj write this:

2021-11-25 13:12:48.870 ERROR 13928 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause

java.lang.StackOverflowError: null at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:472) ~[spring-security-config-5.3.4.RELEASE.jar:5.3.4.RELEASE] at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:472) ~[spring-security-config-5.3.4.RELEASE.jar:5.3.4.RELEASE] -||-

the connection with database is good, i can list users as well Thanks for reading all this and sorry for bad english and mistakes, have a good day!

CodePudding user response:

You have doubly declared userDetailsService with the same name,

First:

   @Bean
    @Override
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }

Second:

@Service("userDetailsService")
public class UserServiceImpl implements UserService, UserDetailsService  {

It may cause the problem. You should have only one instance of userDetailService.

CodePudding user response:

In your SecurityConfig Can you try removing

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }

And changing the implementation for

 @Override
    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

to

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(new UserServiceImpl()).passwordEncoder(passwordEncoder());
    }
  • Related