Spring Security(11)——匿名认证

本文深入探讨Spring Security中关于匿名认证的配置、原理及其实现细节,包括如何启用或禁用匿名认证、相关类的作用及其配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

匿名认证

目录

1.1     配置

1.2     AuthenticationTrustResolver

 

       对于匿名访问的用户,Spring Security支持为其建立一个匿名的AnonymousAuthenticationToken存放在SecurityContextHolder中,这就是所谓的匿名认证。这样在以后进行权限认证或者做其它操作时我们就不需要再判断SecurityContextHolder中持有的Authentication对象是否为null了,而直接把它当做一个正常的Authentication进行使用就OK了。

 

1.1     配置

       使用NameSpace时,http元素的使用默认就会启用对匿名认证的支持,不过我们也可以通过设置http元素下的anonymous元素的enabled属性为false停用对匿名认证的支持。以下是anonymous元素可以配置的属性,以及它们的默认值。

      <security:anonymous enabled="true" key="doesNotMatter" username="anonymousUser" granted-authority="ROLE_ANONYMOUS"/>

 

       key用于指定一个在AuthenticationFilterAuthenticationProvider之间共享的值。username用于指定匿名用户所对应的用户名,granted-authority用于指定匿名用户所具有的权限。

       与匿名认证相关的类有三个,AnonymousAuthenticationToken将作为一个Authentication的实例存放在SecurityContextHolder中;过滤器运行到AnonymousAuthenticationFilter时,如果SecurityContextHolder中持有的Authentication还是空的,则AnonymousAuthenticationFilter将创建一个AnonymousAuthenticationToken并存放在SecurityContextHolder中。最后一个相关的类是AnonymousAuthenticationProvider,其会添加到ProviderManagerAuthenticationProvider列表中,以支持对AnonymousAuthenticationToken的认证。AnonymousAuthenticationToken的认证是在AbstractSecurityInterceptor中的beforeInvocation()方法中进行的。使用http元素定义时这些bean都是会自动定义和添加的。如果需要手动定义这些bean的话,那么可以如下定义:

   <bean id="anonymousAuthFilter"

   class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">

      <property name="key" value="doesNotMatter" />

      <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />

   </bean>

 

   <bean id="anonymousAuthenticationProvider"

   class="org.springframework.security.authentication.AnonymousAuthenticationProvider">

      <property name="key" value="doesNotMatter" />

   </bean>

 

       key是在AnonymousAuthenticationProviderAnonymousAuthenticationFilter之间共享的,它们必须保持一致,AnonymousAuthenticationProvider将使用本身拥有的key与传入的AnonymousAuthenticationTokenkey作比较,相同则认为可以进行认证,否则将抛出异常BadCredentialsExceptionuserAttribute属性是以usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority]的形式进行定义的。

 

1.2     AuthenticationTrustResolver

       AuthenticationTrustResolver是一个接口,其中定义有两个方法,isAnonymous()isRememberMe(),它们都接收一个Authentication对象作为参数。它有一个默认实现类AuthenticationTrustResolverImplSpring Security就是使用它来判断一个SecurityContextHolder持有的Authentication是否AnonymousAuthenticationTokenRememberMeAuthenticationToken。如当ExceptionTranslationFilter捕获到一个AccessDecisionManager后就会使用它来判断当前Authentication对象是否为一个AnonymousAuthenticationToken,如果是则交由AuthenticationEntryPoint处理,否则将返回403错误码。

 

(注:本文是基于Spring Security3.1.6所写)

(注:原创文章,转载请注明出处。原文地址:http://elim.iteye.com/blog/2163041

 

 

### Spring Security 工作原理及实现机制 #### 一、Spring Security 的核心架构 Spring Security 的核心是基于 **Servlet 过滤器链** 构建的。它通过一系列过滤器(`SecurityFilterChain`),按预定顺序拦截并处理 HTTP 请求,从而提供安全性功能[^2]。 这些过滤器的主要职责包括但不限于: - **身份验证(Authentication)**: 验证用户的身份。 - **授权(Authorization)**: 确定已认证用户是否有权访问某个资源。 - **会话管理(Session Management)**: 控制用户的会话生命周期。 - **跨站请求伪造防护(CSRF Protection)**: 提供针对 CSRF 攻击的安全措施。 - **记住我(Remember-Me)**: 实现自动登录的功能[^3]。 #### 二、Spring Security 的主要组件及其作用 以下是 Spring Security 中的关键组成部分: 1. **WebSecurityConfigurerAdapter** - 用户可以通过自定义 `WebSecurityConfigurerAdapter` 类来配置安全策略。例如,在配置类中指定密码编码方式以及启用某些特性[^1]。 ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/public/**").permitAll() // 允许匿名访问公共路径 .anyRequest().authenticated(); // 所有其他请求都需要认证 http.formLogin(); // 启用表单登录 } } ``` 2. **SecurityFilterChain** - 它是一组按照固定顺序执行的过滤器集合。每个过滤器专注于完成某项具体任务。例如,`UsernamePasswordAuthenticationFilter` 处理基于用户名和密码的登录请求;`AnonymousAuthenticationFilter` 则用于未登录状态下的匿名用户支持[^5]。 3. **AuthenticationManager 和 AuthenticationProvider** - 认证过程由 `AuthenticationManager` 协调完成。它可以委托给多个 `AuthenticationProvider` 来验证不同类型的凭证(如数据库中的用户记录或 LDAP 服务)。如果任意一个 provider 成功返回,则认为整个认证成功[^2]。 4. **AccessDecisionManager** - 授权决策由 `AccessDecisionManager` 负责实施。此管理者依据角色权限判断当前主体是否被允许执行操作或者访问受保护的对象。 5. **Remember Me 功能** - 当启用了 “记住我” 特性后,即使浏览器关闭后再重新打开页面也能保持登录状态。这是由于系统会在客户端存储加密后的 token 数据作为标识符,并在下次加载网页时尝试解析该令牌恢复之前的 session[^3][^5]。 6. **异常处理器 (ExceptionTranslationFilter)** - 此过滤器捕获来自下游过滤器抛出的各种安全相关异常事件(比如 AccessDeniedException 或 AuthenticationCredentialsNotFoundException),并将它们转换成相应的 HTTP 响应码发送回前端显示错误提示信息。 7. **退出登出逻辑 (LogoutFilter)** - LogoutFilter 监听特定 URL 模式的注销请求,清理掉与之关联的所有 sessions 并重定向到指定位置结束本次交互周期。 #### 三、基本流程概述 当一个请求到达服务器端口时,经过如下几个阶段依次流转直至最终响应结果反馈至客户端为止: 1. 初始化阶段 —— 创建上下文环境; 2. 应用层前置条件校验 —— 如 IP 黑白名单限制等初步筛选动作; 3. 主体认证环节 —— 对发起者进行核实确认真实身份; 4. 资源级许可判定 —— 根据既定规则评估能否继续深入探索目标地址内容; 5. 输出渲染呈现 —— 将合法的数据封装好传送给远端设备展示出来。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值