java授权失败_自定义Spring Security的身份验证失败处理方法
1.概述
在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理。目标是使用表单登录方法对用户进行身份验证。
2.认证和授权(Authentication and Authorization)
身份验证和授权通常结合使用,因为它们在授予系统访问权限时起着重要且同样重要的作用。
但是,它们具有不同的含义,并在验证请求时应用不同的约束:
身份验证 - 在授权之前;它是关于验证收到的凭证;我们验证用户名和密码是否与我们的应用程序识别的用户名和密码相匹配
授权 - 用于验证成功通过身份验证的用户是否有权访问应用程序的某个功能
我们可以自定义身份验证和授权失败处理,但是,在此应用程序中,我们将专注于身份验证失败。
3. Spring Security的AuthenticationFailureHandler
Spring Security提供了一个默认处理身份验证失败的组件。
但是,我们发现于默认行为不足以满足实际要求的情况是很常见的。
如果是这种情况,我们可以创建自己的组件并通过实现AuthenticationFailureHandler接口提供我们想要的自定义行为:
public class CustomAuthenticationFailureHandler
implements AuthenticationFailureHandler {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception)
throws IOException, ServletException {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
Map data = new HashMap<>();
data.put(
"timestamp",
Calendar.getInstance().getTime());
data.put(
"exception",
exception.getMessage());
response.getOutputStream()
.println(objectMapper.writeValueAsString(data));
}
}
默认情况下,Spring使用包含错误信息的请求参数将用户重定向回登录页面。
在此应用程序中,我们将返回401响应,其中包含有关错误的信息以及错误发生的时间戳。
DelegatingAuthenticationFailureHandler将AuthenticationException子类委托给不同的AuthenticationFailureHandler,这意味着我们可以为AuthenticationException的不同实例创建不同的行为
ExceptionMappingAuthenticationFailureHandler根据AuthenticationException的完整类名将用户重定向到特定的URL
无论AuthenticationException的类型如何,ForwardAuthenticationFailureHandler都会将用户转发到指定的URL
SimpleUrlAuthenticationFailureHandler是默认使用的组件,如果指定,它会将用户重定向到failureUrl;否则,它只会返回401响应
现在我们已经创建了自定义AuthenticationFailureHandler,让我们配置我们的应用程序并覆盖Spring的默认处理程序:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth
.inMemoryAuthentication()
.withUser("baeldung")
.password("baeldung")
.roles("USER");
}
@Override
protected void configure(HttpSecurity http)
throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.failureHandler(customAuthenticationFailureHandler());
}
@Bean
public AuthenticationFailureHandler customAuthenticationFailureHandler() {
return new CustomAuthenticationFailureHandler();
}
}
注意failureHandler()调用,我们可以告诉Spring使用我们的自定义组件而不是使用默认组件。
4.结论
在此示例中,我们使用Spring的AuthenticationFailureHandler接口自定义了应用程序的身份验证失败处理程序。
java授权失败_自定义Spring Security的身份验证失败处理方法相关推荐
- Spring Security:身份验证入口AuthenticationEntryPoint介绍与Debug分析
ExceptionTranslationFilter ExceptionTranslationFilter(Security Filter)允许将AccessDeniedException和Authe ...
- Spring Security:身份验证令牌Authentication介绍与Debug分析
在Spring Security中,通过Authentication来封装用户的验证请求信息,Authentication可以是需要验证和已验证的用户请求信息封装.接下来,博主介绍Authentica ...
- shiro身份验证失败捕获的异常对应信息
shiro身份验证失败捕获的异常对应信息 身份验证失败请捕获 AuthenticationException 或其子类,常见的如: DisabledAccountException(禁用的帐号). L ...
- java spring 登录验证_浅析Spring Security登录验证流程源码
一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...
- java登录密码验证失败_java – Spring Security:如果身份验证失败,则重定向到登录页面...
我们有两种登录方式. >用户名和密码由请求标头中的其他应用程序发送.检查IT,如果用户名和密码正确,则进入.[为此编写自定义过滤器] >如果请求标头中不存在用户名和密码,则会显示登录屏幕. ...
- java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...
java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...
- 后端架构token授权认证机制:spring security JSON Web Token(JWT)简例
后端架构token授权认证机制:spring security JSON Web Token(JWT)简例 在基于token的客户端-服务器端认证授权以前,前端到服务器端的认证-授权通常是基于sess ...
- 如何使用Java和XML Config在Spring Security中启用HTTP基本身份验证
在上一篇文章中,我向您展示了如何在Java应用程序中启用Spring安全性 ,今天我们将讨论如何使用Spring Security 在Java Web应用程序中启用Basic HTTP身份验证 . 如 ...
- 关闭Spring security的登录验证
目的关闭Spring security 默认登录页 Springboot 2.x关闭需要在启动类上排除SecurityAutoConfiguration和ManagementWebSecurityAu ...
最新文章
- 写自己的一个pdo数据库操作框架
- linux开发板加快开机速度,readahead加速Linux开机速度
- python 遍历数组根据规律拆分,python 实现以相同规律打乱多组数据
- 【AI视野·今日NLP 自然语言处理论文速览 第五期】Thu, 10 Jun 2021
- Java GUI简单点名器
- VB 在浏览器中打开指定网址
- 服务台与事件管理解决方案
- UltraEdit(UE)如何设置去掉.bak备份文件?
- [py]flask从0到1-模板/增删改查
- Java系统架构的演化之路
- 14.Linux 高性能服务器编程 --- 多线程编程
- VS2022中LNK2005的问题
- 启动计算机应用程序的命令,如何设置电脑Windows开机启动项命令?
- 解决onebot提示当前QQ版本过低,请升级到最新版在登录!
- vue antd的menu组件使用
- C# 使用Timer设置一个定时任务
- 腾讯地图定位 代码
- 本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了
- 离散控制 discrete control
- 智能手机马拉松:后半程是耐力赛
热门文章
- 如何将知识引入机器学习模型提升泛化能力?
- 自从有了这个工具,一键代码迁移不在话下
- 5步教你将MRS数据导入DWS
- 疫情当前,企业“逆势而上”还需“上云”加速
- 【华为云技术分享】昇腾AI处理器软件栈--总览
- 【云速建站】表单应用
- windows php7 apache,windows系统下php7+apache2.4环境搭建
- jenkins linux 发邮件,jenkins——邮件配置
- 版本对应关系python TensorFlow+Keras
- LeetCode-114: 二叉树展开为链表