Spring Security

  1. 原理
    Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。
    Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求
image.png

Spring Security的体系结构旨在将身份验证与授权分开,并具有策略和扩展点。

1.身份验证


public interface AuthenticationManager {

  Authentication authenticate(Authentication authentication)
    throws AuthenticationException;

}

authenticate()方法中的三件事之一:

  • 如果可以验证输入是否代表有效的委托人,则返回Authentication(通常为authenticated=true)。
  • AuthenticationException如果它认为输入代表无效的主体,则抛出一个。
  • null如果无法决定,则返回。
//An AuthenticationProvider有点像an,AuthenticationManager但是它有一个额外的方法,允许调用者查询是否支持给定Authentication类型:
public interface AuthenticationProvider {

    Authentication authenticate(Authentication authentication)
            throws AuthenticationException;
/**
*
*/
    boolean supports(Class<?> authentication);

}
@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

  @Autowired
  DataSource dataSource;

   ... // web stuff here

  @Override
  public void configure(AuthenticationManagerBuilder builder) {
    builder.jdbcAuthentication().dataSource(dataSource).withUser("dave")
      .password("secret").roles("USER");
  }

}

2.访问控制

安全过滤器链 WebSecurityConfigurerAdapter

笔记:
5.1。认证方式
5.1.1。认证支持
5.1.2。密码储存

  • DelegatingPasswordEncoder
    • 确保使用当前密码存储建议对密码进行编码

    • 允许以现代和旧式格式验证密码

    • 允许将来升级编码

//.创建默认的DelegatingPasswordEncoder
PasswordEncoder passwordEncoder =
    PasswordEncoderFactories.createDelegatingPasswordEncoder();
//创建自定义DelegatingPasswordEncoder
String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());
PasswordEncoder passwordEncoder =
    new DelegatingPasswordEncoder(idForEncode, encoders);
  • BCryptPasswordEncoder
  • Argon2PasswordEncoder
  • Pbkdf2PasswordEncoder

Spring Security 默认使用DelegatingPasswordEncoder

@Bean
public static NoOpPasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}

Spring为防止 跨站请求伪造(CSRF)

CSRF攻击之所以可能是因为受害者网站的HTTP请求与攻击者网站的请求完全相同。这意味着无法拒绝来自邪恶网站的请求并允许来自银行网站的请求。为了防御CSRF攻击,我们需要确保恶意站点无法提供请求中的某些内容,因此我们可以区分这两个请求。
Spring提供了两种机制来防御CSRF攻击:

