`
m635674608
  • 浏览: 5028965 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

UsernamePasswordAuthenticationFilter

 
阅读更多

springSecurity的登录验证是由org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter这个过滤器来完成的,在该类的父类AbstractAuthenticationProcessingFilter中有一个AuthenticationManager接口属性,验证工作主如果经由过程这个AuthenticationManager接口的实例来完成的。在默认景象下,springSecurity框架会把org.springframework.security.authentication.ProviderManager类的实例注入到该属性,


AuthenticationManager接口的相干类图如下:



UsernamePasswordAuthenticationFilter的验证过程如下:


1. 起首过滤器会调用自身的attemptAuthentication办法,从request中取出authentication, authentication是在org.springframework.security.web.context.SecurityContextPersistenceFilter过滤器中经由过程捕获用户提交的登录表单中的内容生成的一个org.springframework.security.core.Authentication接话柄例.


2. 拿到authentication对象后,过滤器会调用ProviderManager类的authenticate办法,并传入该对象


3.ProviderManager类的authenticate办法再调用自身的doAuthentication办法,在doAuthentication办法中会调用类中的List<AuthenticationProvider> providers凑集中的各个AuthenticationProvider接话柄现类中的authenticate(Authentication authentication)办法进行验证,由此可见,真正的验证逻辑是由各个各个AuthenticationProvider接话柄现类来完成的,DaoAuthenticationProvider类是默认景象****入的一个AuthenticationProvider接话柄现类


4.AuthenticationProvider接口经由过程UserDetailsService来获取用户信息


以下为时序图:


 

 

 

 

处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。

默认情况下只处理/j_spring_security_check请求,这个请求应该是用户使用form登陆后的提交地址,form所需的其他参数可以参考:

 

 

此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面。

 

<form action="${pageContext.request.contextPath}/j_spring_security_check" style="width:260px;text-align:center;">
  <fieldset>
    <legend>登陆</legend>
    用户: <input type="text" name="j_username" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br />
    密码: <input type="password" name="j_password" style="width:150px;" /><br />
    <input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br />
    <input type="submit" value="登陆"/>
    <input type="reset" value="重置"/>
  </fieldset>
</form>

 

源码:dofilter方法源码

  

public void doFilter(ServletRequest req, ServletResponse res, 

FilterChain chain)
/*     */     throws IOException, ServletException
/*     */   {
/* 184 */     HttpServletRequest request = (HttpServletRequest)req;
/* 185 */     HttpServletResponse response = (HttpServletResponse)res;
/* 187 */     if (!requiresAuthentication(request, response)) {
/* 188 */       chain.doFilter(request, response);
/*     */ 
/* 190 */       return;
/*     */     }
/*     */ 
/* 193 */     if (this.logger.isDebugEnabled()) {
/* 194 */       this.logger.debug("Request is to process 

authentication");
/*     */     }
/*     */     Authentication authResult;
/*     */     try
/*     */     {
/* 200 */       authResult = attemptAuthentication(request, response);
/* 201 */       if (authResult == null)
/*     */       {
/* 203 */         return;
/*     */       }
/* 205 */       this.sessionStrategy.onAuthentication(authResult, 

request, response);
/*     */     }
/*     */     catch (AuthenticationException failed)
/*     */     {
/* 209 */       unsuccessfulAuthentication(request, response, failed);
/*     */ 
/* 211 */       return;
/*     */     }
 

 

 

 protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response)
/*     */   {
/* 235 */     String uri = request.getRequestURI();
/* 236 */     int pathParamIndex = uri.indexOf(';');
/*     */ 
/* 238 */     if (pathParamIndex > 0)
/*     */     {
/* 240 */       uri = uri.substring(0, pathParamIndex);
/*     */     }
/*     */ 
/* 243 */     if ("".equals(request.getContextPath())) {
/* 244 */       return uri.endsWith(this.filterProcessesUrl);
/*     */     }
/*     */ 
/* 247 */     return uri.endsWith(request.getContextPath() + this.filterProcessesUrl);
/*     */   }

 如果请求url 的路径是j_spring_security_check 则检测

 

 

 

/j_spring_security_check,提交登陆信息的URL地址。

自定义form时,要把form的action设置为/j_spring_security_check。注意这里要使用绝对路径,避免登陆页面存放的页面可能带来的问题。

 

j_username,输入登陆名的参数名称。

 

j_password,输入密码的参数名称

 

_spring_security_remember_me,选择是否允许自动登录的参数名称。

可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中。

分享到:
评论

相关推荐

    SpringSecurity登录认证流程

    对于登录认证,最重要的过滤器是 UsernamePasswordAuthenticationFilter。它会拦截登录请求,并处理用户凭证的认证。 3. 认证管理器 在 UsernamePasswordAuthenticationFilter 中,收到请求后,Spring Security 会...

    Spring Security实现用户登录.docx

    在Spring Security配置中,`UsernamePasswordAuthenticationFilter`通常位于一系列过滤器之后,如`CsrfFilter`和`LogoutFilter`。它们共同协作,确保安全控制的完整性和有效性。 通过理解`...

    SpringBoot-登录认证-黑马程序员学习笔记

    接下来,Spring Security会自动配置一个默认的安全过滤链,其中包括`UsernamePasswordAuthenticationFilter`,用于处理基于表单的登录。如果需要自定义登录逻辑,可以创建一个继承自`WebSecurityConfigurerAdapter`...

    Spring Security3 安全 个人总结

    * UsernamePasswordAuthenticationFilter:完成认证处理,并把认证通过的实体保存到 SecurityContext 中 * FilterSecurityInterceptor:完成授权处理 认证授权流程 Spring Security3 的认证授权流程可以分为以下...

    spring security 认证授权实现

    **Spring Security 认证授权实现** Spring Security 是一个强大的、高度可配置的安全框架,用于Java应用程序,它提供了全面的身份验证和授权服务。在本项目中,我们关注的是如何利用Spring Security来实现用户认证...

    Spring security 4.0

    主要包括`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextPersistenceFilter`、`ConcurrentSessionFilter`、`UsernamePasswordAuthenticationFilter`、`BasicAuthenticationFilter`、`...

    spring mvc 和spring security自定义登录

    FilterSecurityInterceptor会检查URL权限,而UsernamePasswordAuthenticationFilter则处理登录表单提交,将用户的登录信息转换为Authentication对象。 在Spring MVC中,我们可以创建一个登录页面(如login.html),...

    springSecurity 实现传参

    4. **处理登录成功**:在`UsernamePasswordAuthenticationFilter`中,你可以覆盖`onAuthenticationSuccess`方法,此方法会在用户成功登录后调用。在这里,你可以获取存储的URL,并将用户重定向回去。 5. **数据库...

    spring security 源码

    - **认证**:当请求到达时,`AuthenticationEntryPoint`开始处理,接着是`UsernamePasswordAuthenticationFilter`,它尝试从请求中获取凭证并进行认证。如果认证成功,会将`Authentication`对象放入`...

    custom login

    - **实现自定义登录逻辑**:创建一个继承自`UsernamePasswordAuthenticationFilter`的类,覆盖`attemptAuthentication`方法,实现自定义的登录验证。这里可以连接到数据库,查询用户信息,进行密码哈希比较等。 - *...

    单点登录SSO解决方案之SpringSecurity+JWT实现.docx

    - **用户认证**:对于前后端分离的应用程序,需要对`UsernamePasswordAuthenticationFilter`进行扩展,以便能够处理POST请求体中的登录信息。此外,还需要修改默认的行为,使其在认证成功后生成JWT并将其发送回...

    SpringSecurity安全框架基础Demo

    这个链中包含如`ChannelProcessingFilter`(处理SSL/TLS)、`SecurityContextPersistenceFilter`(维护会话中的安全上下文)、`ConcurrentSessionFilter`(管理并发会话)、`UsernamePasswordAuthenticationFilter`...

    spring-security3入门教程

    - **过滤器链**:Spring Security 使用一系列预定义的过滤器,如 ChannelProcessingFilter、SecurityContextPersistenceFilter、LogoutFilter 和 UsernamePasswordAuthenticationFilter,它们在请求处理过程中拦截...

    关于ip的过滤器 spring security例子

    .addFilterBefore(new IPFilter(), UsernamePasswordAuthenticationFilter.class); // 在UsernamePasswordAuthenticationFilter之前添加IP过滤器 } } ``` 在实际应用中,你可能还需要考虑以下几点: 1. **异常...

    spring security 配置(含源码)

    5. **过滤器链**:Spring Security的工作主要是通过一系列过滤器完成的,如`UsernamePasswordAuthenticationFilter`负责处理登录请求,`AnonymousAuthenticationFilter`为未认证用户提供匿名身份等。我们可以自定义...

    spring-security-web源码所需jar包

    Spring Security通过过滤器链来实现安全控制,这些过滤器包括但不限于:`DelegatingRequestMatcherFilter`,`SecurityContextPersistenceFilter`,`LogoutFilter`,`UsernamePasswordAuthenticationFilter`等。...

    01_Spring Security基本使用和配置.rar

    Spring Security通过定义一系列的安全过滤器(如:UsernamePasswordAuthenticationFilter、AnonymousAuthenticationFilter等)来拦截HTTP请求,从而实现对用户身份的验证和授权。 **认证过程**: 1. 用户尝试访问受...

    spring security 4 小例子带自定义过滤器

    在这个配置中,`customAuthenticationFilter`被添加到过滤器链中,且位于`UsernamePasswordAuthenticationFilter`之前。这意味着在Spring Security的默认认证流程开始前,我们的自定义过滤器将先执行。 3. **集成...

    pringsecurity自定义登录页面共2页.pdf.z

    Spring Security 提供了一个`UsernamePasswordAuthenticationFilter`,默认处理POST到"/login"的请求。如果你使用了自定义登录页面,需要确保这个过滤器被正确配置。你可能需要扩展这个过滤器或者创建一个新的过滤器...

    基于SpringBoot+SpringSecurity等的第三方登录(微信QQ)和安全认证框架.zip

    接下来,为了实现安全认证,我们需要设置SpringSecurity的过滤链,包括UsernamePasswordAuthenticationFilter、OAuth2AuthenticationProcessingFilter等,确保用户的身份得到正确验证。同时,还需要配置...

Global site tag (gtag.js) - Google Analytics