基于SpringBoot的online_music_player_加密登入(登入注册模块_5)

751 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情 

加密登入实现

因为我们matches通过前端传输过来的密码对比数据库中密码即可判断密码是否正确! 我们知道每次encode后的密码都不一样,所以我们不能通过查询数据库中username+password验证! 我们先通过username查询到数据库中的密码,然后通过mathes匹配判断是否登入成功!

  • UserMapper添加查询用户方法!

image-20220727121658099

//加密后的登入方法!
public ResponseBodyMessage<User> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request){
        User user = userMapper.selectUserByUserName(username);
        //返回响应
        if(user!=null){//查询到username用户!
            BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
            //匹配验证密码是否正确!
            boolean flg = bCryptPasswordEncoder.matches(password,user.getPassword());
            if(flg){//登入成功!
                request.getSession().setAttribute(Contant.USERINFO_SESSION_KEY,user);
                return new  ResponseBodyMessage<User> (0,"登入成功",user);
            }else{//密码错误!
                return new  ResponseBodyMessage<User> (0,"用户名或密码错误",user);
            }
​
        }else{//用户不存在!
          return new  ResponseBodyMessage<User> (-1,"用户名或密码错误",user);
        }
    }
​

pastman验证代码:

image-20220727122016630

这里我们发现失败了,因为我们引入BCrypet加密依赖时,导入的security框架,我们只是用了其下的一个类用于加密,并没有用到该框架的功能!而导入security框架后,该项目中的接口都需要身份验证和授权!所以这个我们就登入失败了!

我们在启动类上加上一行注解即可解决该问题!

image-20220727122834874

@SpringBootApplication(exclude =
        {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})

image-20220727122756040

创建config类,添加AppConfig类

刚刚BCrypetPasswordEncoder对象创建使用方式并不符合SpringIoC思想,所以我们通过Bean注解先将该对象注册到Spring中,然后通过Spring获取对象!

@Configuration
public class AppConfig {
    //将BCrypetPasswordEncoder对象交给spring管理!
    @Bean
    public BCryptPasswordEncoder getBCryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

image-20220727123829855

这样我们的登入功能就完善好了!

实现注册功能

约定注册请求和响应

请求:
{
    post
    url:user/register
    data:{username,password}
}
响应:
{
    status:"状态码"
    message:"响应信息"
    data:{username,password}
}

UserMapper类中添加一个注册接口!

//注册功能!
    int register(String username,String password);

Mapper.xml下实现该接口

<!-- 注册添加用户-->
    <insert id="register">
        insert into user (username,password) values(#{username},#{password});
    </insert>

Controller的User类下实现注册功能

  //注册功能
    @RequestMapping("/register")
    public ResponseBodyMessage<User>register(@RequestParam String username,@RequestParam String password,HttpServletRequest request){
        //1.首先查询该用户是否存在!
        User user = userMapper.selectUserByUserName(username);
        if(user!=null){//查询到该用户,说明用户存在!
            return new ResponseBodyMessage<User>(-1,"该用户已注册,请修改用户名重新注册",null);
        }
        //2.用户不存在,就注册该用户!
        //对密码进行加密后保存在数据库中!
        password = appConfig.getBCryptPasswordEncoder().encode(password);
        //将用户注册到数据库中!
        userMapper.register(username,password);
        //将注册好的用户信息放回给客户端!
        user = userMapper.selectUserByUserName(username);
        request.getSession().setAttribute(Contant.USERINFO_SESSION_KEY,user);
        return new ResponseBodyMessage<User>(0,"注册成功!",user);
    }

postman验证

  • 用户存在

image-20220727132235399

image-20220727131627680

  • 用户不存在注册成功!

    image-20220727133836156

    image-20220727133851917

    通过注册的用户验证一下登入功能

    image-20220727133954061