目前的项目使用了 Spring Security 2.0.4 权限管理框架。 登录授权都由框架直接处理,所以也就产生了登录成功后 记录登录日志的需求。
找一上午资料基本都是 Spring Security 3的配置实现。最后随手拿起Spring企业应用开发详解看了一下Acegi的章节,发现原来如此。
首先看一下关键代码 ProviderManager 类中 在 doAuthentication 授权成功的时候,
创建了授权成功事件。 触发登录成功后置业务 就是 监听该事件并做相关操作。
if (result != null) {
sessionController.registerSuccessfulAuthentication(result);
[b] publishEvent(new AuthenticationSuccessEvent(result));[/b]
return result;
}
实现 授权成功 事件监听器
public class LoginSuccessListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof AuthenticationSuccessEvent) {
AuthenticationSuccessEvent authEvent = (AuthenticationSuccessEvent) event;
UserDetails user = (UserDetails) authEvent.getAuthentication().getPrincipal();
System.out.println("模拟输出用户登录日志:[" + java.util.Calendar.getInstance().getTime() + "] " + user.getUsername());
}
}
}
在Spring中加入 监听器。
<bean class="LoginSuccessListener"></bean>
至此成功写入登录日志
登录后置处理好了 紧接着 登出后置处理需求有来了!
看看登出 业务处理的关键代码吧!
详见 LogoutFilter
private String filterProcessesUrl = "/j_spring_security_logout";
private String logoutSuccessUrl;
private LogoutHandler[] handlers;
private boolean useRelativeContext;
与登出过滤器有关的主要属性
登出成功后的 转向 URL 登出处理程序 接口数组
具体的登出处理代码
if (requiresLogout(request, response)) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (logger.isDebugEnabled()) {
logger.debug("Logging out user '" + auth + "' and redirecting to logout page");
}
for (int i = 0; i < handlers.length; i++) {
handlers[i].logout(request, response, auth);
}
String targetUrl = determineTargetUrl(request, response);
sendRedirect(request, response, targetUrl);
return;
}
登出操作 其实就是 循环没有登出处理接口 然后在转向 目标URL. 那么登出处理接口都包括哪些 又是从哪里来的呢?
答案就在 LogoutBeanDefinitionParser 里
if (!StringUtils.hasText(logoutUrl)) {
logoutUrl = DEF_LOGOUT_URL;
}
builder.addPropertyValue("filterProcessesUrl", logoutUrl);
if (!StringUtils.hasText(logoutSuccessUrl)) {
logoutSuccessUrl = DEF_LOGOUT_SUCCESS_URL;
}
builder.addConstructorArg(logoutSuccessUrl);
if (!StringUtils.hasText(invalidateSession)) {
invalidateSession = DEF_INVALIDATE_SESSION;
}
ManagedList handlers = new ManagedList();
[b] SecurityContextLogoutHandler sclh = new SecurityContextLogoutHandler();[/b]
if ("true".equals(invalidateSession)) {
sclh.setInvalidateHttpSession(true);
} else {
sclh.setInvalidateHttpSession(false);
}
handlers.add(sclh);
if (rememberMeServices != null) {
[b] handlers.add(new RuntimeBeanReference(rememberMeServices));[/b]
}
builder.addConstructorArg(handlers);
所以 LogoutHandler 数组其实也就是 2个 固化了得数值,没有找到可以灵活配置 添加后置处理的地方。 (rememberMeServices 可以接受一个传入的bean id)
可以说 Logout 没有预备 事件的触发和扩展了, 要实现 Logout后置其实也很简单
修改 logout-success-url 属性, 指向一个自己需要做后置事情的地址,该地址判断用户是否确实 无授权了, 无授权即认为 登出了一次 做想过后置操作
分享到:
相关推荐
在本篇内容中,我们将探讨的是Spring AOP中的两种通知类型:前置通知和后置处理。 前置通知是在目标方法执行之前运行的代码,这通常用于进行一些预处理工作,比如检查权限、初始化数据等。在Spring中,我们可以通过...
SpringBoot+SpringSecurity处理Ajax登录请求问题 SpringBoot+SpringSecurity处理Ajax登录请求问题是SpringBoot开发中的一個常见问题,本文将详细介绍如何使用SpringBoot+SpringSecurity处理Ajax登录请求问题。 ...
NULL 博文链接:https://java-frog.iteye.com/blog/325364
在压缩包文件`spring_gateway_security_webflux`中,可能包含了示例代码或配置文件,用于演示如何在Spring Cloud Gateway中集成Spring Security,实现统一登录认证鉴权。这些资源可以帮助开发者更快地理解和实践上述...
* Presentation Layer:负责用户交互,例如登录、登出等。 * Application Layer:负责业务逻辑,例如身份验证、授权等。 * Infrastructure Layer:负责基础设施,例如数据库、缓存等。 * Security Layer:负责安全...
自定义Spring Security的身份验证失败处理方法 在 Spring Security 中,身份验证失败处理方法是一个非常重要的组件,它能够帮助我们处理身份验证失败的情况。然而,默认的身份验证失败处理方法并不总是能够满足我们...
Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现多用户登录功能。首先,我们需要理解Spring ...
Spring Security是一个功能强大、高度定制的安全框架,它专门用于为基于Spring的应用程序提供安全性解决方案。Spring Security架构的设计初衷是为了解决认证和授权的需求,确保应用程序的安全性。它提供了全面的安全...
在实现集成登录认证组件时,我们需要了解OAuth2.0认证体系、SpringBoot、SpringSecurity以及Spring Cloud等相关知识。同时,我们还需要了解如何定义拦截器、如何在拦截的通知进行预处理、如何在UserDetailService....
SpringSecurity提供`Authentication`接口,用于处理身份验证过程。 - **Authorization**: 授权是指决定用户是否有权限访问某个资源。SpringSecurity支持基于角色的访问控制(RBAC)和其他授权模型。 - **Access ...
登录功能是Spring Security的基础,它提供了默认的登录页面和处理机制。你可以通过配置HttpSecurity来定制登录过程,例如设置登录URL、失败URL和成功处理器。Spring Security支持基于表单的身份验证,也支持OAuth2和...
- Spring Security 无缝集成于Spring MVC框架,可以方便地与Spring MVC的其他特性配合使用,如异常处理和模型映射。 10. **Spring Boot集成**: - 在Spring Boot项目中,Spring Security 可以通过自动配置快速...
例如,你可以使用 `<http>` 元素来配置URL过滤, `<intercept-url>` 用于指定URL模式的访问权限, `<form-login>` 和 `<logout>` 分别用于处理表单登录和登出。 在"springsecurity.rar"文件中,可能包含了Spring...
在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
在Spring Security 4.0.0中,这些jar包一起工作,提供了一套完整的解决方案,用于实现用户认证(验证用户身份)和授权(决定用户是否允许访问特定资源)。例如,`spring-security-core`负责基本的认证和授权逻辑,`...
Spring Security是Java领域一个强大的安全框架,用于处理Web应用程序的安全性。在"Spring Security 3 多页面登录 小秘密小运气"这个主题中,我们可以深入探讨Spring Security 3如何支持多个登录页面以及其中可能涉及...
其次,Spring Security是Spring生态中的安全模块,它提供了一套全面的安全解决方案,包括认证、授权、会话管理等。开发者可以通过配置或编程的方式,利用Spring Security保护Web应用程序的各个层面,防止未授权访问...
7. **自定义过滤器**:如果你的逻辑更复杂,比如需要在登录成功后执行特定操作,可以创建自定义过滤器并将其插入到Spring Security的过滤器链中。 通过以上步骤,你可以实现Spring Security的登录验证和参数传递...