`
jnoee
  • 浏览: 68420 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

整合Spring Security自定义登录的简便方法

 
阅读更多

安全开源框架这块咱们基本上没什么选择,Spring Security是最常用的了,虽然它功能强大,但是还是过于复杂了。虽然3.0提供了auto config,但本质上它的复杂度没有降低,只是简化了一下配置而已。我始终认为它应该弄一个简化版,不要集成那么多的认证支撑,让人一看就懂的那种,个人意见哈。

 

我们最常用的基于用户名和密码的认证,SS提供了UsernamePasswordAuthenticationFilter,要求我们通过POST提交j_username/j_password两个参数来完成这个认证。这个设计真是相当别扭,从它的前身Acegi开始就这样了,这不符合我们最常用的开发需求,例如我们通常会加入一个验证码什么的。

 

网上有两种集成方案:

1. 自己实现一个验证码的Filter插入到UsernamePasswordAuthenticationFilter前面。

2. 重写一个UsernamePasswordAuthenticationFilter,加入验证码验证,修改配置替换原来的Filter。

 

虽然比较符合SS的扩展模式,但个人感觉还是太麻烦了。

 

我想了两种比较简单的方案,思路是这样的:

1. 先自己处理验证码,然后将请求转发给UsernamePasswordAuthenticationFilter进行登录。

2. 自己处理登录过程,登录表单则可以完全自己定义了。

 

第一种方案

仍要保持j_username和j_password两个参数名不变,因为SS没提供该参数名的可配置项。以Struts为例子来讲,首先表单提交到我们自定义的Action方法中,这时我们可以处理验证码。验证码验证通过后,将请求转发到 /j_spring_security_check即UsernamePasswordAuthenticationFilter。这里必须是RequestDispatcher的forward方式转发,因为这样才能将j_username和j_password参数带过去。

另外我们需要在web.xml中将SS的DelegatingFilterProxy配置为支持forward转发拦截的,因为默认配置只支持request拦截。

就这样,你想在验证用户之前干点啥都可以,自己在Action中处理吧。没有侵入性,就是参数名有点受限制。

 

第二种方案

SS的基本原理是在ThreadLocal线程变量中存入一个SecurityContext对象,在web中通过Filter不断的传递这个线程变量,使得web的一个线程范围内的程序都可以访问到这个SecurityContext对象。这个SecurityContext对象中存有一个Authentication对象,身份和权限都在这个Authentication对象中。第二种方案就是绕开SS的Filter手动的完成验证并设置Authentication对象。关键代码如下:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username,password);
Authentication authentication = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);

 authenticationManager是SS内置的一个组件,你需要定义一个别名进行注入引用。authenticationManager.authenticate(token)方法会抛出异常,你可以捕获处理这些异常,例如用户名密码错误、用户被禁用等等。在这种方案下你爱怎么自定义登录过程都可以了。

分享到:
评论

相关推荐

    Spring Security OAuth2集成短信验证码登录以及第三方登录

    在实现集成登录认证组件时,我们需要了解OAuth2.0认证体系、SpringBoot、SpringSecurity以及Spring Cloud等相关知识。同时,我们还需要了解如何定义拦截器、如何在拦截的通知进行预处理、如何在UserDetailService....

    ssh整合spring Security

    SSH整合Spring Security是Java开发中常见的一种安全框架集成方式,主要应用于Web应用程序的安全管理。SSH分别代表了Spring、Struts2和Hibernate这三个开源框架。Spring是应用的基础框架,提供了依赖注入(DI)和面向...

    springboot - 2.7.3版本 - (九)整合security

    在Spring Boot项目中整合Spring Security,首先需要在`build.gradle`或`pom.xml`文件中添加Spring Security依赖。对于Spring Boot 2.7.3,依赖应如下所示: ```groovy dependencies { implementation 'org.spring...

    springsecurity使用demo

    SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...

    SpringSecurity 中文文档+简单视频教程

    7. **异常处理**:SpringSecurity提供了一套完整的异常处理机制,包括自定义错误页面和登录失败处理。 接下来,视频教程可能涵盖以下实践操作: 1. **环境搭建**:如何在项目中引入SpringSecurity依赖,配置Maven...

    spring boot、 mybaits、 spring security、 redis整合

    整合Spring Boot、MyBatis、Spring Security和Redis,首先需要在Spring Boot项目中引入相应的依赖。在`pom.xml`文件中添加MyBatis、Spring Security和Redis的Maven依赖。然后,配置Spring Boot的`application....

    SpringBoot整合Spring Security.docx

    在实际应用中,整合Spring Security需要配置安全拦截规则、认证和授权逻辑,以及与数据库的交互来存储和验证用户信息。通常,首先需要定义安全配置类,扩展WebSecurityConfigurerAdapter,并覆盖其configure方法,...

    SpringSecurity4.2 自定义登陆页面,图形验证码,源码

    SpringSecurity默认提供了一个简单的登录界面,但通常我们需要根据项目需求进行定制。要自定义登录页面,你需要创建一个新的HTML页面,然后在SpringSecurity配置中指定这个页面作为登录表单的URL。例如,你可以创建...

    springSecurity.zip

    本教程将带你简单入门Spring Security,了解其核心概念和基本配置。 一、Spring Security 概述 Spring Security的核心目标是为应用程序提供“认证”(Authentication)和“授权”(Authorization)。认证是指确认...

    springSecurity demo 下载可用

    在"springSecurity demo 下载可用"的描述中,我们可以推测这是一个示例项目,用于展示如何在SSM(Spring、SpringMVC、MyBatis)框架下整合Spring Security。 SSM框架是Java Web开发中常用的组合,其中Spring负责...

    springboot+ spring security实现登录认证

    默认情况下,Spring Security提供了一个简单的登录页面,但我们可以创建自己的视图并重定向到它: ```java http.formLogin() .loginPage("/login") // 自定义登录页面路径 .defaultSuccessUrl("/", true); // ...

    Spring Security 3 源码分析文档

    8. **集成Spring MVC**:Spring Security与Spring MVC的深度整合,使得在控制器层添加安全控制变得简单。通过源码,我们可以了解它们如何无缝对接。 9. **自定义安全配置**:Spring Security允许开发者通过XML或...

    SpringSecurity素材.zip

    11. **SpringBoot集成**:SpringSecurity与SpringBoot的深度整合,使得在SpringBoot项目中启用安全功能变得更加简单快捷。 12. **自定义异常处理**:开发者可以自定义异常处理器来处理认证或授权失败时的情况,提供...

    编程不良人SpringSecurity资料学习,整合SpringBoot与Security的整合资料全网最全

    5. 登录和登出:SpringSecurity提供了默认的登录页面和逻辑,但你可以自定义登录表单和处理逻辑。登出可以通过`LogoutSuccessHandler`进行定制。 6. 静态资源处理:确保SpringSecurity不会拦截你的静态资源,如CSS...

    spring security oauth2

    在Spring Boot应用中,整合Spring Security OAuth2通常涉及到以下步骤: - 添加依赖:在`pom.xml`或`build.gradle`文件中添加Spring Security和OAuth2的相关依赖。 - 配置授权服务器:定义授权范围、令牌类型、...

    spring3中增加 spring security控制权限

    本篇文章将深入探讨如何在Spring 3中整合Spring Security来实现权限控制,以保护你的应用程序免受非法访问。 首先,我们需要理解Spring Security的核心概念。它主要由四个部分组成:认证(Authentication)、授权...

    Spring-Security-3-HelloWorld 实例简单代码

    Spring Security会自动处理登录请求,但你可以自定义登录页面和登录失败处理器。登录表单需要提交到`/login`,Spring Security将自动处理认证请求。 5. **权限授权**: 使用`@Secured`或`@PreAuthorize`注解来...

    SpringBoot+Security+Cas

    在Spring Boot项目中整合Spring Security,可以通过在`pom.xml`文件中添加依赖,然后创建一个自定义的配置类来实现。配置类通常会扩展`WebSecurityConfigurerAdapter`,覆盖其方法以定义安全规则,如哪些URL需要身份...

    Spring Security3 中文版 张卫滨 推荐

    - **添加Spring Security XML配置文件的应用到web.xml**:进一步说明如何整合Spring Security配置与应用的主要配置文件。 - **注意这些不足之处**:列举了一些常见的配置错误或陷阱,帮助开发者避免这些坑。 - **...

    spring-security-samples-contacts-2.0.4

    通过这个示例,你可以学习到Spring Security的基础用法,以及如何将其与MySQL数据库整合,为一个简单的联系人应用提供安全支持。实践中,你可以根据需要调整配置,添加更多的安全特性,如CSRF防护、XSS防护等,以...

Global site tag (gtag.js) - Google Analytics