Sping Security前后端分离两种实战方案

yizhihongxing

下面我将详细讲解“Spring Security前后端分离两种实战方案”的完整攻略。

简介

Spring Security 是一款开源的认证和授权框架,可以实现对系统的安全性保护。在前后端分离的架构中,Spring Security 的实现需要特别注意。本文将从两个方面介绍 Spring Security 的前后端分离实现方案。

方案一:基于 Token 的验证方式

Token 验证方式就是先发送登录请求,登录成功后服务器返回 Token,然后客户端将 Token 保存在本地,在后续的请求中添加 Token,并在服务器端进行验证。这种方式比较常见,也是应用比较广泛的一种方式。

实现步骤如下:

  1. 前端登录时向后端发送登录请求(接口可以自己定义),后台验证通过后生成 Token 并返回给前端。
    示例代码如下:
    @PostMapping("/login")
    public ResponseEntity login(@RequestBody User user) {
    try {
    authenticationManager.authenticate(
    new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword())
    );
    } catch (Exception e) {
    throw new RuntimeException("用户名或密码错误");
    }
    String token = jwtTokenUtil.generateToken(user.getUsername());
    return ResponseEntity.ok().header("Authorization", token).build();
    }

    上述代码中,我们从请求参数中拿到用户名和密码,然后调用 authenticationManager.authenticate 进行验证,验证通过后,调用 jwtTokenUtil.generateToken 生成 Token 并通过 header 返回给前端。

  2. 前端将 Token 存储在本地,随后每次请求都在 header 中带上 Token。
    示例代码如下:
    axios.interceptors.request.use(config => {
    const token = window.localStorage.getItem('token')
    if (token) {
    config.headers.Authorization = token
    }
    return config
    }, err => Promise.reject(err))

    上述代码中,我们使用 axios 发送请求,拦截器会在请求前加入 token。

  3. 后台需要对每个请求进行 Token 验证,验证通过后才能正常访问。
    示例代码如下:
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
    String header = request.getHeader(headerName);
    if (header == null || !header.startsWith(tokenHead)) {
    return;
    }
    String authToken = header.substring(tokenHead.length());
    String username = jwtTokenUtil.getUsernameFromToken(authToken);
    if (username == null) {
    return;
    }
    UserDetails userDetails = userDetailsService.loadUserByUsername(username);
    if (jwtTokenUtil.validateToken(authToken, userDetails)) {
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
    authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
    SecurityContextHolder.getContext().setAuthentication(authentication);
    }
    chain.doFilter(request, response);
    }

    上述代码中,我们从 header 中获取 token,然后解析出 username。接着,我们通过 username 获取 user 对象,并使用 jwtTokenUtil 验证 Token 是否有效,如果有效则将 user 放入 SecurityContextHolder 中进行验证。通过以上步骤,我们就完成了 Token 验证方式的实现。

方案二:基于 OAuth2 的验证方式

OAuth2 是一款流行的授权框架,可以实现对应用程序及其资源的安全保护。

实现步骤如下:

  1. 在认证服务器上配置 OAuth2 客户端信息,包括客户端 ID、客户端密码、授权方式等。
    在 Spring Security 中,我们可以使用 @EnableAuthorizationServer@EnableResourceServer 注解来激活 OAuth2 的认证服务和资源服务。

示例代码如下:
```
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
// ...
}

@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
// ...
}
```

  1. 前端向认证服务器请求授权,如果授权通过则返回 access_token。
    示例代码如下:
    axios.post('/oauth/token', null, {
    params: {
    grant_type: 'password',
    client_id: 'app',
    client_secret: 'app_secret',
    username: 'user',
    password: 'user_password'
    }
    }).then(response => {
    const { access_token } = response.data
    const token_type = response.data.token_type
    const Authorization = `${token_type} ${access_token}`
    window.localStorage.setItem('access_token', Authorization)
    axios.defaults.headers.common.Authorization = Authorization
    }).catch(error => {
    console.log(error)
    })

    上述代码中,我们使用 axios 发送请求,包含了必要的参数(client_id、client_secret、username、password)进行认证,如果认证通过则返回 access_token。

  2. 前端请求后端 API 时,在 header 中携带 access_token。
    示例代码如下:
    axios.get('/api/user', {
    headers: {
    Authorization: `Bearer ${token}`
    }
    })

    上述代码中,我们在 header 中带入 access_token,让后端接口能够验证用户是否有权限访问该接口。

  3. 后端需要对每个请求进行 access_token 验证,验证通过后才能正常访问。
    示例代码如下:
    ```
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
    resources.tokenStore(tokenStore).resourceId("api")
    }

@Override
public void configure(HttpSecurity http) {
http.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.csrf().disable()
.headers().frameOptions().disable()
}
``
上述代码中,我们通过
tokenStore配置 token 的存储方式,resourceId指定应用的资源 ID。使用http.authorizeRequests()表示对请求进行验证,antMatchers()指定需要验证的 URL,.authenticated()` 表示需要验证通过才能访问这个 URL。并且禁用了 CSRF 防护和 X-Frame-Options 防护。

