Spring Security 前后端分离
前后端分离概述
前后端分离指的就是前后端分离部署,前端 调用后端API,后端 返回 JSON格式数据,页面是由前端渲染并展示到浏览器中。
相比较传统的单体项目 ,页面是由后端渲染完成后返回给浏览器的。(jsp、thymeleaf、html…)
Spring Security 现状
我们在 SpringSecurity入门篇,快速搭建一个安全Web服务 已经搭建了一个基本的示例。其中的关键的流程如下:
- 当未登录用户访问项目时,会重定向到登录页(
/login
)。 - 登录成功后,会重定向到首页(也就是
/
路径)。 - 登录失败的话,会重定向到登录页。
- 登出后,会重定向到登录页。
- 登录后,鉴权失败(访问权限不足)时,会返回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();}}
测试
直接测试原有流程,看看效果如何:
未登录时访问接口
很好,达到我们目的了,改造后,它并不是重定向到登录页,而是通过json响应回来401。ok登录失败
同样的以json格式响应。nice登录成功
输入正确的帐号密码,登录成功,json响应200。perfect登出
over over
另外
项目还是利用 cookie-session
机制维持会话状态。
统一响应格式利用code判断请求是否成功。(还有一种方式是利用 HTTP状态码)
源码
https://gitee.com/markix/spring-security-example/tree/master/spring-security-simple-restful
end
Spring Security 前后端分离相关推荐
- spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)
目录 目录 前言: 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseRe ...
- sm4 前后端 加密_这7个开源的Spring Boot前后端分离项目整理给你
来源|公众号:江南一点雨 前后端分离已经开始逐渐走进各公司的技术栈,不少公司都已经切换到前后端分离开发技术栈上面了,因此建议技术人学习前后端分离开发以提升自身优势.同时,也整理了 7 个开源的 Spr ...
- Spring Boot前后端分离项目Session问题解决
Spring Boot前后端分离项目Session问题解决 参考文章: (1)Spring Boot前后端分离项目Session问题解决 (2)https://www.cnblogs.com/sooo ...
- 《Vue+Spring Boot前后端分离开发实战》专著累计发行上万册
杰哥的学术专著<Vue+Spring Boot前后端分离开发实战>由清华大学出版社于2021年3月首次出版发行,虽受疫情影响但热度不减,受到业界读者的热捧,截至今日 ...
- Spring Boot前后端分离之后端开发
Spring Boot前后端分离开发之后端开发 前后端分离开发概述 相关术语 前后端分离开发概述 接口规范 RESTful API的理解 RESTful风格的特点 URI规范 路径 请求方式 过滤条件 ...
- spring boot 前后端分离项目(商城项目)学习笔记
spring boot 前后端分离项目(商城项目)学习笔记 目录 spring boot 前后端分离项目(商城项目)学习笔记 后端配置 springboot项目 pom.xml文件 maven 配置文 ...
- 前后端分离项目_七个开源的 Spring Boot 前后端分离项目,一定要收藏
来自公众号:江南一点雨 前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开 ...
- crm开源系统 tp框架_八个开源的 Spring Boot 前后端分离项目,一定要收藏!
点击蓝色字关注我们 前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,也非常建议大家学习一下前后端分离开发,以免在公司干了两三年,SS ...
- springboot jwt token前后端分离_「转」七个开源的 Spring Boot 前后端分离项目,建议收藏加转载...
其实前后端分离本身并不难,后段提供接口,前端做数据展示,关键是这种思想.很多人做惯了前后端不分的开发,在做前后端分离的时候,很容易带进来一些前后端不分时候的开发思路,结果做出来的产品不伦不类,因此松哥 ...
最新文章
- Problem A: 平面上的点——Point类 (I)
- java给定任意_java生成任意整数随机数(任意指定范围)
- React功能界面的组件化编码流程
- 拦截导弹(信息学奥赛一本通-T1260)
- 再见!“一代神机”iPhone 6或将于今年5月停产 iPhone 7/8降至3500档
- li标签横向排列_lt;bdigt; | HTML5 双向隔离标签
- websphere linux版本,安装IBM Websphere on linux
- iplat62----loading层添加
- java学习日记 集合框架
- xxl-job使用笔记
- web前端开发视频教程完整54讲下载
- 吃鸡服务器维护公告10月19日,绝地求生10月30日维护公告更新内容 今天吃鸡几点开服时间...
- 学习平面设计有哪些前途
- 新人略谈关于积分墙盈利模式的思考
- 什么是做空和做多以及什么是做空期权波动率
- mysql查缺补漏(一) and or优先级和多表join
- STM32内部参考电压的使用
- ffmpeg裁剪视频画面
- 如何进行微距摄影(转)
- 使用JDK自带的 keytool 工具生成公私钥证书库