主要就是一些拦截器链,@PreAuthorize,@PreFilter,@PostAuthorize和@PostFilter
认证AuthenticationManager
基于列表的ProviderManager实现,每个处理器都有机会处理验证成功或失败
AuthenticationProvider获取适配的处理器
鉴权AccessDecisionManager
基于投票的 AccessDecisionManager 实现,投票决策管理器AccessDecisionVoter
基本实现:
RoleVoter投票ROLE_开头的权限
AuthenticatedVoter用于区分匿名、完全身份验证和记住我身份验证的用户
RoleHierarchyVoter层级角色,允许您配置哪些角色admin(或权限)应该包括其他角色user(或权限)
AfterInvocationManager
调用后处理,修改安全对象调用实际返回的对象的方法
acl(域对象)访问控制列表
可以使用PermissionEvaluator接口 基于表达式的访问控制 hasPermission(target, permission)
boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission);第一种用于访问被控制的域对象已经加载的情况。
boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission);第二个版本用于未加载对象但其标识符已知的情况。
旨在表达式系统和 Spring Security 的 ACL 系统之间架起桥梁,允许您根据抽象权限指定对域对象的授权约束。它对 ACL 模块没有显式依赖,因此您可以根据需要将其替换为替代实现。
在spring-security-acl.jar里有建表语句,可以开箱即用AclService,AclEntryVoter等类
oauth2协议资源服务器和资源授权服务器
有两个项目,spring-security-oauth2和spring-security项目下的oauth2模块,目前spring把功能都迁移到spring-security了,推荐使用spring-security。
spring-security的oauth2.0 客户端支持是通过oauth2Client() DSL(配置,fromLogin那里)方法实现的。资源服务器支持是通过 oauth2ResourceServer() DSL实现的,并且提供了一个OAuth2AuthorizedClientService开箱即用的类。授权服务器目前security还没有集成oauth2.0的,所以只能先用oauth2.0的,使用@EnableAuthorizationServer注解
提供了@RegisteredOAuth2AuthorizedClient注解,将授权的客户端存储在自己的OAuth2AuthorizedClientRepository。
ClientRegistrationRepository来表示客户端,可以通过 Spring Security DSL 提供。或者,这些也可以通过 Spring Boot 进行配置。
可以定义多个SecurityFilterChain,根据matches请求走不同的过滤器链
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SecurityFilterChain systemSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
.authorizationEndpoint(config->{
OAuth2AuthorizationEndpointConfigurer configurer = (OAuth2AuthorizationEndpointConfigurer) config;
});
return http.build();
}
@Bean
public SecurityFilterChain clientSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.requestMatchers(requestMatchers).permitAll()
.anyRequest().denyAll().and()
.formLogin().and();
return http.build();
}