问题

今天学习SpringSecurity自定义表单登录的时候,一直报

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

源代码为:

package cn.notelist.springsecurity;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
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;

/**
 * @ClassName: MyUserDetailsService
 * @Description:
 * @Author ye21st
 * @Date 2019-08-08 11:31:13
 */
@Component
public class MyUserDetailsService implements UserDetailsService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        logger.info("登录用户名:" + username);
        return new User(username, "123456",true,true,true,
                true, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}

看报错信息是因为安全机制,不允许明文密码登录,必须是加密后的密码才能运行登录,那么我们需要进行如此修改:

原有的SpringSecurityConfig类文件,新增PasswordEncoder:

package cn.notelist.springsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @ClassName: SecutityConfig
 * @Description:
 * @Author ye21st
 * @Date 2019-07-30 11:28:05
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * @description [密码加密器]
     * @title passwordEncoder
     * @author ye21st
     * @date 2019-08-08
     * @time 14:29
     * @return org.springframework.security.crypto.password.PasswordEncoder
     **/
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

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

原有自定义表单登录代码部分,新增如下:

package cn.notelist.springsecurity;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * @ClassName: MyUserDetailsService
 * @Description:
 * @Author ye21st
 * @Date 2019-08-08 11:31:13
 */
@Component
public class MyUserDetailsService implements UserDetailsService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        logger.info("登录用户名:" + username);
        return new User(username, passwordEncoder.encode("123456"),true,true,true,
                true, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}

将代码进行如上修改,再重新进行表单登录,即可正常访问。

Last modification:December 18, 2020
If you think my article is useful to you, please feel free to appreciate