前后端分离概述

前后端分离指的就是前后端分离部署前端 调用后端API后端 返回 JSON格式数据页面是由前端渲染并展示到浏览器中。

相比较传统的单体项目页面是由后端渲染完成后返回给浏览器的。(jsp、thymeleaf、html…)

Spring Security 现状

我们在 SpringSecurity入门篇,快速搭建一个安全Web服务 已经搭建了一个基本的示例。其中的关键的流程如下:

  1. 当未登录用户访问项目时,会重定向到登录页(/login)。
  2. 登录成功后,会重定向到首页(也就是 / 路径)。
  3. 登录失败的话,会重定向到登录页。
  4. 登出后,会重定向到登录页。
  5. 登录后,鉴权失败(访问权限不足)时,会返回403响应。

可以看出来,这妥妥的很不’前后端分离’,后端还会返回html页面并且各种重定向。好在 Spring Security 扩展性足够好,支持替换默认的实现,下文便来掰扯掰扯。

Spring Security 前后端分离改造

前后端分离的要点就是,后端的响应统一通过 JSON 格式返回,而不是html或者重定向。 基于这个出发点,我们将替换原有的实现类。

定义统一的响应格式

改造的第一点,则是定义一个统一的响应格式:

  • 统一的响应格式
@Data
@Accessors(chain = true)
public class RestResult<T> {private int code;private T data;private String msg;private RestResult() {}public static RestResult success() {return new RestResult().setCode(200);}public static RestResult success(Object data) {return success().setData(data);}public static RestResult error() {return new RestResult().setCode(500);}public static RestResult error(String errMsg) {return error().setMsg(errMsg);}public static RestResult error(int code, String errMsg) {return new RestResult().setCode(code).setMsg(errMsg);}public static RestResult error(Exception ex) {return error(ex.getMessage());}public String toJsonString() {return JsonUtils.toJsonString(this);}}

重写默认实现,并替换(重点)

涉及到的扩展点:

  • 登录成功处理:AuthenticationSuccessHandler
  • 登录失败处理:AuthenticationFailureHandler
  • 登出成功处理:LogoutSuccessHandler
  • 未登录处理:AuthenticationEntryPoint
  • 鉴权失败处理:AccessDeniedHandler

注意看代码中的注释,改造点对应上文中提到的原有流程的序号!

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and()// 表单登录.formLogin()// 登录成功处理(对应流程2).successHandler(new AuthenticationSuccessHandler() {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {response.setContentType("application/json;charset=utf-8");response.getWriter().write(RestResult.success().toJsonString());}})// 登录失败处理(对应流程3).failureHandler(new AuthenticationFailureHandler() {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {response.setContentType("application/json;charset=utf-8");response.getWriter().write(RestResult.error(exception).toJsonString());}}).and()//登出.logout()//登出成功处理(对应流程4).logoutSuccessHandler(new LogoutSuccessHandler() {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {response.setContentType("application/json;charset=utf-8");response.getWriter().write(RestResult.success().toJsonString());}}).and()//异常处理.exceptionHandling()//未登录处理(对应流程1).authenticationEntryPoint(new AuthenticationEntryPoint() {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {response.setContentType("application/json;charset=utf-8");response.getWriter().write(RestResult.error(HttpServletResponse.SC_UNAUTHORIZED, "未登录").toJsonString());}})//没有权限处理(对应流程5).accessDeniedHandler(new AccessDeniedHandler() {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {response.setContentType("application/json;charset=utf-8");response.getWriter().write(RestResult.error(HttpServletResponse.SC_FORBIDDEN, "没有权限").toJsonString());}}).and().csrf().disable();}}

测试

直接测试原有流程,看看效果如何:

  1. 未登录时访问接口

    很好,达到我们目的了,改造后,它并不是重定向到登录页,而是通过json响应回来401。ok

  2. 登录失败

    同样的以json格式响应。nice

  3. 登录成功

    输入正确的帐号密码,登录成功,json响应200。perfect

  4. 登出

    over over

另外

项目还是利用 cookie-session 机制维持会话状态。
统一响应格式利用code判断请求是否成功。(还有一种方式是利用 HTTP状态码)

源码

https://gitee.com/markix/spring-security-example/tree/master/spring-security-simple-restful


