Spring常用过滤器(Filter)-AnonymousAuthenticationFilter

AnonymousAuthenticationFilter:为未认证的用户提供匿名身份的过滤器。

1.1 功能概述:

1.1.1 在Spring Security中,AnonymousAuthenticationFilter的主要功能是为那些没有经过身份认证的用户分配一个匿名身份。这种身份通常具有较低的权限,使其能够正常访问公开的资源,而不会引发异常或错误。
1.2 工作原理:

1.2.1 当一个用户未进行登录或认证时,Spring Security默认会为该用户分配一个匿名身份。该过滤器位于Spring Security过滤器链的中间位置,通常在认证失败或用户未登录时触发。它检查SecurityContextHolder中是否存在Authentication对象,如果不存在,则创建一个匿名的Authentication对象并设置到SecurityContextHolder中。

1.2.2 具体来说,当请求经过AnonymousAuthenticationFilter时,如果该请求中没有经过身份认证的Authentication对象,则AnonymousAuthenticationFilter会为该请求生成一个匿名的Authentication对象,即AnonymousAuthenticationToken。这个特殊的Authentication对象表示该用户的身份是匿名的,但仍然有一个可追踪的身份标识。
1.3 核心代码分析:

1.3.1 doFilter方法是AnonymousAuthenticationFilter的核心入口,它会在过滤器链中被调用。以下是doFilter方法的核心代码逻辑:

java 复制代码
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
        throws IOException, ServletException {  
    // 判断当前请求是否需要为匿名用户创建身份认证信息  
    if (applyAnonymousForThisRequest((HttpServletRequest) req)) {  
        // 获取当前的安全上下文  
        Authentication existingAuth = SecurityContextHolder.getContext().getAuthentication();  
          
        // 如果当前安全上下文中没有认证实体,则为其创建一个匿名的身份认证信息  
        if (existingAuth == null || !existingAuth.isAuthenticated() || existingAuth.getName().equals(AnonymousAuthenticationToken.class.getSimpleName())) {  
            Authentication auth = createAuthentication((HttpServletRequest) req);  
            SecurityContextHolder.getContext().setAuthentication(auth);  
        }  
    }  
      
    // 继续过滤器链的下一个过滤器  
    chain.doFilter(req, res);  
}

1.3.2 createAuthentication方法用于生成一个匿名的Authentication对象,即AnonymousAuthenticationToken。以下是createAuthentication方法的核心代码逻辑:

java 复制代码
protected Authentication createAuthentication(HttpServletRequest request) {  
    // 生成一个UUID作为key  
    String key = UUID.randomUUID().toString();  
      
    // 设置匿名用户的principal,默认为"anonymousUser"  
    Object principal = getPrincipalToUse(request);  
      
    // 设置匿名用户的权限,默认为ROLE_ANONYMOUS  
    List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS");  
      
    // 创建AnonymousAuthenticationToken对象  
    AnonymousAuthenticationToken auth = new AnonymousAuthenticationToken(key, principal, authorities);  
      
    // 设置Authentication的详细信息,如远程地址和会话ID等  
    auth.setDetails(authenticationDetailsSource.buildDetails(request));  
      
    return auth;  
}

1.4 使用场景:

1.4.1 匿名用户的身份信息通常包括一个默认的用户名和一个角色。Spring Security默认给匿名用户分配的角色是ROLE_ANONYMOUS,这可以用于后续的权限控制。例如,可以在安全配置中控制匿名用户能够访问哪些资源,让匿名用户访问公共资源,而限制访问需要登录的资源。

1.4.2 可以通过Spring Security配置匿名身份的信息,例如自定义匿名用户的名称和分配的角色。例如,可以设置匿名用户的名称为"guestUser",并为其分配ROLE_GUEST角色,而不是默认的ROLE_ANONYMOUS。

1.4.3 匿名身份允许未认证的用户访问公开页面,如首页、帮助文档或登录页面等。通过检查用户的角色,可以控制匿名用户的访问权限。例如,只有已认证用户才能访问某些页面,而匿名用户则无法访问。
1.5 与其他过滤器的关系:

AnonymousAuthenticationFilter位于常用的身份认证过滤器(如UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter、RememberMeAuthenticationFilter)之后。这意味着只有在这些身份过滤器执行完毕后,SecurityContext依旧没有用户信息时,AnonymousAuthenticationFilter才会发挥作用,为用户提供一个匿名身份。

相关推荐
lichenyang45326 分钟前
为什么需要双线程通信、JavaScriptProxy 和 runJavaScript 分别干什么
前端
以和为贵35 分钟前
前端也能搞懂 RAG:用 JS 手写一条最小检索增强链路
前端·人工智能·面试
风止何安啊41 分钟前
网课倍速痛点解决:一套前端代码实现自由控速播放器
前端·javascript·node.js
张不才1 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
牧艺1 小时前
用 Next.js + React Three Fiber 打造 3D 快递仓储可视化
前端·three.js
锋行天下2 小时前
如何用Vite实现Vue组件的按需打包和远程加载
前端·vue.js·前端框架
光影少年2 小时前
原生DOM操作在React 中的注意事项
前端·javascript·react.js
shepherd1112 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
禅思院4 小时前
前端部署“三层漏斗”完全指南:从CI/CD到自动回滚的工程化实战【开题】
前端·架构·前端框架
快乐肚皮5 小时前
深入理解Loop Engineering
前端·后端