AuthenticatedAuthorizationManager 类基于用户认证状态进行授权决策。如当前用户是否匿名、是否通过完整认证(即用户名/密码登陆)、是否通过“记住我”认证),适用于需要区分不同登录级别访问权限的场景。
AuthenticatedAuthorizationManager 类提供的核心方法如下:
authenticated() 允许所有认证用户访问,包括:完整认证用户(通过用户名 / 密码等常规方式登录)、记住我认证用户。但是,会拒绝匿名用户(未认证的用户)。
fullyAuthenticated() 仅允许完整认证的用户进行访问,即通过用户名 / 密码、OAuth2 等主动登录流程认证的用户。会拒绝匿名用户和记住我的认证用户。
anonymous() 仅允许匿名用户访问,即未进行任何认证的用户。拒绝所有已认证用户(包括完整认证和“记住我”认证用户)。
rememberMe() 允许“记住我”和完整认证的用户访问,但逻辑更倾向于“记住我”场景。
package org.springframework.security.authorization; import java.util.function.Supplier; import org.springframework.security.authentication.AuthenticationTrustResolver; import org.springframework.security.authentication.AuthenticationTrustResolverImpl; import org.springframework.security.core.Authentication; import org.springframework.util.Assert; public final class AuthenticatedAuthorizationManager<T> implements AuthorizationManager<T> { private final AbstractAuthorizationStrategy authorizationStrategy; //... /** * 创建 AuthenticatedAuthorizationManager 的实例。 */ public static <T> AuthenticatedAuthorizationManager<T> authenticated() { return new AuthenticatedAuthorizationManager<>(); } /** * 创建 AuthenticatedAuthorizationManager 的一个实例,用于确定是否在不使用记住我的情况下进行身份验证。 */ public static <T> AuthenticatedAuthorizationManager<T> fullyAuthenticated() { return new AuthenticatedAuthorizationManager<>(new FullyAuthenticatedAuthorizationStrategy()); } /** * 创建 AuthenticatedAuthorizationManager 的实例,该实例可确定身份验证是否使用 “记住我 ”进行验证。 */ public static <T> AuthenticatedAuthorizationManager<T> rememberMe() { return new AuthenticatedAuthorizationManager<>(new RememberMeAuthorizationStrategy()); } /** * 创建 AuthenticatedAuthorizationManager 的实例,用于确定 Authentication 是否匿名。 */ public static <T> AuthenticatedAuthorizationManager<T> anonymous() { return new AuthenticatedAuthorizationManager<>(new AnonymousAuthorizationStrategy()); } /** * 根据给定的策略确定当前用户是否获得授权。 * @param authentication the {@link Supplier} of the {@link Authentication} to check * @param object the {@link T} object to check * @return an {@link AuthorizationDecision} */ @Override public AuthorizationDecision check(Supplier<Authentication> authentication, T object) { // 调用 AbstractAuthorizationStrategy 类的 isGranted() 方法 boolean granted = this.authorizationStrategy.isGranted(authentication.get()); return new AuthorizationDecision(granted); } //... }
AbstractAuthorizationStrategy 类的 isGranted() 方法,源码如下:
private static class AuthenticatedAuthorizationStrategy extends AbstractAuthorizationStrategy { @Override boolean isGranted(Authentication authentication) { return this.trustResolver.isAuthenticated(authentication); } }
AuthenticationTrustResolver 接口 isAuthenticated() 方法,源码如下:
/** * 检查 Authentication 是否为空值、已验证且非匿名。 * @param authentication the {@link Authentication} to check. * @return true if the {@link Authentication} is not null, * {@link #isAnonymous(Authentication)} returns false, & * {@link Authentication#isAuthenticated()} is true. * @since 6.1.7 */ default boolean isAuthenticated(Authentication authentication) { return authentication != null && authentication.isAuthenticated() && !isAnonymous(authentication); }
通过静态方法,创建 AuthenticatedAuthorizationManager 类的示例,如下:
// 验证用户是否已认证(包括记住我用户) AuthenticatedAuthorizationManager.authenticated(); // 验证用户是否为完全认证(非记住我用户) AuthenticatedAuthorizationManager.fullyAuthenticated(); // 验证用户是否通过记住我功能认证 AuthenticatedAuthorizationManager.rememberMe(); // 验证用户是否为匿名用户 AuthenticatedAuthorizationManager.anonymous();
在 access() 方法中通过 AuthenticatedAuthorizationManager 类进行配置,如下:
http.authorizeHttpRequests(authorize -> authorize // 允许匿名访问 /sys 路径 .requestMatchers("/sys/**").access(AuthenticatedAuthorizationManager.anonymous()) .anyRequest().authenticated() // 其他请求需认证 )