SpringSecurity------ Username/Password Authentication(九)

用户名和密码的获取方式

最常见的用户身份认证就是使用用户名密码,Spring Security为使用用户名和密码进行身份验证提供了全面的支持。 Spring Security提供了以下内置机制来从HttpServletRequest读取用户名和密码

1、表单登录(Form Login)

loginurlauthenticationentrypoint
(1)在未经过认证的情况下向/private发送了一个请求

(2)FilterSecurityInterceptor通过抛出AccessDeniedException异常通知应用程序拒绝未经身份验证的请求

(3)由于检测到用户没有经过身份认证,ExceptionTranslationFilter会启动身份验证机制,并且通过LoginUrlAuthenticationEntryPoint通知客户端

(4)客户端会向服务端通过/login请求登录

(5)服务端向客户端提供登录页面数据

当用户提交了用户名和密码之后,UsernamePasswordAuthenticationFilter会对用户名和密码进行验证

usernamepasswordauthenticationfilter
(1)当用户提交用户名和密码后,UsernamePasswordAuthenticationFilter会从HttpServletRequest中获取到用户提交的用户名和密码信息,然后使用这些信息创建一个UsernamePasswordAuthenticationToken(Authentication类型)。

(2)UsernamePasswordAuthenticationToken会被传递到AuthenticationManager中进行身份验证。

(3)如果鉴权失败

  • 清除SecurityContextHolder
  • 执行RememberMeServices.loginFail,如果没有配置remember-me,则不执行
  • AuthenticationFailureHandler执行

(4)如果认证成功

  • 通知SessionAuthenticationStrategy有一个新的登录用户
  • 将Authentication设置到SecurityContextHolder
  • 执行RememberMeServices.loginSuccess,如果没有配置remember-me,则不执行
  • ApplicationEventPublisher发布InteractiveAuthenticationSuccessEvent事件
  • AuthenticationSuccessHandler执行。通常这里是一个SimpleUrlAuthenticationSuccessHandler 的实例,可以在登录成功后将用户引导到先前访问的页面

2、基础认证(Basic Authentication)

basicauthenticationentrypoint
(1)在未经过认证的情况下向/private发送了一个请求

(2)FilterSecurityInterceptor通过抛出AccessDeniedException异常通知应用程序拒绝未经身份验证的请求

(3)ExceptionTranslationFilter会启动身份验证机制,并且通过BasicAuthenticationEntryPoint添加WWW-Authenticate响应头通知客户端

当客户端收到WWW-Authenticate报头时,会提示用户进行登录
basicauthenticationfilter
(1)当用户提交用户名和密码后,UsernamePasswordAuthenticationFilter会从HttpServletRequest中获取到用户提交的用户名和密码信息,然后使用这些信息创建一个UsernamePasswordAuthenticationToken(Authentication类型)。

(2)UsernamePasswordAuthenticationToken会被传递到AuthenticationManager中进行身份验证。

(3)如果鉴权失败

  • 清除SecurityContextHolder
  • 执行RememberMeServices.loginFail,如果没有配置remember-me,则不执行
  • AuthenticationEntryPoint 会继续发送WWW-Authenticate到客户端

(4)如果认证成功

  • 将Authentication设置到SecurityContextHolder
  • 执行RememberMeServices.loginSuccess,如果没有配置remember-me,则不执行
  • BasicAuthenticationFilter通过FilterChain.doFilter(request,response)执行应用程序的后续任务

3、摘要认证(Digest Authentication)

简单介绍以下使用配置,这个不建议使用

@Autowired
UserDetailsService userDetailsService;

DigestAuthenticationEntryPoint entryPoint() {
	DigestAuthenticationEntryPoint result = new DigestAuthenticationEntryPoint();
	result.setRealmName("My App Relam");
	result.setKey("3028472b-da34-4501-bfd8-a355c42bdf92");
}

DigestAuthenticationFilter digestAuthenticationFilter() {
	DigestAuthenticationFilter result = new DigestAuthenticationFilter();
	result.setUserDetailsService(userDetailsService);
	result.setAuthenticationEntryPoint(entryPoint());
}

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
	http
		// ...
		.exceptionHandling(e -> e.authenticationEntryPoint(authenticationEntryPoint()))
		.addFilterBefore(digestFilter());
	return http.build();
}
在Spring Security中,可以使用多个authentication-provider来支持不同类型的身份验证。为了通过XML配置多个authentication-provider,需要按照以下步骤进行操作: 1. 在Spring Security配置文件中定义多个authentication-provider元素,并设置它们的属性子元素,如下所示: ``` <authentication-manager> <authentication-provider user-service-ref="userDetailsService1" /> <authentication-provider user-service-ref="userDetailsService2" /> </authentication-manager> ``` 其中,user-service-ref属性指定要使用的UserDetailsService实现的bean名称。 2. 配置每个UserDetailsService bean,以便它将验证请求委托给适当的身份验证提供程序。例如,下面是一个UserDetailsService bean的示例: ``` <bean id="userDetailsService1" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <property name="dataSource" ref="dataSource1" /> <property name="usersByUsernameQuery" value="SELECT username,password,enabled FROM users WHERE username=?" /> <property name="authoritiesByUsernameQuery" value="SELECT username, authority FROM authorities WHERE username=?" /> </bean> ``` 3. 如果需要,可以配置每个authentication-provider的authentication-event-listener元素,以便在验证过程中捕获处理特定事件。例如,下面是一个authentication-event-listener元素的示例: ``` <authentication-provider user-service-ref="userDetailsService1"> <authentication-event-listener ref="myAuthenticationListener" /> </authentication-provider> ``` 4. 最后,可以使用Spring Security的全局配置元素,如global-method-securityintercept-url,来定义更高级的安全控制。 总之,通过XML配置多个authentication-provider是通过配置多个authentication-provider元素,并将它们的属性子元素与适当的UserDetailsService bean关联来实现的。这允许Spring Security支持多种身份验证方法,并为每种身份验证方法提供自定义配置事件处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豢龙先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值