Springboot +spring security,前后端分离时的security处理方案(一)

news/2024/12/22 19:50:40/

一.简介

在前后端分离这样的开发模式下,前后端的交互都是通过 JSON 来进行数据传递的,无论登录成功还是失败,都不会有服务端跳转或者客户端跳转之类的操作。

也就是说无论登录成功还是失败,服务端都会返回一段登录成功或失败的 JSON 信息给前端,前端收到JSON之后来决定是该跳转到成功界面还是失败界面,和后端没有关系。

二.认证处理时的相关API

2.1页面跳转的相关API

2.1.1登录成功时的跳转API

表单认证时,处理登录成功时,跳转到某个页面的API是如下两个方法:

  1. defaultSuccessUrl
  2. successForwardUrl

以上两个方法都是用来配置跳转地址的,适用于前后端不分离时的开发。

2.1.2登录失败时的跳转API

处理登录失败时,跳转页面的API是如下两个方法:

  1. failureUrl()
  2. failureForwardUrl()

以上两个方法也是用来配置跳转地址的,同样适用于前后端不分离时的开发。

2.2返回JSON格式的处理器

上面的两类方法,无论是认证成功还是认证失败,都是在前后端不分离时的处理方案,直接从Java后端跳转到某个页面上。那么在前后端分离时,Java后端项目中,根本就没有页面。

在前后端分离模式下,既然后端没有页面,页面都在前端,那就可以考虑使用JSON来进行信息交互了,我们把认证成功或认证失败的信息,以JSON的格式传递给前端,由前端来决定到底该往哪个页面跳转就好了。

如果要返回JSON格式的信息,有如下相关方法:

  1. successHandler()
  2. failureHandler()
  3. logoutSuccessHandler()
  4. authenticationEntryPoint()

三. 创建SpringSecurity项目

参考之前的文章,这边不做叙述。

四. 认证成功时的处理方案

首先看下相关的方法及其核心参数,即successHandler()和onAuthenticationSuccess参数。

4.1successHandler()方法

**successHandler()**方法的功能十分强大,囊括了 defaultSuccessUrl()和 successForwardUrl() 的功能。

**successHandler()**方法的参数是一个 AuthenticationSuccessHandler 对象,这个对象中我们要实现的方法是 onAuthenticationSuccess()。

4.2onAuthenticationSuccess参数

onAuthenticationSuccess() 方法中有三个参数,分别是:

  1. HttpServletRequest: 利用该参数我们可以实现服务端的跳转;
  2. HttpServletResponse: 利用该参数我们可以做客户端的跳转,也可以返回 JSON 数据;
  3. Authentication: 这个参数则保存了我们刚刚登录成功的用户信息。

4.3定义SecurityAuthenticationSuccessHandler类

了解完主要的方法和参数之后,我们先来编写一个处理器类,该类需要实现SavedRequestAwareAuthenticationSuccessHandler接口。
代码如下:

/*** 处理登录成功时的业务逻辑*/
public class SecurityAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {/*** Authentication:携带登录的用户名及角色等信息*/@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {//直接输出json格式的响应信息Object principal = authentication.getPrincipal();response.setContentType("application/json;charset=utf-8");PrintWriter out = response.getWriter();//以json格式对外输出身份信息out.write(new ObjectMapper().writeValueAsString(principal));out.flush();out.close();}
}

4.4配置successHandler

然后在SecurityConfig配置类中,调用successHandler()方法,把前面定义的SecurityAuthenticationSuccessHandler类关联进来。代码如下:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll()//认证成功时的处理器.successHandler(new SecurityAuthenticationSuccessHandler()).and().csrf().disable();}}

4.5验证

配置完成后,进行登录验证,在认证成功后,就可以看到登录成功的用户信息是通过 JSON 返回到前端的,如图所示:
在这里插入图片描述
在认证成功后,Spring Security会把认证的用户信息以JSON格式展示出来,比如用户名、密码、角色等信息。

五.认证失败时的处理方案

如何实现认证失败时的处理方案,同样的,先看下相关的API方法及参数。

5.1failureHandler()

failureHandler()方法的参数是一个 AuthenticationFailureHandler 对象,这个对象中我们要实现的方法是 onAuthenticationFailure()。

onAuthenticationFailure()方法有三个参数,分别是:

