springboot整合security和vue的实践

下面我将详细讲解“springboot整合security和vue的实践”的完整攻略。

准备工作

首先我们需要准备好以下工具和软件:

  1. Java JDK 1.8 或以上版本
  2. Maven 3.0 或以上版本
  3. Vue CLI
  4. Node.js

创建Spring Boot项目

  1. 在intelliJ IDEA中创建一个新的Spring Boot项目
  2. 在pom.xml中添加Spring Security和其他必要的依赖项,例如:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 创建一个空的Security配置类(例如:SecurityConfig.java),并配置身份认证和授权
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password("{noop}password")
                .roles("USER");
    }
}

创建RESTful API

在创建RESTful API之前,我们需要在项目中添加Spring MVC依赖项。在pom.xml文件中添加以下依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后,在项目中创建RESTful API和服务接口,并在config类中添加跨域配置,例如:

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                        .allowedOrigins("*")
                        .allowedMethods("*")
                        .allowedHeaders("*")
                        .allowCredentials(true);
            }
        };
    }
}

创建前端应用

  1. 用Vue CLI创建新的Vue项目:
vue create vue-example
  1. 在项目中安装axios和vue-router等所需要的依赖项:
npm install axios vue-router --save
  1. 创建一个路由文件(例如:routes.js)并配置路由:
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Login from '@/components/Login'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/login',
      component: Login
    }
  ]
})
  1. 创建一个组件文件(例如:Login.vue)来处理登录逻辑:
<template>
  <div>
    <h1>Login</h1>
    <form @submit.prevent="login">
      <label>Username:</label>
      <input type="text" v-model="username">
      <label>Password:</label>
      <input type="password" v-model="password">
      <button type="submit">Login</button>
    </form>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'Login',
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    login () {
      axios.post('/api/login', {
        username: this.username,
        password: this.password
      })
      .then(response => {
        console.log(response.data)
        this.$router.push('/')
      })
      .catch(error => {
        console.log(error)
      })
    }
  }
}
</script>

整合前后端项目

  1. 在Spring Boot项目中,添加一个登录处理器和一个登录验证过滤器:
public class CustomLoginFilter extends UsernamePasswordAuthenticationFilter {

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        if (request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) {
            try {
                Map<String, String> loginData = new ObjectMapper().readValue(request.getInputStream(), Map.class);
                String username = loginData.get("username");
                String password = loginData.get("password");

                UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password, new ArrayList<>());

                return this.getAuthenticationManager().authenticate(token);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        } else {
            return super.attemptAuthentication(request, response);
        }
    }
}
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        if ("user".equals(username) && "password".equals(password)) {
            return new UsernamePasswordAuthenticationToken(username, password, new ArrayList<>());
        } else {
            throw new BadCredentialsException("Authentication failed.");
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}
  1. 在Security配置类中,配置登录过滤器和验证提供者:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .addFilterAt(new CustomLoginFilter("/api/login", authenticationManager()), UsernamePasswordAuthenticationFilter.class)
                .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(new CustomAuthenticationProvider());
    }
}
  1. 在前端项目中,调用后端登录API进行长轮询登录。
export default {
  name: 'Login',
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    login () {
      axios.post('/api/login', {
        username: this.username,
        password: this.password
      })
      .then(response => {
        console.log(response.data)
        // 登录成功后将Token存储在LocalStorage中,并跳转到主页面
        localStorage.setItem(ACCESS_TOKEN, response.data.token)
        this.$router.push('/')
      })
      .catch(error => {
        console.log(error)
      })
    }
  }
}

以上就是整个“Spring Boot整合Security和Vue的实践”的完整攻略,其中包含了创建Spring Boot和Vue项目,创建RESTful API和服务接口,以及整合前后端项目的完整步骤和示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合security和vue的实践 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • jsp中存取session值简单介绍

    下面我将详细讲解“JSP中存取session值简单介绍”的完整攻略。 什么是Session Session是指服务端保存用户信息的一种机制,它可以用来保存用户登录信息、用户偏好设置、购物车、验证码等应用场景。 在JSP中,通过内置的session对象来存储用户信息,这个对象可以在同一浏览器窗口内的多个请求间共享,在用户关闭浏览器窗口时就会失效。 Sessio…

    Java 2023年6月15日
    00
  • springboot返回值转成JSONString的处理方式

    下面是 “springboot返回值转成JSONString的处理方式” 的完整攻略。 什么是返回值转成JSONString的处理方式 当我们在使用springboot开发web应用时,我们需要将后端代码返回的对象转换成前端可识别的JSON格式。这时我们就需要采用某种处理方式。 如何将返回值转换成JSONString 方法一:使用Jackson Jackso…

    Java 2023年5月26日
    00
  • jdk8的datetime时间函数使用示例

    下面我来详细讲解一下“jdk8的datetime时间函数使用示例”的完整攻略。 JDK8的DateTime时间函数使用示例 1. DateTime创建对象 在JDK8之前,Java的日期和时间的API非常难用和陈旧,但在JDK8中,Java提供了一个全新的日期和时间API(java.time),它提供了一种更简单、更易于使用和更安全的方式来处理日期和时间。 …

    Java 2023年5月20日
    00
  • 使用Spring Data Jpa查询全部并排序

    对于这个问题,我可以给出一份详细的攻略,包括如何使用Spring Data JPA进行查询和如何进行排序。以下是具体的步骤: 1. 添加依赖 首先,我们需要在项目中添加Spring Data JPA的依赖。 <dependencies> <!– Spring Data JPA –> <dependency> <g…

    Java 2023年5月20日
    00
  • java 浅析代码块的由来及用法

    Java 浅析代码块的由来及用法 背景介绍 在Java中,代码块是一段静态或动态语句代码,在执行时会形成一个作用域。根据代码块的位置和声明方式,可以分为实例初始化块、静态初始化块和局部代码块。 实例初始化块 实例初始化块是被定义在类内部,但没有被声明为静态的代码块,可以在创建对象时被调用,用于对对象进行初始化操作。 public class Person {…

    Java 2023年5月30日
    00
  • struts2框架入门

    当你想开发一个Java Web应用程序时,一些的Java Web框架可以大大简化开发过程。其中,Struts2框架是一个非常流行的Java Web框架,这里为你提供Struts2框架入门的完整攻略。 Struts2框架入门 1. Struts2框架概述 Struts 2是一个Web框架,是基于MVC(模型视图控制器)设计模式的开源框架。它是Struts 1.…

    Java 2023年5月20日
    00
  • Java基础之Object类详解

    Java基础之Object类详解 Java中的Object类是所有Java类的祖先类,每个类都继承了Object类的一些方法。在本文中,我们将深入学习Object类,包括其方法以及如何正确重写Object类中的方法。 Object类中的方法 Object类提供了许多有用的方法,如下所示: equals方法 equals方法用于比较两个对象是否相等,默认情况下…

    Java 2023年5月26日
    00
  • java当中的定时器的4种使用方式

    首先我们来介绍一下Java中的定时器。在Java中,我们通常使用定时器来执行定时任务,例如在定时轮询某个任务、定时刷新界面等等。Java中的定时器主要有以下4种使用方式: 1. Timer Timer是Java中内置的定时器,可以用于执行定时任务。通过Timer对象,我们可以设置需要定时执行的任务并设定执行时间,例如在5秒后执行任务、每隔10秒执行一次任务等…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部