Bcrypt - 使用Bcrypt加密算法对用户添加的密码进行加密!并在登录的时候继续进行加密对比!

加密效果如下: ( 数据库 )
在这里插入图片描述

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>
发布了107 篇原创文章 · 获赞 173 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42986107/article/details/84867587
今日推荐