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

下面我将给你详细讲解实现“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.js中$watch的oldvalue与newValue

    深入理解vue.js中$watch的oldValue与newValue 在Vue.js中,$watch是一个非常核心的API,经常用来监听数据的变化。$watch的主要用法如下: watch: { ‘data.field'(newVal, oldVal) { // 当 data.field 发生变化时触发该回调函数,newVal 表示变化后的值,oldVal…

    Vue 2023年5月28日
    00
  • Vue.js 中的 $watch使用方法

    Vue.js是一款流行的前端框架,提供了丰富的数据绑定和更新机制。其中,$watch是Vue.js提供的一个非常有用的功能,它可以用来监听对象的变化并进行响应,可以应用于各种场景。下面就详细介绍一下Vue.js中的$watch使用方法。 Vue.js中的$watch使用方法 基础语法 在Vue.js中,我们可以使用vm.$watch来创建$watch实例,并…

    Vue 2023年5月29日
    00
  • 使用vue-router在Vue页面之间传递数据的方法

    下面为你详细讲解使用vue-router在Vue页面之间传递数据的方法: 1. 使用props传递数据 我们可以通过在组件之间传递props来实现数据的传递,由于vue-router本质上是一个路由组件,因此我们可以使用props在路由之间传递数据。 1.1 在路由中定义props 我们可以通过在路由中定义props来让vue-router接收传递过来的数据…

    Vue 2023年5月27日
    00
  • vue.js中导出Excel表格的案例分析

    下面我将为您详细讲解“vue.js中导出Excel表格的案例分析”的完整攻略。 一、前置知识 要实现vue.js中导出Excel表格的功能,需要先掌握以下技能: HTML基础:了解HTML表格、表单等基本结构和属性,会使用<table>、<tr>、<td>等标签; Vue.js基础:了解Vue.js的指令和组件,特别是v-…

    Vue 2023年5月27日
    00
  • JS实现将对象转化为数组的方法分析

    JS实现将对象转化为数组的方法分析 在JS中,有时候我们需要将对象转化为数组,以方便对其进行处理。下面介绍三种实现方法: Object.keys()、Object.values()和Object.entries()。 Object.keys() Object.keys(obj)可以将对象中的键(key)提取出来,返回一个由键组成的数组。该方法的语法如下: O…

    Vue 2023年5月28日
    00
  • vue关于下载文件常用的几种方式

    Vue 作为一种流行的前端框架,提供了几种下载文件的方式。本篇文章将介绍 Vue 常用的几种前端下载文件的技巧。 1. 通过a标签下载文件 a 标签是 HTML 中常用的下载文件的方式之一。Vue 在处理下载文件时,可以通过创建一个 a 标签,设置其 href 属性和 download 属性来实现文件下载。 <template> <div&…

    Vue 2023年5月28日
    00
  • Vue 组件渲染详情

    Vue 组件渲染详情是指在 Vue 应用中,如何使用组件进行渲染及其相关的细节。下面将从 Vue 组件的定义、组件间通信、组件生命周期、组件的复用以及常见问题五个方面,来详细讲解 Vue 组件渲染的攻略。 Vue 组件的定义 Vue 组件分为两种:全局组件和局部组件,其定义方式分别如下: 全局组件 全局组件可以在任何 Vue 实例的模板中使用,定义方式如下:…

    Vue 2023年5月28日
    00
  • 在 Vue.js中优雅地使用全局事件的方法

    在 Vue.js 中,全局事件可以在不同组件之间传递信息。但是如果使用不合适,会导致代码变得混乱和难以维护。下面让我们看一下如何优雅地使用 Vue.js 中的全局事件。 什么是全局事件 在 Vue.js 中,我们可以使用自定义事件系统来在不同组件之间传递信息。在根组件中使用 $emit 方法触发自定义事件,在其他组件中使用 $on 监听自定义事件。 全局事件…

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