  1. HttpServletRequest: 利用该参数我们可以实现服务端的跳转;
  2. HttpServletResponse: 利用该参数我们可以做客户端的跳转,也可以返回 JSON 数据;
  3. AuthenticationException: 这个参数则保存了登录失败的原因。

5.2定义SecurityAuthenticationFailureHandler类

SecurityAuthenticationFailureHandler类的代码如下:

/*** 处理登录失败时的业务逻辑*/
public class SecurityAuthenticationFailureHandler extends ExceptionMappingAuthenticationFailureHandler {/*** AuthenticationException:异常信息*/@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {//直接输出json格式的响应信息response.setContentType("application/json;charset=utf-8");PrintWriter out = response.getWriter();out.write(e.getMessage());out.flush();out.close();}
}

5.3配置failureHandler

接着在SecurityConfig配置类中,调用failureHandler()方法来关联上面定义的SecurityAuthenticationFailureHandler类对象。代码如下:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll()//认证成功时的处理器.successHandler(new SecurityAuthenticationSuccessHandler())//认证失败时的处理器.failureHandler(new SecurityAuthenticationFailureHandler()).and().csrf().disable();}}

5.4验证

配置完成后,再去登录,在认证失败时,就可以看到登录失败的用户信息通过 JSON 返回到前端了,如下图所示:
在这里插入图片描述


http://www.ppmy.cn/news/128290.html

相关文章

618千元机该怎么选

标题千元机该怎么选 以下罗列几款手机: 你会怎么选择千元机。

2021年1月全球最畅销智能手机排行榜出炉

本文转载自IT之家。 IT之家4月9日消息 外媒 MacRumors 报道,根据 Counterpoint Research 编制的市场数据,苹果自 2016 年 iPhone SE 发布以来最小的 iPhone,即 iPhone 12 mini,在 2021 年 1 月的全球最畅销智能手机排行榜前五名中…

鲁大师2023年Q1手机报告:OPPO Find X6 Pro刷新性能榜新纪录,综合性能140.5万分

近期,鲁大师发布了2023年Q1季度手机报告,搭载骁龙8 Gen2芯片手机厂商纷纷发力,推出多款搭载该芯片的手机产品,综合性能榜主要竞争在各家厂商在骁龙8 Gen2的调校上。最终,OPPO Find X6 Pro用出色的性能调校成功以140559…

老人机应用_什么手机适合老人用?2018年最实用的老人手机排行榜十强

老年人手机买哪款好?适合老人使用的智能手机哪款比较好?根据最新的数据显示我国网民中老年人的比例越来越高,因此老年人也需要更加符合时代的通讯设备,因此单纯的大按键大屏幕的傻瓜手机已经没有办法满足老年朋友了,因此今天来说说有哪些手…

智能手机的发展

2007年 乔布斯 苹果第一代iPhone 重新定义手机 2008年 谷歌研发团队 第一代Android系统 安卓系统元年 2010年 LG/双核手机问世 性能时代开始 2011年 三星GALAXY NOTE(5.3寸) 大屏时代开始 2012年 索尼/HTC将1080P屏幕引进手机 手机屏幕全高清时代开始 20…

数组常用的函数

1、join();将数组元素转换字符串 2、push()函数:在数组的末尾添加一个或多个元素 3、pop()函数:从数组的末尾删除一个元素,函数返回被删除的元素 4、shift…

华为上半年手机销量_2019上半年手机销量排行榜出炉,华为一骑绝尘,魅族联想上榜...

原标题:2019上半年手机销量排行榜出炉,华为一骑绝尘,魅族联想上榜 2019上半年的手机市场,竞争异常惨烈,各家手机厂商为了销量纷纷攻占性价比这个阵营。千元机有极致性价比的Redmi、新进品牌Realme、联想等;…

C语言赋值及基本运算

一.赋值运算 1.赋值操作是程序设计中最常用的操作之一,C 语言共提供了 10个赋值运算符,均为二元运算符,其中仅有一个为基本赋值运算符 ,其余 9 个均是复合赋值运算符,即: (1)基本赋值…