1.简介
Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。一般Web应用的需要进行认证和授权。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。
授权:经过认证后判断当前用户是否有权限进行某个操作。
而认证和授权也是SpringSecurity作为安全框架的核心功能。
2.原理初探
SpringSecurity的原理其实就是一个过滤器链(实质上一共有15个过滤器),内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。
图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示,选择其中比较核心的三个过滤器进行介绍。
UsernamePasswordAuthenticationFilter:用于拦截登录请求,当进行表单登录时,该Filter将用户名和密码封装成一个 UsernamePasswordAuthenticationToken,并将这个token交给AuthenticationManager
进行认证,通过authenticationManager.authenticate(token)进行认证,返回一个Authentication对象。
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException(授权异常)和AuthenticationException(认证异常),对于认证异常一般交给AuthenticationEntryPoint进行处理,一般是重定向到登录页面,对于授权异常则交给AccessDeniedHandler处理,一般是重定向到一个错误页面。
FilterSecurityInterceptor:过滤器链最后的关卡,用于权限比对,从 SecurityContextHolder中获取 Authentication,比对用户拥有的权限和所访问资源需要的权限。
我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。
3.逻辑及代码实现
3.1导入依赖
在SpringBoot项目中使用SpringSecurity我们只需要引入依赖即可实现入门案例。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
引入依赖后我们在尝试去访问之前的接口就会自动跳转到一个SpringSecurity的默认登陆页面,