加密效果如下: ( 数据库 )
1.为什么要加密?
① 为了保证数据安全 , 需要对用户密码进行加密 !
② 明文存储不安全 ( 用户设置的是啥,数据库中就是啥 )
故:我们在数据库中存储的密码往往是加密之后存储(密文)
2.什么是Bcrypt?
是一个跨平台的文件加密工具。
特点: 由它加密的文件可在所有支持的操作系统和处理器上进行转移。
它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。
注意: 密码越强大,数据就越安全。
一、对存储的密码进行加密
一、准备工作.
1.创建sys_user表(字段如上图)
2.创建POJO对象: SysUser.java ( 跟表的字段要保持一致 )
public class SysUser {
private Long id;
private String username;
private String password;
// getter / setter方法.
}
3.表单: user_add.jsp ( 用于保存用户输入的数据 )
<form action="${pageContext.request.contextPath}/sysUser/addSysUser" method="post">
用户名称:<input type="text" name="username" placeholder="用户名称" value="">
密码:<input type="password" name="password" placeholder="密码" value="">
<button type="submit">保存</button>
</form>
二、controller控制层
@Controller
@RequestMapping("sysUser")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
/**
* 需求: 添加用户信息 ( 保存到数据库 )
*/
@RequestMapping("addSysUser")
public String addSysUser(SysUser sysUser){
// 调用业务层 , 完成添加功能.
sysUserService.addSysUser(sysUser);
// 添加成功 -> 跳转到查询所有用户页面.
return "redirect:/sysUser/findAllUser";
}
}
三、service业务层.
1.Spring_service.xml ( 配置加密算法Bcrypt. )
<!-- 添加Bcrypt加密算法 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
2.接口: SysUserService.java
public interface SysUserService extends UserDetailsService {
// 添加用户信息.
void addSysUser(SysUser sysUser);
}
3.实现类: SysUserServiceImpl.java ( 处理加密逻辑 )
@Service
public SysUserServiceImpl implements SysUserService{
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Override
public void addSysUser(SysUser sysUser) {
// 获取用户输入的密码.
String oldPassword = sysUser.getPassword();
// 生成新的密码 (加密)
String newPassword = passwordEncoder.encode(oldPassword);
// 设置到SysUser中
sysUser.setPassword(newPassword);
sysUserMapper.addSysUser(sysUser);
}
四、Mapper数据层.
<!-- 添加用户( insert语句 ) -->
<insert id="addSysUser">
insert into sys_user
values(null,#{username},#{password})
</insert>
二、登录时,对用户输入的密码进行加密.( 进行密码比对 )
1.security.xml配置文件. ( 配置加密方式 )
<!-- 配置认证信息(用户名和密码) -->
<security:authentication-manager>
<!-- 从数据库中获取密码 -->
<security:authenticaiton-provider user-service-ref="userService">
<!-- 指定加密方式(跟存储时的要一致) -->
<security:password-encoder ref="passwordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
2.service层. ( 根据用户名查询用户信息 )
@Service("sysUserService")
public class SysUserServiceImpl implements SysUserService {
@Autowired
private SysUserMapper sysUserMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 调用dao , 根据用户名查询用户.
SysUser sysUser = sysUserMapper.findUserByUserName(username);
// 返回UserDetails接口的实现类
List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
// 添加角色信息!
grantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_USER"));
// 为User赋予用户名 , 密码. ( 注意密码前不加noop )
User user = new User(username , sysUser.getPassword() , grantedAuthorityList);
return user;
}
}
3.mapper层
<!-- 根据用户名查询账户信息. -->
<select id="findUserByUserName" resultType="SysUser">
select * from sys_user
where username=#{username}
</select>