无法通过Spring Security中的登录页面

时间:2019-12-26 04:01:56

标签: spring-boot spring-security

下面是我的控制器类

@RestController
public class MainController {

    @GetMapping("/")
    public String home(){
        return "<h1>Welcome All</h1>";
    }

    @GetMapping("/user")
    public String user(){
        return "<h1>Welcome User</h1>";
    }

    @GetMapping("/admin")
    public String admin(){
        return "<h1>Welcome Admin</h1>";
    }
   }

下面是我的SpringSecurityConfig类。

public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.inMemoryAuthentication()
                .withUser("user").password("user").roles("USER")
                .and()
                .withUser("admin").password("admin").roles("ADMIN");

    }


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


    @Override
    protected void configure(HttpSecurity http) throws Exception {

             http
                  .authorizeRequests()
                  .antMatchers("/admin").hasRole("ADMIN")
                  .antMatchers("/user").hasRole("USER")
                  .antMatchers("/").permitAll()
                  .and().formLogin();

    }
}

我无法通过登录页面。当我输入用户名和密码时,它将重定向回登录页面。甚至我已经启用了csrf禁用功能,但仍然无法正常工作。

1 个答案:

答案 0 :(得分:0)

可能是您的密码编码器正在创建问题。

尝试

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    String user = passwordEncoder().encode("user");
    String admin = passwordEncoder().encode("admin");
    auth.inMemoryAuthentication()
            .withUser("user").password(user).roles("USER")
            .and()
            .withUser("admin").password(admin).roles("ADMIN");
}

@Bean
public PasswordEncoder getPasswordEncoder(){
    return new BCryptPasswordEncoder();
}

或者如果您想保留NoOpPasswordEncoder作为编码器

如果您使用的是inmemoryAuthentication,请像这样更改Spring Security 5

这会将密码编码器委派给NoOpPasswordEncoder

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
            .withUser("user").password("{noop}user").roles("USER")
            .and()
            .withUser("admin").password("{noop}admin").roles("ADMIN");
}

如果这不起作用。请在日志中查找任何错误并添加日志。

编辑1:

对于403错误,请在您的配置中添加httpBasic()

@Override
protected void configure(HttpSecurity http) throws Exception {
         http
              .httpBasic()
              .and()
              .authorizeRequests()
              .antMatchers("/admin").hasRole("ADMIN")
              .antMatchers("/user").hasRole("USER")
              .antMatchers("/").permitAll()
              .and().formLogin();
}