介绍
Spring Security OAuth2 使用用户名和密码进行授权被称为"密码授权模式"(Password Grant),它允许用户通过直接提供其用户名和密码来获取访问令牌(access token)。这种方式通常用于受信任且高度安全的应用程序,例如原生移动应用程序。
Git地址:yunfeng-boot3-sercurity: Spring Security OAuth2 统一登录(密码模式)
版本
SpringBoot 2.5.6
其他参考
这个是关于Spring Security OAuth2授权码模式的参考,非常简单,易于理解。
重要角色
- AuthenticationManager:顶级认证管理器
- ProviderManager:是AuthenticationManager实现类,管理和执行一组认证提供者(AuthenticationProvider).
- AuthenticationProvider: 认证提供者,执行身份验证的操作。通过实现其中的 authenticate(Authentication authentication) 方法,你可以自定义身份验证逻辑。
- UserDetailsService: 用户详细信息服务。 通过实现其接口,可以从数据库加载用户信息,并返回一个UserDetails对象。
- UsernamePasswordAuthenticationFilter 是 Spring Security 提供的一个过滤器,用于处理基于用户名和密码的身份验证请求
核心流程
- UsernamePasswordAuthenticationFilter 入口
- 委托具体的ProviderManager -> 具体的UserDetailsService -> 数据库校验
核心配置
根据以上流程,要实现用户名和密码的校验逻辑,需要配置和实现自定义的认证管理、认证提供者和用户详细信息服务。
- 自定义的认证管理器,注入Bean到容器中。
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* password 密码模式需要在认证服务器中设置 中配置AuthenticationManager
*/
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- 自定义用户详细信息,实现从数据库中获取用户信息
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Resource
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
String password = passwordEncoder.encode("123456");
System.out.println(password);
return new User("admin", password,
AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
- 把自定义的认证管理器和用户详细信息服务,配置到认证服务适配器的端点设置中。
/**
* 该方法用于配置授权服务器的端点(endpoints)。你可以设置令牌存储方式、指定认证管理器、用户详细信息服务、令牌生成和解析的方式等。
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
RedisTokenStore tokenStore = new RedisTokenStore(redisConnectionFactory);
tokenStore.setPrefix(TOKEN_STORE_PREFIX);
endpoints.tokenStore(tokenStore)
.authenticationManager(authenticationManager) //配置认证管理器
.userDetailsService(userDetailsService); //配置用户详细服务
}
发送请求
oauth/token 是Spring Security的内置请求地址。按照如下方式进行请求发送。