iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringSecurity如何实现前后端分离
  • 197
分享到

SpringSecurity如何实现前后端分离

2023-07-05 12:07:26 197人浏览 独家记忆
摘要

这篇文章主要介绍“springSecurity如何实现前后端分离”,在日常操作中,相信很多人在SpringSecurity如何实现前后端分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringSecur

这篇文章主要介绍“springSecurity如何实现前后端分离”,在日常操作中,相信很多人在SpringSecurity如何实现前后端分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringSecurity如何实现前后端分离”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    前后端分离模式是指由前端控制页面路由,后端接口也不再返回html数据,而是直接返回业务数据,数据一般是JSON格式。Spring Security默认的表单登录方式,在未登录或登录成功时会发起页面重定向,在提交登录数据时,也不是jsON格式。要支持前后端分离模式,要对这些问题进行改造。

    1. 认证信息改成JSON格式

    Spring Security默认提供账号密码认证方式,具体实现是在UsernamePassWordAuthenticationFilter 中。因为是表单提交,所以Filter中用request.getParameter(this.usernameParameter) 来获取用户信息。当我们将数据改成JSON,并放入Http Body后,getParameter 就没法获取到信息。

    要解决这个问题,就要新建Filter来替换UsernamePasswordAuthenticationFilter ,然后覆盖掉获取用户的方法。

    1.1 新建JsonUsernamePasswordAuthenticationFilter

    import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import jakarta.servlet.http.httpservletRequest;import jakarta.servlet.http.HttpServletResponse;import lombok.SneakyThrows;import org.springframework.data.util.Pair;import org.springframework.security.authentication.AuthenticationServiceException;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.WEB.authentication.UsernamePasswordAuthenticationFilter; public class JsonUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {        @Override    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)            throws AuthenticationException {        if (!request.getMethod().equals("POST")) {            throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());        }        Pair<String, String> usernameAndPassword = obtainUsernameAndPassword(request);        String username = usernameAndPassword.getFirst();        username = (username != null) ? username.trim() : "";        String password = usernameAndPassword.getSecond();        password = (password != null) ? password : "";        UsernamePasswordAuthenticationToken authRequest = UsernamePasswordAuthenticationToken.unauthenticated(username,                password);        // Allow subclasses to set the "details" property        setDetails(request, authRequest);        return this.getAuthenticationManager().authenticate(authRequest);    }     @SneakyThrows    private Pair<String, String> obtainUsernameAndPassword(HttpServletRequest request) {        JSONObject map = JSON.parseObject(request.getInputStream(), JSONObject.class);        return Pair.of(map.getString(getUsernameParameter()), map.getString(getPasswordParameter()));    }}

    1.2 新建JsonUsernamePasswordLoginConfigurer

    注册Filter有两种方式,一给是直接调用httpSecurity的addFilterAt(Filter filter, Class<? extends Filter> atFilter) ,另一个是注册通过AbstractHttpConfigurer 来注册。我们选择第二种方式来注册Filter,因为AbstractHttpConfigurer 在初始化 UsernamePasswordAuthenticationFilter 的时候,会额外设置一些信息。新建一个自己的AbstractHttpConfigurer

    import org.springframework.security.config.annotation.web.HttpSecurityBuilder;import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;import org.springframework.security.web.util.matcher.AntPathRequestMatcher;import org.springframework.security.web.util.matcher.RequestMatcher; public final class JsonUsernamePasswordLoginConfigurer<H extends HttpSecurityBuilder<H>> extends        AbstractAuthenticationFilterConfigurer<H, JsonUsernamePasswordLoginConfigurer<H>, JsonUsernamePasswordAuthenticationFilter> { public JsonUsernamePasswordLoginConfigurer() {super(new JsonUsernamePasswordAuthenticationFilter(), null);} @Overrideprotected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingUrl) {return new AntPathRequestMatcher(loginProcessingUrl, "POST");}}

    1.3 注册JJsonUsernamePasswordLoginConfigurer到HttpSecurity

    这一步比较简单,直接关闭表单登录,然后注册我们自己的Filter。

    http    .fORMLogin().disable()    .apply(new JsonUsernamePasswordLoginConfigurer<>())

    经过这三步,Spring Security就能识别JSON格式的用户信息。

    2. 去掉重定向

    有几个场景会触发Spring Security的重定向:

    • 未登录,重定向到登录页面

    • 登录验证成功,重定向到默认页面

    • 退出登录,重定向到默认页面

    我们要对这几个场景分别处理,给前端返回错误信息,而不是重定向。

    2.1 未登录请求

    未登录的请求会被AuthorizationFilter拦截,并抛出异常。异常被AuthenticationEntryPoint处理,默认会触发重定向到登录页。我们通过自定义AuthenticationEntryPoint来取消重定向行为,改为返回JSON信息。

    http// 1. 未登录的请求会被AuthorizationFilter拦截,并抛出异常。.exceptionHandling(it -> it.authenticationEntryPoint((request, response, authException) -> {    log.info("get exception {}", authException.getClass());    String msg = "{\\"msg\\": \\"用户未登录\\"}";    response.setStatus(HttpStatus.FORBIDDEN.value());    response.setContentType(MediaType.APPLICATION_JSON_VALUE);    PrintWriter writer = response.getWriter();    writer.write(msg);    writer.flush();    writer.close();}))

    2.2 登录成功/失败

    登录成功或失败后的行为由AuthenticationSuccesshandler 和AuthenticationFailureHandler 来控制。由于上面我们自定义了JsonUsernamePasswordLoginConfigurer ,所以要配置自定义Configurer 上的AuthenticationSuccessHandler 和AuthenticationFailureHandler 。

    http    .formLogin().disable()    .apply((SecurityConfigurerAdapter) new JsonUsernamePasswordLoginConfigurer<>()            .successHandler((request, response, authentication) -> {String msg = "{\\"msg\\": \\"登录成功\\"}";response.setStatus(HttpStatus.OK.value());            response.setContentType(MediaType.APPLICATION_JSON_VALUE);            PrintWriter writer = response.getWriter();            writer.write(msg);            writer.flush();            writer.close();            })            .failureHandler((request, response, exception) -> {String msg = "{\\"msg\\": \\"用户名密码错误\\"}";response.setStatus(HttpStatus.UNAUTHORIZED.value());            response.setContentType(MediaType.APPLICATION_JSON_VALUE);            PrintWriter writer = response.getWriter();            writer.write(msg);            writer.flush();            writer.close();            }));

    2.3 退出登录

    // 退出登录.loGout(it -> it        .logoutSuccessHandler((request, response, authentication) -> {            String msg = "{\\"msg\\": \\"退出成功\\"}";            response.setStatus(HttpStatus.OK.value());            response.setContentType(MediaType.APPLICATION_JSON_VALUE);            PrintWriter writer = response.getWriter();            writer.write(msg);            writer.flush();            writer.close();        }))

    3. 最后处理CSRF校验

    由于前端直接调用登录接口,跳过了获取登录页面的步骤,所以服务端没有机会将CSRF Token传给前段,所以要把POST /login接口的CSRF校验剔除掉。

    http.csrf(it -> it.ignoringRequestMatchers("/login", "POST"))

    到此,关于“SpringSecurity如何实现前后端分离”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: SpringSecurity如何实现前后端分离

    本文链接: https://www.lsjlt.com/news/351575.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • SpringSecurity如何实现前后端分离
      这篇文章主要介绍“SpringSecurity如何实现前后端分离”,在日常操作中,相信很多人在SpringSecurity如何实现前后端分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringSecur...
      99+
      2023-07-05
    • SpringSecurity怎么实现前后端分离
      今天小编给大家分享一下SpringSecurity怎么实现前后端分离的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sprin...
      99+
      2023-07-05
    • SpringSecurity实现前后端分离的示例详解
      目录1. 认证信息改成JSON格式1.1 新建JsonUsernamePasswordAuthenticationFilter1.2 新建JsonUsernamePasswordLo...
      99+
      2023-03-14
      SpringSecurity前后端分离 SpringSecurity分离
    • php前后端分离如何实现
      要实现PHP前后端分离,需要使用以下技术和方法:1. 使用前端框架:选择一个前端框架(如React、Vue.js、Angular等)...
      99+
      2023-10-09
      php
    • SpringSecurity实现前后端分离登录token认证详解
      目录 1. SpringSecurity概述 1.1 权限框架 1.1.1 Apache Shiro 1.1.2 SpringSecurity 1.1.3 权限框架的选择 1.2 授权和认证 1.3 SpringSecurity的功能 ...
      99+
      2023-08-31
      spring java spring boot
    • 如何用php实现前端后台分离
      这篇文章主要讲解了“如何用php实现前端后台分离”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用php实现前端后台分离”吧!构建后台API接口PHP作为一种服务器端脚本语言,相比于Jav...
      99+
      2023-07-05
    • Java项目如何实现前后端分离
      今天就跟大家聊聊有关Java项目如何实现前后端分离,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。构建springboot项目我的目录结构:(结果未按标准书写,仅作说明)不管用什么ID...
      99+
      2023-05-31
      java 前后端分离 ava
    • FastApi+Vue+LayUI如何实现前后端分离
      小编给大家分享一下FastApi+Vue+LayUI如何实现前后端分离,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在前面的Api开发中,我们使用FastAp...
      99+
      2023-06-25
    • golang前后端分离如何实现交互
      在 Golang 中实现前后端分离的交互可以通过以下几种方式:1. RESTful API:将后端独立的服务,提供 RESTful ...
      99+
      2023-10-20
      golang
    • 解析Thinkphp5如何实现前后端分离
      这篇文章主要介绍解析Thinkphp5如何实现前后端分离,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用Thinkphp5实现纯API开发实现前后端分离大致步骤如下解决跨域请求问题2.改变输出数据格式为API常用返回...
      99+
      2023-06-15
    • SpringBoot+Vue前后端分离后如何使用SpringSecurity处理权限问题
      这篇文章给大家分享的是有关SpringBoot+Vue前后端分离后如何使用SpringSecurity处理权限问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据库设计权限数据...
      99+
      2024-04-02
    • SpringBoot如何实现前后端分离国际化
      这篇“SpringBoot如何实现前后端分离国际化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot如何实现...
      99+
      2023-07-05
    • django前后端分离怎么实现
      要实现Django的前后端分离,可以使用Django Rest Framework(DRF)作为后端框架,同时使用一个前端框架(如R...
      99+
      2023-10-09
      django
    • JavaScript怎么实现前后端分离
      本篇内容介绍了“JavaScript怎么实现前后端分离”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 前...
      99+
      2024-04-02
    • git前后端分离如何用
      本篇内容介绍了“git前后端分离如何用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前后端分离的基本概念前后端分离的基本概念是:前端提供...
      99+
      2023-07-06
    • SpringBoot+mybatis+Vue如何实现前后端分离项目
      这篇文章主要为大家展示了“SpringBoot+mybatis+Vue如何实现前后端分离项目”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot+mybatis+Vue如何实现前后...
      99+
      2023-06-22
    • 如何实现Docker部署前后端分离项目
      这篇文章给大家介绍如何实现Docker部署前后端分离项目,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、环境准备服务器阿里云服务器 1核+2GB即可软件本次部署采用的是 docker,因此软件环境都在 docker ...
      99+
      2023-06-21
    • thinkPHP5前后端分离
      thinkPHP5前后端分离 环境配置并运行起thinkphp安装小皮面板安装phpstorm配置thinkPHP5将文件放入适当位置修改Nginx配置修改配置和伪静态 跨域前端 ...
      99+
      2023-10-11
      php 前端 nginx 1024程序员节
    • 前后端分离djangorestframe
      关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码   这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的用的是token,而不是sessi...
      99+
      2023-01-30
      后端 djangorestframe
    • Springboot实现前后端分离excel下载
      目录Springboot前后端分离excel下载前后端分离Excle下载乱码问题前端请求方式 : ajax请求Springboot前后端分离excel下载 现在公司的技术栈是spri...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作