该解决方案是为了确保每个HTTP请求除了我们的会话cookie外,还必须在HTTP请求中包含一个安全的,随机生成的值,称为CSRF令牌。
提交HTTP请求时,服务器必须查找预期的CSRF令牌,并将其与HTTP请求中的实际CSRF令牌进行比较。如果值不匹配,则应拒绝HTTP请求。
让我们看一下使用同步令牌模式时示例将如何变化。假设实际的CSRF令牌必须位于名为的HTTP参数中_csrf
通常建议将该SameSite属性用作深度防御,而不是针对CSRF攻击的唯一防护。

  • spring-security-core.jar
    该模块包含核心身份验证和访问控制类和接口,远程支持和基本配置API。使用Spring Security的任何应用程序都需要它。它支持独立的应用程序,远程客户端,方法(服务层)安全性和JDBC用户配置。
    org.springframework.security.core
    org.springframework.security.access
    org.springframework.security.authentication
    org.springframework.security.provisioning

  • 网络- spring-security-web.jar
    该模块包含过滤器和相关的Web安全基础结构代码。它包含任何与Servlet API相关的内容。如果需要Spring Security Web认证服务和基于URL的访问控制

  • spring-security-config.jar
    该模块包含安全名称空间解析代码和Java配置代码。如果将Spring Security XML名称空间用于配置或Spring Security的Java Configuration支持,则需要它。
    LDAP- spring-security-ldap.jar
    此模块提供LDAP身份验证和供应代码。如果您需要使用LDAP认证或管理LDAP用户条目,则

  • 此模块提供LDAP身份验证和供应代码。如果您需要使用LDAP认证或管理LDAP用户条目,
    spring-security-oauth2-core.jar包含为OAuth 2.0授权框架和OpenID Connect Core 1.0提供支持的核心类和接口。使用OAuth 2.0或OpenID Connect Core 1.0的应用程序(例如客户端,资源服务器和授权服务器)需要它。

  • OAuth 2.0客户端- spring-security-oauth2-client.jar
    spring-security-oauth2-client.jar包含Spring Security对OAuth 2.0授权框架和OpenID Connect Core 1.0的客户端支持。使用OAuth 2.0登录或OAuth客户端支持的应用程序需要使用它

  • spring-security-oauth2-jose.jar包含Spring Security对JOSE(JavaScript对象签名和加密)框架的支持。

    • JSON Web令牌(JWT)
    • JSON Web签名(JWS)
    • JSON Web加密(JWE)
    • JSON Web密钥(JWK)
  • OAuth 2.0资源服务器- spring-security-oauth2-resource-server.jar
    spring-security-oauth2-resource-server.jar包含Spring Security对OAuth 2.0资源服务器的支持。它用于通过OAuth 2.0承载令牌保护API。

  • ACL- spring-security-acl.jar
    该模块包含专门的域对象ACL实现。它用于将安全性应用于应用程序中的特定域对象实例

  • CAS — spring-security-cas.jar
    该模块包含Spring Security的CAS客户端集成。如果要对CAS单点登录服务器使用Spring Security Web认证,则应该使用它。

  • OpenID — spring-security-openid.jar
    该模块包含OpenID Web身份验证支持。它用于根据外部OpenID服务器对用户进行身份验证。顶级软件包是org.springframework.security.openid。它需要OpenID4Java。

Servlet应用

Spring Security通过使用标准Servlet与Servlet容器集成Filter。这意味着它可以与在Servlet容器中运行的任何应用程序一起使用。

Servlet安全性:大局

身份验证”,“ 授权”“防止利用漏洞”部分中建立了这种高级理解。

image.png

FilterChain

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // do something before the rest of the application
    chain.doFilter(request, response); // invoke the rest of the application
    // do something after the rest of the application
}

DelegatingFilterProxy
DelegatingFilterProxy可以通过标准Servlet容器机制进行注册,但是将所有工作委托给实现的Spring Bean Filter。


image.png

另一个好处DelegatingFilterProxy是,它允许延迟查找Filterbean实例。这很重要,因为容器需要Filter在容器启动之前注册实例。但是,Spring通常使用a ContextLoaderListener来加载Spring Bean,直到Filter需要注册实例之后才能完成。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // Lazily get Filter that was registered as a Spring Bean  // For the example in [DelegatingFilterProxy](https://docs.spring.io/spring-security/site/docs/5.3.2.BUILD-SNAPSHOT/reference/html5/#servlet-delegatingfilterproxy-figure)  `delegate` is an instance of *Bean Filter<sub>0</sub>* Filter delegate = getFilterBean(someBeanName);  // delegate work to the Spring Bean delegate.doFilter(request, response); }

FilterChainProxy


image.png

Spring Security的Servlet支持包含在中FilterChainProxyFilterChainProxyFilterSpring Security提供的一种特殊功能,它允许Filter通过委派许多实例SecurityFilterChain。由于FilterChainProxy是Bean,因此通常将其包装在DelegatingFilterProxy中

SecurityFilterChain
SecurityFilterChainFilterChainProxy用于确定Filter应对此请求调用哪些Spring Security 。

image.png

保安过滤器SecurityFilterChain通常是豆类,但他们与注册FilterChainProxy代替的DelegatingFilterProxyFilterChainProxy直接向Servlet容器或DelegatingFilterProxy注册具有许多优点。首先,它为Spring Security的所有Servlet支持提供了一个起点。因此,如果您想对Spring Security的Servlet支持进行故障排除,则在其中添加调试点FilterChainProxy是一个很好的起点。