end

Spring Security 前后端分离相关推荐

  1. spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)

    目录 目录 前言: 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseRe ...

  2. sm4 前后端 加密_这7个开源的Spring Boot前后端分离项目整理给你

    来源|公众号:江南一点雨 前后端分离已经开始逐渐走进各公司的技术栈,不少公司都已经切换到前后端分离开发技术栈上面了,因此建议技术人学习前后端分离开发以提升自身优势.同时,也整理了 7 个开源的 Spr ...

  3. Spring Boot前后端分离项目Session问题解决

    Spring Boot前后端分离项目Session问题解决 参考文章: (1)Spring Boot前后端分离项目Session问题解决 (2)https://www.cnblogs.com/sooo ...

  4. 《Vue+Spring Boot前后端分离开发实战》专著累计发行上万册

                杰哥的学术专著<Vue+Spring Boot前后端分离开发实战>由清华大学出版社于2021年3月首次出版发行,虽受疫情影响但热度不减,受到业界读者的热捧,截至今日 ...

  5. Spring Boot前后端分离之后端开发

    Spring Boot前后端分离开发之后端开发 前后端分离开发概述 相关术语 前后端分离开发概述 接口规范 RESTful API的理解 RESTful风格的特点 URI规范 路径 请求方式 过滤条件 ...

  6. spring boot 前后端分离项目(商城项目)学习笔记

    spring boot 前后端分离项目(商城项目)学习笔记 目录 spring boot 前后端分离项目(商城项目)学习笔记 后端配置 springboot项目 pom.xml文件 maven 配置文 ...

  7. 前后端分离项目_七个开源的 Spring Boot 前后端分离项目,一定要收藏

    来自公众号:江南一点雨 前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开 ...

  8. crm开源系统 tp框架_八个开源的 Spring Boot 前后端分离项目,一定要收藏!

    点击蓝色字关注我们 前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,也非常建议大家学习一下前后端分离开发,以免在公司干了两三年,SS ...

  9. springboot jwt token前后端分离_「转」七个开源的 Spring Boot 前后端分离项目,建议收藏加转载...

    其实前后端分离本身并不难,后段提供接口,前端做数据展示,关键是这种思想.很多人做惯了前后端不分的开发,在做前后端分离的时候,很容易带进来一些前后端不分时候的开发思路,结果做出来的产品不伦不类,因此松哥 ...

最新文章

  1. Problem A: 平面上的点——Point类 (I)
  2. java给定任意_java生成任意整数随机数(任意指定范围)
  3. React功能界面的组件化编码流程
  4. 拦截导弹(信息学奥赛一本通-T1260)
  5. 再见!“一代神机”iPhone 6或将于今年5月停产 iPhone 7/8降至3500档
  6. li标签横向排列_lt;bdigt; | HTML5 双向隔离标签
  7. websphere linux版本,安装IBM Websphere on linux
  8. iplat62----loading层添加
  9. java学习日记 集合框架
  10. xxl-job使用笔记
  11. web前端开发视频教程完整54讲下载
  12. 吃鸡服务器维护公告10月19日,绝地求生10月30日维护公告更新内容 今天吃鸡几点开服时间...
  13. 学习平面设计有哪些前途
  14. 新人略谈关于积分墙盈利模式的思考
  15. 什么是做空和做多以及什么是做空期权波动率
  16. mysql查缺补漏(一) and or优先级和多表join
  17. STM32内部参考电压的使用
  18. ffmpeg裁剪视频画面
  19. 如何进行微距摄影(转)
  20. 使用JDK自带的 keytool 工具生成公私钥证书库

热门文章

  1. 三维最长上升子序列问题——HDU 1069 Monkey and Banana
  2. 申请AI方向研究型博士、硕士指南
  3. IOS 系统文字转英文字母
  4. 阿里巴巴Java开发手册(黄山版)
  5. mac使用skip-thoughts所出现的问题
  6. 搭建DHCP服务实现动态分配IP地址
  7. java.sql.Date引发的日期格式转换错误
  8. UOS双系统启动菜单顺序修改方法
  9. 进入文档服务器不能输入密码,云服务器输入不了密码
  10. SpringBoot项目加密数据库密码