Spring Security提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密。
BCrypt强哈希方法,每次加密结果都不一样。
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.添加配置类
我们在添加了spring security依赖后,所有的地址都被spring security所控制了,我们目前只是需要用到BCrypt密码加密的部分,所以我们要添加一个配置类,配置为所有地址都可以匿名访问。
package config;
import org.springframework.context.annotation.Configuration;
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;
/**
* 安全配置类
*/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
//authorizeRequests所有security全注解配置实现的开端,表示开始说明需要的权限
//需要的权限分两部分,第一部分是拦截的路径,第二部分访问该路径需要的权限
//antMatchers表示拦截什么路径,permitAll任何权限都可以访问,直接放行所有。
//anyRequest()任何的请求,authenticated认证后才能访问
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
3.在Springboot启动类中,配置bean
@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
4.密码加密
@Autowired
BCryptPasswordEncoder encoder;
public void add(User user) {
user.setId(idWorker.nextId()+""); //主键值
//密码加密
String newpassword = encoder.encode(user.getPassword());//加密后的密码
user.setPassword(newpassword);
userDao.save(user);
}
5.密码校验
public User findByLoginNameAndPwd(String loginName,String password){
User user = userDao.findByLoginName(loginName);
if(user!=null && encoder.matches(password,user.getPassword)){
return user;
}else{
return null;
}
}