其次,由于FilterChainProxy对于Spring Security的使用至关重要,因此它可以执行不被视为可选任务。例如,它清除SecurityContext以避免内存泄漏。它还使用Spring Security HttpFirewall来保护应用程序免受某些类型的攻击。

另外,它在确定何时SecurityFilterChain调用a时提供了更大的灵活性。在Servlet容器中,Filter仅根据URL调用。但是,FilterChainProxy可以HttpServletRequest利用RequestMatcher接口根据任何内容确定调用。

实际上,FilterChainProxy可以用来确定SecurityFilterChain应该使用哪个。如果您的应用程序可以为不同的提供完全独立的配置。

image.png

9.5。安全过滤器

  • ChannelProcessingFilter

  • ConcurrentSessionFilter

  • WebAsyncManagerIntegrationFilter

  • SecurityContextPersistenceFilter

  • HeaderWriterFilter

  • CorsFilter

  • CsrfFilter

  • LogoutFilter

  • OAuth2AuthorizationRequestRedirectFilter

  • Saml2WebSsoAuthenticationRequestFilter

  • X509AuthenticationFilter

  • AbstractPreAuthenticatedProcessingFilter

  • CasAuthenticationFilter

  • OAuth2LoginAuthenticationFilter

  • Saml2WebSsoAuthenticationFilter

  • UsernamePasswordAuthenticationFilter

  • ConcurrentSessionFilter

  • OpenIDAuthenticationFilter

  • DefaultLoginPageGeneratingFilter

  • DefaultLogoutPageGeneratingFilter

  • DigestAuthenticationFilter

  • BearerTokenAuthenticationFilter

  • BasicAuthenticationFilter

  • RequestCacheAwareFilter

  • SecurityContextHolderAwareRequestFilter

  • JaasApiIntegrationFilter

  • RememberMeAuthenticationFilter

  • AnonymousAuthenticationFilter

  • OAuth2AuthorizationCodeGrantFilter

  • SessionManagementFilter

  • ExceptionTranslationFilter

  • FilterSecurityInterceptor

  • SwitchUserFilter

处理安全异常

ExceptionTranslationFilter允许的翻译AccessDeniedExceptionAuthenticationException到HTTP响应。

ExceptionTranslationFilter作为安全过滤器之一插入到FilterChainProxy中。

image.png

  • 1号
    首先,ExceptionTranslationFilter调用FilterChain.doFilter(request, response)将调用应用程序的其余部分。

  • [图片上传失败...(image-9e46a-1586791805902)] 如果用户未通过身份验证或为AuthenticationException,则Start Authentication.

    • SecurityContextHolder中被清除出

    • HttpServletRequest保存在中RequestCache。当用户成功验证身份后,将RequestCache用于重播原始请求。

    • AuthenticationEntryPoint用于从客户机请求的凭证。例如,它可能重定向到登录页面或发送WWW-Authenticate标题。

  • 3号
    否则,如果是AccessDeniedException,则拒绝访问。将AccessDeniedHandler被调用,以拒绝提手接近。

| |

如果应用程序未抛出AccessDeniedExceptionAuthenticationExceptionExceptionTranslationFilter则不执行任何操作

ExceptionTranslationFilter伪代码

try {
    filterChain.doFilter(request, response); 
} catch (AccessDeniedException | AuthenticationException e) {
    if (!authenticated || e instanceof AuthenticationException) {
        startAuthentication(); 
    } else {
        accessDenied(); 
    }
}

| | 你可以从召回进展的Filter小号即调用FilterChain.doFilter(request, response)是等效的调用应用程序的其余部分。这意味着如果应用程序的另一部分(即FilterSecurityInterceptor方法安全性)抛出AuthenticationExceptionAccessDeniedException,它将在此处被捕获和处理。 |
| | 如果用户未通过身份验证或为AuthenticationException,则开始身份验证。 |
| | 否则,访问被拒绝 |

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容