首页 > 其他分享 >springSecurity过滤器之AnonymousAuthenticationFilter

springSecurity过滤器之AnonymousAuthenticationFilter

时间:2023-05-01 20:33:38浏览次数:52  
标签:getAuthentication springSecurity SecurityContextHolder Authentication getContext

SpringSecurity提供了匿名登录功能,让我们不登录也能访问。比如/anoy路径及子路径都能匿名访问,配置如下:

@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/anoy/*").anonymous()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .permitAll()
                .and()
                .sessionManagement()
                .sessionFixation()
                .newSession()
                .maximumSessions(1);
    }
}

同时增加controller:

@RestController
@RequestMapping("/anoy")
public class AnoyController {

    @RequestMapping("/foo")
    public String foo(Authentication authentication) {
        return "foo:" + authentication;
    }
}

访问http://localhost:8080/anoy/foo,看到foo:null。可知不需要登录也能访问。将foo方法改成:

 @RequestMapping("/foo")
public String foo() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    return "foo:" + authentication;
}

访问http://localhost:8080/anoy/foo,看到foo:AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]]。从上面可知SecurityContextHolder.getContext().getAuthentication()和通过参数注入的Authentication是不相同的。

源码分析

AnonymousAuthenticationFilter

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
		throws IOException, ServletException {
	if (SecurityContextHolder.getContext().getAuthentication() == null) {
		Authentication authentication = createAuthentication((HttpServletRequest) req);
		SecurityContext context = SecurityContextHolder.createEmptyContext();
		context.setAuthentication(authentication);
		SecurityContextHolder.setContext(context);
		if (this.logger.isTraceEnabled()) {
			this.logger.trace(LogMessage.of(() -> "Set SecurityContextHolder to "
					+ SecurityContextHolder.getContext().getAuthentication()));
		}
		else {
			this.logger.debug("Set SecurityContextHolder to anonymous SecurityContext");
		}
	}
	else {
		if (this.logger.isTraceEnabled()) {
			this.logger.trace(LogMessage.of(() -> "Did not set SecurityContextHolder since already authenticated "
					+ SecurityContextHolder.getContext().getAuthentication()));
		}
	}
	chain.doFilter(req, res);
}

判断SecurityContextHolder.getContext().getAuthentication()是否为空,如果不为空则是认证登录。否则设置匿名用户和角色。并将匿名用户设置到SecurityContextHolder中。

	protected Authentication createAuthentication(HttpServletRequest request) {
	AnonymousAuthenticationToken token = new AnonymousAuthenticationToken(this.key, this.principal,
			this.authorities);
	token.setDetails(this.authenticationDetailsSource.buildDetails(request));
	return token;
}

createAuthentication创建用户名为anonymousUser,角色为ROLE_ANONYMOUS的匿名用户。

标签:getAuthentication,springSecurity,SecurityContextHolder,Authentication,getContext
From: https://www.cnblogs.com/shigongp/p/17366891.html

相关文章

  • SpringSecurity过滤器之SecurityContextPersistenceFilter
    SecurityContextPersistenceFilter在请求之前从配置的SecurityContextRepository获得的信息填充SecurityContextHolder,并在请求完成并清除上下文holder后将其存储回存储库。默认情况下,它使用HttpSessionSecurityContextRepository。privatevoiddoFilter(HttpServletRequestreq......
  • SpringSecurity过滤器之SessionManagementFilter
    SessionManagementFilter检测用户自请求开始以来是否已通过身份验证,如果已通过,则调用SessionAuthenticationStrategy以执行任何与会话相关的活动,例如激活会话固定保护机制或检查多个并发登录。配置如下:@ConfigurationpublicclassMySecurityConfigextendsWebSecurityConfigur......
  • 接口过期过滤器
    注解类importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***过期接口通知*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,......
  • 接口重复调用限制过滤器
    注解类importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***重复请求过滤器*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD......
  • SpringBoot SpringSecurity 介绍(基于内存的验证)
    SpringBoot集成SpringSecurity+MySQL+JWT附源码,废话不多直接盘SpringBoot已经为用户采用默认配置,只需要引入pom依赖就能快速启动SpringSecurity。目的:验证请求用户的身份,提供安全访问优势:基于Spring,配置方便,减少大量代码内置访问控制方法permitAll()表示所匹配的......
  • SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
    SpringBoot集成SpringSecurity+MySQL+JWT无太多理论,直接盘一般用于Web管理系统可以先看SpringBootSpringSecurity基于内存的使用介绍本文介绍如何整合SpringSecurity+MySQL+JWT数据结构数据库脚本:https://gitee.com/VipSoft/VipBoot/blob/develop/vipsoft-sec......
  • SpringSecurity从入门到精通:认证成功处理器&认证失败处理器
    认证成功处理器  认证失败处理器  ......
  • Django模板层 (变量分配 过滤器 标签 继承和导入 自定义过滤器、标签及inclusion_ta
    目录一、模板变量分配定义 在后端变量的值通过模板语法传到前端符号{{}}:主要与数据值相关{%%}:主要与逻辑相关模板语法注意点:1.针对需要加括号调用的名字django模板语法会自动加括号调用你只需要写名字就行2.模板语法的注释{##},前端浏览器是无法查看的,因为它要先......
  • SpringSecurity从入门到精通:其他权限校验方法&自定义权限校验方法
    其他权限校验方法我们前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法进行校验。SpringSecurity还为我们提供了其它方法例如:hasAnyAuthority,hasRole,hasAnyRole等。​这里我们先不急着去介绍这些方法,我们先去理解hasAuthority的原理,然后再去学......
  • SpringSecurity从入门到精通:从数据库查询权限信息&自定义失败处理
    从数据库查询权限信息      记得打开redis      自定义失败处理我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity......