繁体   English   中英

Spring Security / Java配置-无法使用现有用户登录

[英]Spring Security/Java config - Can not login with existing user

我在创建简单的登录表单时正在学习Spring Security 我正在使用Java配置。 我有内存用户和一个简单的过滤器链。

但是,当我输入现有的用户名密码组合时, Spring会将我重定向到带有url的登录表单: login?error.

这是我的Spring Security配置类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

//    @Autowired
//    AuthProvider provider;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user1").password("").roles("USER")
                .and()
                .withUser("user2").password("").roles("USER")
                .and()
                .withUser("admin").password("1").roles("ADMIN");
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                    .disable()
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll();

    }


//    @Override
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        auth.authenticationProvider(provider);
//    }
}

这是我的JSP表格:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
${message}
<br>
<form method="post" action="/login">
    <input type="text" name="login"/>
    <input type="text" name="pass"/>
    <input type="submit" value="enter"/>
</form>
</body>
</html>

在你的代码中

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user1").password("").roles("USER")
                .and()
                .withUser("user2").password("").roles("USER")
                .and()
                .withUser("admin").password("1").roles("ADMIN");
}

@Override替换@Autowired

并在此处[1]遵循此做法: https : //www.baeldung.com/spring-security-login

... auth.inMemoryAuthentication()
      .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
      .and() ...

如下使用BCryptPasswordEncoder作为相同代码中的bean

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

对于管理员用户,请尝试:

.withUser("admin").password("{noop}1").roles("ADMIN");

这是一种以纯文本形式存储密码的方法(显然不建议这样做...)。 通过添加{noop}前缀,表明您要使用NoopPasswordEncoder

否则,您应该指定密码编码器,例如:

@Bean
public BCryptPasswordEncoder passEncoder() {
  return new BCryptPasswordEncoder();
}

并像这样更新您的SecurityConfig

@Autowired
private BCryptPasswordEncoder passEncoder;

@Override
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .passwordEncoder(passEncoder)
                .withUser("user1").password("").roles("USER")
                .and()
                .withUser("user2").password("").roles("USER")
                .and()
                .withUser("admin").password("1").roles("ADMIN");
}

看一下formLogin(String loginPage) javadoc-username和password的默认参数是usernamepassword 因此,您应该在.jsp中引用它们,然后登录应该起作用。 因此,您应该尝试将jsp重构为以下内容:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
${message}
<br>
<form method="post" action="/login">
    <input type="text" id="username" name="username"/>
    <input type="password" id="password" name="password"/>
    <input type="submit" value="enter"/>
</form>
</body>
</html>

如上所述,我的代码中出现了所有三个错误。 我接受了所有三个解决方案,并且对我有用。 谢谢!

工作的代码:

我的SecurityConfig:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


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

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user1").password(passwordEncoder().encode("1")).roles("USER")
                .and()
                .withUser("user2").password(passwordEncoder().encode("1")).roles("USER")
                .and()
                .withUser("admin").password(passwordEncoder().encode("1")).roles("ADMIN");


    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                    .disable()
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                        .usernameParameter("login")
                        .passwordParameter("pass")
                    .permitAll();

    }

}

我的jsp表格:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
${message}
<br>
<form method="post" action="/login">
    <input type="text" name="login"/>
    <input type="text" name="pass"/>
    <input type="submit" value="enter"/>
</form>
</body>
</html>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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