SpringBoot和Vue.js实现的前后端分离的用户权限管理系统

yizhihongxing

下面我将给你详细讲解实现“SpringBoot和Vue.js实现的前后端分离的用户权限管理系统”的完整攻略。

概述

要实现前后端分离的用户权限管理系统,首先需要涉及到的技术栈包括SpringBoot、Vue.js、Spring Security、JWT(token)等,其中Spring Security是前后端分离中实现鉴权的关键技术,JWT是用来生成权限认证的Token,Vue.js是负责前端显示的框架。

具体实现

下面是我认为实现前后端分离的用户权限管理系统的步骤:

  1. 搭建后台服务

在后台服务中,我们需要引入Spring Security和JWT相关的包(如spring-boot-starter-security、jjwt等),同时,我们也需要定义好用户、角色和权限等实体,并利用JPA实现对应的数据访问层接口。例如:

@Entity
@Table(name = "sys_role")
public class SysRole {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private String desc;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "sys_role_permission", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "permission_id"))
    private List<SysPermission> permissions;

    //省略其他字段

    //省略getter和setter

}
  1. 实现鉴权功能

利用Spring Security实现鉴权功能,需要实现WebSecurityConfigurerAdapter抽象类。将其加入到SpringBoot的配置文件中,实现如下:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Autowired
    private CustomPasswordEncoder passwordEncoder;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/hello").permitAll()
                .anyRequest().authenticated()
                .and().addFilter(new JWTAuthenticationFilter(authenticationManager()))
                .addFilter(new JWTAuthorizationFilter(authenticationManager()))
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().csrf().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/js/**", "/css/**", "/images/**");
    }

}

其中,CustomUserDetailsService是我们自定义的获取用户数据的服务,CustomPasswordEncoder是我们自定义实现的PasswordEncoder。此外,还要自定义JWTAuthenticationFilter和JWTAuthorizationFilter,用于进行Jwt鉴权。具体代码实现可以参考Github上spring-security-jwt源码。

  1. 实现前端页面

利用Vue.js框架实现我们的前端页面,代码结构如下:

// 登录页面
<template>
  <div>
    <el-input placeholder="请输入用户名" v-model.trim="loginForm.username" />
    <el-input placeholder="请输入密码" v-model.trim="loginForm.password" />
    <el-button @click="login">登录</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      loginForm: {
        username: "",
        password: ""
      }
    };
  },
  methods: {
    login() {
      // 向后端发起登录请求
      this.$http.post("/login", this.loginForm).then(response => {
        if (response.data.code === 0) {
          // 登录成功
          localStorage.setItem(
            "Authorization",
            "Bearer " + response.data.data.token
          );
          this.$router.push("/home");
        } else {
          // 登录失败
        }
      });
    }
  }
};
</script>

// home页面
<template>
  <div>
    <h1>这是home页面</h1>
    <el-button @click="logout">退出登录</el-button>
    <el-button v-if="authList.indexOf('user:update') > -1">修改账号信息</el-button>
    <el-button v-if="authList.indexOf('user:delete') > -1">删除账号</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      authList: []
    };
  },
  mounted() {
    // 获取当前用户的权限列表
    this.$http.get("/user/auth").then(response => {
      if (response.data.code === 0) {
        this.authList = response.data.data;
      }
    });
  },
  methods: {
    logout() {
      // 退出登录
      localStorage.removeItem("Authorization");
      this.$router.push("/");
    }
  }
};
</script>

其中,登录页面和home页面分别展示了如何向后端发送请求和如何获取当前用户的权限列表。

  1. 实现前后端交互

前端Vue.js框架和后台SpringBoot框架之间的交互,可以通过RESTful接口进行通信。例如:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/auth")
    public Result<List<String>> getCurrentUserAuth() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        List<String> authList = new ArrayList<>();
        for (GrantedAuthority authority : authentication.getAuthorities()) {
            authList.add(authority.getAuthority());
        }
        return Result.success(authList);
    }

}

以上示例代码展示了UserController的实现,其中定义了一个获取当前用户权限列表的接口。在前端Vue.js中,可以通过发送GET请求获得该接口返回的数据,并用于页面渲染。

示例说明:

为了展示如何利用JWT实现权限认证,接下来将对JWT的使用进行进一步说明。

Token的生成流程如下:

  1. 用户输入用户名、密码,然后向后端发送post请求。
  2. 后端服务验证用户名、密码,并生成Token,Token中需要包含用户证书和有效期等信息。
  3. 后端服务输出Token到前端。
  4. 前端保存Token。
  5. 每次请求,前端在请求头中带上Token。
  6. 后端验证请求头中的Token信息,并判断Token是否有效。

在JWT的实现中,核心代码如下:

String token = Jwts.builder()
            .setSubject(username)
            .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
            .signWith(SignatureAlgorithm.HS512, SECRET.getBytes())
            .compact();

其中,username是用户的用户名,EXPIRATION_TIME是token的有效时间,SECRET是加密的密钥。每次前端向后端发送请求时,会在请求头中加入Authorization信息,例如:

Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTYyMDU2NjgwMH0.2ht-HkQPt2c4QrN4E2HxFae0hZzeKOcOY9RtcVJ2wq2JDJcIRr9l7D7D9Rd7T6lant3IdJrUV6a0H5ED7Kj-g

以上就是实现“SpringBoot和Vue.js实现的前后端分离的用户权限管理系统”的完整攻略,其中包含了后台服务的搭建、鉴权的实现、前端页面的实现和前后端交互的实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot和Vue.js实现的前后端分离的用户权限管理系统 - Python技术站

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

相关文章

  • vue中怎么区分不同的环境

    为了区分不同环境,我们通常需要在vue项目中设置一些不同的配置项。下面是一些常用的方式和示例: 方式一:通过环境变量进行区分 我们可以通过node.js中的process.env对象获取当前运行环境的环境变量,从而判断当前是在哪个环境下。 在vue项目中,我们可以通过设置webpack的DefinePlugin插件来创建一个全局变量process.env,从…

    Vue 2023年5月28日
    00
  • vue cli3 项目中如何使用axios发送post请求

    以下是使用 Axios 在 Vue CLI3 项目中发送 POST 请求的攻略步骤。 步骤一:安装 Axios 使用命令行工具进入 Vue CLI3 项目的根目录,然后运行以下命令,安装 Axios: npm install axios –save 步骤二:在 Vue 项目中使用 Axios 在 Vue 项目需要发送 POST 请求的组件中,引入 Axio…

    Vue 2023年5月28日
    00
  • 自定义vue组件发布到npm的方法

    首先,创建一个Vue组件库需要进行如下几个步骤: 步骤一:创建Vue组件项目 使用Vue CLI创建一个新的Vue项目: # 全局安装 Vue CLI npm install -g @vue/cli # 创建一个Vue项目 vue create my-vue-components 之后按照提示选择预设项目配置即可。 步骤二:编写Vue组件 在src/comp…

    Vue 2023年5月28日
    00
  • vue-cli+webpack记事本项目创建

    下面是“vue-cli+webpack记事本项目创建”的完整攻略: 一、前置条件 在开始构建项目之前,请确保已经安装以下软件: Node.js: 版本>=8,用于运行vue-cli。 npm: Node.js自带的包管理工具。 二、创建vue-cli项目 打开命令行工具,输入以下命令安装vue-cli: npm install -g vue-cli 使…

    Vue 2023年5月29日
    00
  • vue加载天气组件使用方法详解

    Vue 加载天气组件使用方法详解 介绍 天气组件是一种在 Vue 应用程序中使用的开源组件,可以方便地向 Vue 应用中添加天气信息,并且使用简单。本文将介绍如何在 Vue 应用程序中使用天气组件。 安装 安装天气组件,可以通过 npm 包管理器来进行安装,命令如下: npm install vue-weather-widget –save 使用 在 Vu…

    Vue 2023年5月29日
    00
  • Vue3 – setup script的使用体验分享

    下面我将为你详细讲解“Vue3 – setup script的使用体验分享”的完整攻略。 1. 什么是Vue3 setup script? Vue3的setup script即组件选项中新增的setup函数。这个函数会在组件被创建之前执行,并且返回值将会被传递给模板和其他组件选项中的方法。 setup函数可以方便的访问组件实例,并且可以使用非响应式的引用,避…

    Vue 2023年5月28日
    00
  • VUE 自定义组件模板的方法详解

    下面详细讲解一下“VUE 自定义组件模板的方法详解”的完整攻略。 一、前置知识 在学习自定义组件模板之前,需要了解以下基本的 Vue 相关概念: Vue 实例 组件 响应式系统 Vue 单文件组件 如果您对以上内容不熟悉,建议先去学习一下。 二、自定义组件 Vue 自定义组件是 Vue.js 提供的一个非常强大的功能。可以利用自定义组件实现代码复用,提高开发…

    Vue 2023年5月27日
    00
  • Vue组件生命周期运行原理解析

    Vue组件生命周期运行原理解析攻略 Vue.js是一款流行的JavaScript框架。组件是Vue.js的核心概念之一。Vue组件有自己的生命周期,Vue.js框架提供了一些回调函数接口,当组件的生命周期发生变化时,这些回调函数接口将会自动被触发。本篇攻略将详细介绍Vue组件生命周期的运行原理。 Vue组件生命周期介绍 Vue组件生命周期分为8个阶段: be…

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