Spring Security--守护你的功能权限

首先,让我们明确一下什么是Spring Security以及前后端分离路径拦截器。Spring Security是一个基于Spring框架的安全框架,它提供了一系列的安全服务,包括但不限于认证、授权、加密和会话管理等。而前后端分离路径拦截器是指在前后端分离的情况下,根据用户角色和权限对请求的路径进行拦截和过滤。

接下来,我们将详细介绍如何使用Spring Security实现前后端分离路径拦截器。

一、项目搭建

我们首先需要建立一个Spring Boot项目,使用Maven构建,添加Spring Security依赖,以及前后端分离所需要的依赖。具体的pom.xml文件如下所示:


<dependencies>
  	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
  	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>
  	<dependency>
    		<groupId>com.fasterxml.jackson.core</groupId>
    		<artifactId>jackson-databind</artifactId>
	</dependency>
  	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
  	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<scope>runtime</scope>
	</dependency>
</dependencies>

二、权限配置

接下来我们需要配置一些权限,这里我们假设有两种角色,一种是管理员,一种是普通用户,管理员可以查看所有用户的信息,而普通用户只能查看自己的信息。我们可以使用以下代码进行角色控制:

@Override
protected void configure(HttpSecurity http) throws Exception {
    
    
    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER")
        .anyRequest().authenticated()
        .and()
        .httpBasic()
        .and()
        .csrf().disable();
}

这里我们使用了Spring Security提供的HttpSecurity进行路径拦截的配置。我们使用了antMatchers来设置路径匹配规则,对于符合规则的路径,我们可以使用hasRole或者hasAuthority对其进行访问控制。比如,管理员可以访问路径为/admin/**的资源,而普通用户只能访问路径为/user/**的资源。

在这里我们还关闭了CSRF防护。这是一个安全机制,可以防止Cross-site Request Forgery攻击,但是会对前端开发造成一定的困难,这里由于篇幅所限,对于该机制的解释我就不再详细说明了。

三、用户认证和授权

在我们配置好权限后,我们需要对用户进行认证和授权。这里我们使用Spring Security提供的UserDetailsService接口来获取用户的信息,使用PasswordEncoder对用户密码进行加密。在这里,我们使用MySQL作为数据库,并使用 JPA 进行数据持久化管理。我们可以使用以下代码进行用户认证和授权:

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

@Bean
public PasswordEncoder passwordEncoder() {
    
    
    return new BCryptPasswordEncoder();
}

四、前端实现

最后,我们来看一下如何在前端使用这些权限控制。我们可以在前端为不同的路径设置不同的角色,比如以下代码片段:

import request from '@/utils/request'

// 后台获取用户信息接口
function getUserInfo() {
    
    
  return request({
    
    
    url: '/user/info',
    method: 'get',
    params: {
    
     }
  })
}

// 后台获取所有用户信息接口
export function getAllUserInfo() {
    
    
  return request({
    
    
    url: '/admin/userinfo',
    method: 'get'
  })
}

上述代码中,我们使用了axios来发送HTTP请求,并将用户角色信息放到请求头中。在前端路由配置中,我们针对不同的路径,设置了不同的角色,如下所示:

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import About from './views/About.vue'
import UserInfo from './views/UserInfo.vue'
import AllUser from './views/AllUser.vue'

Vue.use(Router)

export const constantRoutes = [
  {
    
    
    path: '/',
    name: 'home',
    component: Home,
    meta: {
    
     role: ['user', 'admin'] } // 普通用户和管理员都可以访问
  },
  {
    
    
    path: '/about',
    name: 'about',
    component: About,
    meta: {
    
     role: ['admin'] }  // 只有管理员可以访问
  },
  {
    
    
    path: '/userinfo',
    name: 'userinfo',
    component: UserInfo,
    meta: {
    
     role: ['user', 'admin'] } // 普通用户和管理员都可以访问
  },
  {
    
    
    path: '/alluser',
    name: 'alluser',
    component: AllUser,
    meta: {
    
     role: ['admin'] }  // 只有管理员可以访问
  }
]

const createRouter = () => new Router({
    
    
  mode: 'history',
  scrollBehavior: () => ({
    
     y: 0 }),
  routes: constantRoutes
})

const router = createRouter()

export function resetRouter() {
    
    
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}


export default router

这里我们使用了meta字段来存储角色信息,比如role: ['user', 'admin']表示只有拥有用户和管理员角色的用户才能访问该路径。在路由发生变化时,我们可以监听beforeEach事件,对路由进行拦截,代码如下所示:

router.beforeEach((to, from, next) => {
    
    
  const role = sessionStorage.getItem("role");
  if (to.meta && to.meta.role) {
    
    
      if (to.meta.role.includes(role)) {
    
    
          return next();
      } else {
    
    
          return next({
    
     name: "home" });
      }
  }
  return next();
})

这里我们使用了sessionStorage来存储当前用户的角色信息,当路由发生变化时,我们从sessionStorage中获取当前用户的角色信息,进而对路径进行拦截,如果当前用户没有访问该路径的权限,则跳转到主页。

总结

通过本篇博客的介绍,我们学习了如何使用Spring Security实现前后端分离路径拦截器。具体而言,我们搭建了一个Spring Boot项目并进行了权限配置,针对不同的角色对路径进行访问控制。此外,我们还介绍了如何在前端进行权限控制,通过axios和router的配合实现对不同路径的访问控制。最终,我们实现了一个较为完整的前后端分离项目。

猜你喜欢

转载自blog.csdn.net/weixin_65950231/article/details/130890835