前后端分离 Vue+springBoot+springSecurity获取不到登录用户名和密码的问题


前言

最近手上有个项目,采用前后端分离的模式开发,前端使用vue 后端采用springBoot+springSecurity。最近开发就遇到个十分简单,但是由困了我两天的问题。我本着不掉光头发誓不罢休的原则,开始了苦逼的找bug日常。


一、问题描述

springSecurity自定义的登录框,获取不到用户名和密码。
实际开发中我们不太可能使用springSecurity自带的登录界面,所以我们一般会使用自定义的登录界面。为了展示效果,我简单的写了一个极其丑陋的登录界面,如下

<template>
  <div id="app" style="align-content: center">
    <span><h1>登录</h1></span>
    <el-form :label-position="labelPosition" label-width="80px" :model="formLabelAlign">
      <el-form-item label="用户名">
        <el-input v-model="formLabelAlign.username" style="width:300px"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="formLabelAlign.password"  style="width:300px"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">登录</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

还有个点击事件—点击登录发起的请求

 onSubmit() {
      this.$axios.post("http://localhost:8082/login", this.formLabelAlign,{
        headers:{
          'Content-Type':'application/x-www-form-urlencoded'
        }
      }).then(res => {
        console.log(res);
      })

在webSecurityConfig中配置拦截规则

protected void configure(HttpSecurity http) throws Exception {
       http.cors().and()
               .authorizeRequests()
               .antMatchers("/login").permitAll()
               .antMatchers("/**").hasRole("nomal")
               .and().formLogin().loginProcessingUrl("/login").permitAll()
               .successHandler(new AuthenticationSuccessHandlerImpl())
               .failureHandler(new AuthenticationFailureHandlerImpl())
               .and().logout().logoutUrl("/logout").permitAll()
               .logoutSuccessHandler(new LogoutSuccessHandlerImpl())
               .and().csrf().disable().exceptionHandling();
    }

进过一番的配置,之后开心地去测试。每次都登录失败。
为了测试,我在自定义的provider中加入了打印登录的信息。

package com.yzm.spring_secrurity;

import com.yzm.spring_secrurity.pojo.UserInfo;
import com.yzm.spring_secrurity.service.MyUserDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;

import java.util.Collection;

@Component
public class MyAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private MyUserDetailService myUserDetailService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String name = authentication.getName();
        String password = (String) authentication.getCredentials();
        System.out.println("name is  "+name);
        System.out.println("password is  "+password);
        UserInfo userInfo = (UserInfo) myUserDetailService.loadUserByUsername(name);
        if (userInfo == null){
            throw new BadCredentialsException("用户名不存在");
        }
        if (!userInfo.getPassword().equals(password)){
            throw new BadCredentialsException("密码错误");
        }
        Collection<? extends GrantedAuthority> authorities = userInfo.getAuthorities();

        return new UsernamePasswordAuthenticationToken(userInfo,password,authorities);
    }

    @Override
    public boolean supports(Class<?> aClass) {
        return true;
    }
}

输入用户名和密码后,后台打印结果
运行结果

二、查找原因

我知道,登录验证的是由 UsernamePasswordAuthenticationFilter处理的
在这里插入图片描述
在这个过滤器中我们可以看到参数名如果自己没有配置就必须是(username,password),登录必须是post请求,并且请求路径一定是login(当然可以修改)。我们还看到了获取用户名和密码的方法obtainUsername、obtainPassword,点进去看了一,我彻底懵了(醒悟了)。
在这里插入图片描述
这居然是我学javaWeb用的最多的方法request.getParameter(),post怎么获取不到呢???,查了无数的资料,他们说contentType的原因。但是可以看到,我修改了的,不起效(这我不知道原因),后来有人说用qs可以,将参数以&连接到网址后面。这样就可以获取到。

三、解决

安装qs

npm install qs

在main.js中添加

import qs from 'qs'
Vue.prototype.$qs=qs

最后修改请求

onSubmit() {
      this.$axios.post("http://localhost:8082/login", this.$qs.stringify(this.formLabelAlign),{
        headers:{
          'Content-Type':'application/x-www-form-urlencoded'
        }
      }).then(res => {
        console.log(res);
      })
    }

在此点击登录,就可看到后台获取到了用户名和密码
运行结果


总结

使用request.getParameter获取参数值,这样方式在get请求中屡试不爽,而且非常好用,因为get的参数就是url后面,可以和方便的取到,但是post请求里面的参数是不一样的,要么使用qs进行转换,要么就自己封装下。最后还是说一句,读源码实在是太重要了,如果没看到源码,这个问题不知道要困我多久。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: vue springboot前后端分离开发实战pdf是一本介绍如何使用VueSpring Boot进行前后端分离开发的实战指南。本书详细讲解了如何使用Vue框架搭建前端应用,以及如何利用Spring Boot框架构建后端应用,旨在帮助读者掌握前后端分离开发的技术和方法。 在这本书中,作者首先介绍了前后端分离开发的概念和背景,解释了为什么前后端分离可以带来更好的开发体验和效率。接着,作者详细介绍了Vue框架的基本概念和使用方法,包括组件化开发、路由管理、状态管理等方面的内容。读者可以通过跟随书中的示例代码,逐步学习并实践Vue框架的应用。 在后半部分,作者重点介绍了Spring Boot框架的使用。读者将学习如何使用Spring Boot快速搭建后端应用,并了解如何通过RESTful API与前端应用进行数据交互。此外,作者还介绍了Spring SecuritySpring Data JPA等常用的配套技术,帮助读者构建安全可靠的后端应用。 本书不仅提供了理论知识,还提供了大量的实战案例和实例代码。读者可以跟随书中的示例项目逐步实践,从而更好地掌握VueSpring Boot的开发技巧。此外,本书还涉及了一些项目管理和部署的内容,帮助读者了解如何将前后端分离的应用部署到生产环境中。 总而言之,vue springboot前后端分离开发实战pdf是一本适合想要学习并实践前后端分离开发的开发人员的实用指南,通过学习本书,读者将获得丰富的知识和经验,能够独立设计和开发前后端分离的应用程序。 ### 回答2: 《Vue SpringBoot前后端分离开发实战PDF》这本书是一本关于前后端分离开发实践的指南。它结合了VueSpringBoot两个流行的开发框架,帮助开发者更好地理解和应用这两个技术。 在书中,作者首先介绍了前后端分离的概念和优势。前后端分离开发可以提高开发效率和协作性,同时也能提供更好的性能和扩展性。然后,作者详细介绍了Vue框架的基本知识和使用方法,包括Vue的搭建、组件的创建和组织等。读者可以通过实际的案例来学习和练习。 接着,作者转向SpringBoot框架的介绍和使用。SpringBoot是一个轻量级的Java开发框架,可以快速构建和部署应用程序。作者讲解了如何使用SpringBoot创建RESTful API,以及如何与Vue前端进行交互。 在书的后半部分,作者提供了一些实战案例和示例代码。这些案例涵盖了常见的前后端分离开发场景,如用户管理、权限控制、数据交互等。通过这些案例,读者可以了解到如何将VueSpringBoot无缝地结合起来,构建强大的应用程序。 总的来说,《Vue SpringBoot前后端分离开发实战PDF》是一本非常实用的书籍。它不仅系统地介绍了VueSpringBoot的基础知识和使用方法,还提供了丰富的实战经验和案例。对于想要掌握前后端分离开发技术的开发者来说,这本书是一个很好的学习资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值