wordpress充值会员,重庆企业网站seo,做网站需要会什么语言,最新企业网站系统一、Spring Boot集成Spring Security专栏
一、Spring Boot集成Spring Security之自动装配
二、Spring Boot集成Spring Security之实现原理
三、Spring Boot集成Spring Security之过滤器链详解
四、Spring Boot集成Spring Security之认证流程
五、Spring Boot集成Spring Se…一、Spring Boot集成Spring Security专栏
一、Spring Boot集成Spring Security之自动装配
二、Spring Boot集成Spring Security之实现原理
三、Spring Boot集成Spring Security之过滤器链详解
四、Spring Boot集成Spring Security之认证流程
五、Spring Boot集成Spring Security之认证流程2
二、概要说明
上文已详细介绍了四、Spring Boot集成Spring Security之认证流程本文则着重介绍用户名密码认证过滤器UsernamePasswordAuthenticationFilter的实现原理过程认证管理器authenticationManager认证提供者AuthenticationProvider自定义配置用户名密码实现UserDetailsService
三、UsernamePasswordAuthenticationFilter
1、结构及作用
继承AbstractAuthenticationProcessingFilter 初始化请求地址初始化authenticationManager初始化successHandler初始化failureHandler实现过滤器入口doFilter方法doFilter方法调用抽象方法attemptAuthenticationattemptAuthentication供子类实现完成用户名密码验证业务认证成功时更新安全上下文并调用successHandler.onAuthenticationSuccess认证失败时删除安全上下文并调用failureHandler.onAuthenticationFailure 实现attemptAuthentication方法 从请求中获取用户名密码生成未认证的Authentication调用authenticationManager的authenticate方法完成用户名密码验证 四、认证管理器AuthenticationManager
1、作用
完成Authentication的认证
2、ProviderManager默认实现
ProviderManager实现AuthenticationManager接口AuthenticationManager的作用的是完成Authentication的认证但是ProviderManager并未直接完成Authentication的认证而是提供一个AuthenticationProvider集合遍历AuthenticationProvider集合来完成Authentication的认证当需要多种认证方式时可以注册自定义的AuthenticationProvider后续介绍注册方式 五、AuthenticationProvider
1、作用
调用接口获取用户信息UserDetails验证用户及密码是否可用
2、DaoAuthenticationProvider默认实现
DaoAuthenticationProvider继承AbstractUserDetailsAuthenticationProvider实现AuthenticationProvider接口调用retrieveUser方法获取用户信息UserDetails 调用userDetailsService.loadUserByUsername获取用户信息UserDetails 验证用户是否存在并可用不存在或者不可用时抛异常过期、锁定、启用验证密码是否可用不可用时抛异常为空、过期使用密码加密器校验密码界面输入的密码和数据库已加密的密码密码不一致时抛异常 六、UserDetailsService
1、作用
通过用户名username获取用户信息UserDetails返回用户信息UserDetails
2、InMemoryUserDetailsManager默认实现
项目启动时会默认生成一个用户名密码存在内存中通过用户名获取该用户并返回
3、推荐实现自定义UserDetailsService
通过用户名从数据库中获取到用户数据库用户转为UserDetails数据库中未设置的属性像是否启用、账号未过期、密码未过期、账号未锁定直接设置为true即可
package com.yu.demo.service.impl;import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;Service
public class UserDetailsServiceImpl implements UserDetailsService {//Autowired//private UserService userService;Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//TODO 通过username从数据库中获取用户将用户转UserDetails//User user userService.getByUsername(username);//return new User(username, user.getPassword(), user.getEnable(), user.getAccountNonExpired(), user.getCredentialsNonExpired(), user.getAccountNonLocked(), user.getAuthorities());//{noop}不使用密码加密器密码123的都可以验证成功return new User(username, {noop}123, true, true, true, true, AuthorityUtils.NO_AUTHORITIES);}
}