至此,我们就完成了基于 OAuth2 的验证方式的实现。

结论

本文通过两个不同方式(Token 和 OAuth2)介绍了 Spring Security 前后端分离的实现方案,每个方案都基于不同的验证协议。当然,每个项目都有自己特定的需求,选择不同的实现方案是有必要的。但是无论你使用哪种方案,都必须对实现方式和安全策略进行仔细评估。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Sping Security前后端分离两种实战方案 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 简单了解JavaBean作用及常用操作

    简单了解JavaBean作用及常用操作 JavaBean是一种Java语言写成的可重用组件。它是指符合特定规范的Java类,具有无参构造函数,可以通过工具或代码进行设置和访问属性。 JavaBean的作用 JavaBean的作用是将数据和操作数据的方法封装在一起,形成一个可复用的组件,方便在不同的系统中使用。同时,JavaBean的属性可以使用JavaBea…

    Java 2023年6月15日
    00
  • 详解Java中Method的Invoke方法

    详解Java中Method的Invoke方法 在Java中,我们可以对方法进行反射获取并执行。Method类的invoke方法可以用来执行通过反射获取到的方法。 Method类的基本概念 Method类是Java的反射机制中的一个类,它用于描述类的方法信息,例如方法名、参数类型、返回值类型等,同时也包含了方法的访问控制信息。 我们可以通过Class类中的 g…

    Java 2023年5月26日
    00
  • mybatis-plus批处理IService的实现示例

    首先,要了解mybatis-plus的批处理IService的实现,需要了解以下几个关键点: IService是mybatis-plus提供的对Mapper的封装,简化了常见的增删改查操作; IService提供了一些批量操作的接口,如saveBatch、updateBatchById等; 在使用批处理接口时,需要设置全局配置项mybatis-plus.gl…

    Java 2023年5月20日
    00
  • SpringBoot实战教程之新手入门篇

    SpringBoot实战教程之新手入门篇攻略 SpringBoot是一种快速开发、简化配置的Java框架。它集成了常用的开发工具,如SpringMVC、Hibernate、MyBatis等,能够帮助开发人员快速搭建Java Web项目。本篇攻略将介绍学习SpringBoot的入门教程。 1. 安装Java和IDE 在开始学习SpringBoot之前,需要先安…

    Java 2023年5月15日
    00
  • 关于JAVA 数组的使用介绍

    关于Java数组的使用介绍 Java中的数组是一种非常常见的数据结构,可以容纳同一种数据类型(可以是基本类型或对象类型)的固定数量的元素。本文将介绍Java数组的基本用法,包括声明、初始化、访问以及一些常见的操作和示例。 数组的声明和初始化 Java声明一个数组需要指定数组名称、数组元素的类型和数组的大小,数组元素的类型可以是Java中的任意数据类型(例如,…

    Java 2023年5月26日
    00
  • Java深入浅出数组的定义与使用上篇

    我来为你讲解一下“Java深入浅出数组的定义与使用上篇”的完整攻略。 标题 标题应该使用Markdown语法中的“#”,一级标题用“#”表示,二级标题用“##”表示,以此类推。这篇攻略的一级标题可以命名为“Java深入浅出数组的定义与使用上篇”。 正文 在开始正文之前,需要简单介绍一下本文主要讲解的内容。本篇攻略主要分为三个部分,分别是数组的定义、数组的初始…

    Java 2023年5月26日
    00
  • Springboot启动扩展点超详细教程小结

    Spring Boot启动扩展点是Spring Boot提供的一种机制,可以在Spring Boot启动过程中执行自定义的逻辑。以下是一个完整的Spring Boot启动扩展点攻略,包括如何创建和使用Spring Boot启动扩展点。 创建Spring Boot启动扩展点 我们可以通过实现org.springframework.boot.SpringAppl…

    Java 2023年5月14日
    00
  • Java布局管理器使用方法

    下面是“Java布局管理器使用方法”的完整攻略,包括两条示例说明。 什么是布局管理器 在Java图形用户界面(GUI)开发中,布局管理器是用于自动排列和调整GUI组件位置的工具。如果你不使用布局管理器,在不同的屏幕上可能会出现组件重叠的情况,布局管理器可以很好地解决这个问题。 Java提供了几种不同的布局管理器,每一种都有其独特的特点和适用场景。下面我们将详…

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