首页 > 图灵资讯 > 技术篇>正文
Spring Security 的身份验证和授权流程是如何工作的?
2024-04-19 13:45:35
spring security 提供身份验证和授权机制,包括:身份验证:使用身份验证提供商检查用户凭证的有效性,如使用用户名、密码或 ldap 认证。授权:使用访问决策管理器比较用户权限和请求 url,是否授予访问权限取决于访问决策,例如 affirmativebased(允许访问任何匹配的角色)或 consensusbased(允许访问所有匹配的角色)。实战案例:rbac(基于角色的访问控制):使用 userdetailsservice 定义角色,使用 rolehierarchyvoter 构建角色层次结构,并使用它 affirmativebased 授权访问决策管理器。
Spring Security 身份验证和授权流程
身份验证
Spring Security 通过身份验证提供者进行身份验证,如:
- UsernamePasswordAuthenticationProvider(用户名和密码身份验证)
- UserDetailsService(使用自定义逻辑验证用户)
- LDAPAuthenticationProvider(通过 LDAP 身份验证)
- 包括用户名和密码在内的客户端向认证服务器发送认证请求。
- 认证服务器将凭证交给相关身份验证提供商。
- 身份验证提供者检查证书的有效性,并返回身份验证后的证书 UserDetails 对象。
授权
身份验证成功后,Spring Security 通过访问决策管理器授权,包括:
- AccessDecisionManager(确定是否授予访问权限)
- AffirmativeBased(任何一个 Role 允许访问匹配)
- ConsensusBased(所有 Role 匹配可以允许访问)
授权流程:
- 检索认证服务器 UserDetails 对象中的权限。
- 访问决策管理器比较用户权限和请求 URL。
- 根据访问决策,决定是否授予访问权限。
实战案例:基于角色的访问控制
基于角色的访问控制 (RBAC) 在场景中,可以使用以下步骤 Spring Security 进行授权:
- 定义一个 UserDetailsService,该服务在给定用户名后返回合适的角色 UserDetails。
- 配置 RoleHierarchyVoter 为了建立角色层次结构。
- 配置 AffirmativeBased 访问决策管理器。
配置
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) { auth.userDetailsService(userDetailsService()); } @Override protected void configure(HttpSecurity http) { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ROLE_ADMIN") .antMatchers("/user/**").hasRole("ROLE_USER") .anyRequest().permitAll(); } }
登录后复制
UserDetailsService
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) { User user = userRepository.findByUsername(username); return new UserDetailsAdapter(user); } }
登录后复制
UserDetailsAdapter
public class UserDetailsAdapter implements UserDetails { private final User user; public UserDetailsAdapter(User user) { this.user = user; } // ... UserDetails implementation methods ... }
登录后复制
以上是Spring Security 身份验证和授权过程是如何工作的?详情请关注图灵教育其他相关文章!