Spring Security介绍

Spring Security 是一个基于Spring的安全框架,Spring boot更好的集成了Spring Security的开发工作。在Spring 框架基础上,Spring Security 充分利用了依赖注入DI和 面向切面编程AOP功能,为应用系统提供声明式的安全访问控制功能,减少了企业安全控制编写大量重复代码的功能,是一个轻量级的安全框架。

Spring Security 的核心功能有哪些?

1、 认证(Authentication):指的是验证某个用户是否为系统的合法主体,也就是说用户能否访问该系统。
2、授权(Authorization):指的是验证某个用户是否有权限执行某个操作。

Spring Security原理

spring security 退出登录 spring security登录原理_spring Security


Spring Security 功能实现主要是由一系列的过滤器链相互配合完成的。

绿色的过滤器链可以通过配置进行修改的,其他部分的过滤器不能进行更改。

请求过程:

  • 请求通过UsernamePasswordAuthenticationFilter获取用户信息
  • ExceptionTransationFilter是认证异常进行捕获,
  • FilterSecurityInterceptor 是对在 WebSecurityConfigurerAdapter的实现类中的指定的权限进行验证。
  • 处理自己实现的controller 接口代码。

1、springSecurityFilterChain中各个过滤器怎么创建的只需了解即可。不要太过关注。

2、重点记忆UsernamePasswordAuthenticationFilter,ExceptionTranslationFilter, FilterSecurityInterceptor这三个过滤器的作用及源码分析。

3、重点记忆认证中Authentication,AuthenticationManager,ProviderManager, AuthenticationProvider,UserDetailsService,UserDetails这些类的作用及源码分析。

4、重点记忆授权中FilterInvoction,SecurityMetadataSource,AccessDecisionManager的作用。

框架的核心组件

SecurityContextHolder: 提供对SecurityContext的访问。
SecurityContext: 持有uthentication对象和其他可能需要的信息。
AuthenticationManager: 其中可以包含多个AuthenticationProvider。
ProviderManager: 为AuthenticationManager接口的实现类。
AuthenticationProvider: 主要用来进行认证操作的类,调用其中的authenticate()方法进行认证操作。
Authentication: Spring Security方式的认证主体。
GrantedAuthority: 对认证主题的应用层面的授权,含当前用于的权限信息,通常使用角色表示。
**UserDetails:**构建Authentication对象必须的信息,可以自定义,可能需要访问db得到。
**UserDetailsService:**通过username构建UserDetails对象,通过loadUserByUsername根据username获取UserDetails对象。

基于Spring boot的demo

1、 添加依赖

添加依赖后,默认所有的请求就都需要进行验证。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2、自定义配置

实现WebSecurityConfigurerAdapter 类

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 定义请求方式 是form表单 还是 basics模式
        http.formLogin()
//          http.httpBasic()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();
    }
}

3、controller

@Controller
public class HelloController {

    @GetMapping("/hello")
    @ResponseBody
    public String hello () {
        return "hello spring security";
    }
}

当请求 /hello 时会自动跳转到login登录页面。
需要在配置类中 指定为 form表单格式。

basic模式:是通过请求头Authentication: Basic 的方式进行传输用户信息,在BasicAuthenticationFilter中进行base64 解码,获取用户信息。