Spring Security入门

发布时间 2023-04-24 16:17:43作者: r1se

一、Spring Security介绍

1.简介

Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。由于它是Spring生态系统中的一员,因此它伴随着整个Spring生态系统不断修正、升级,在spring boot项目中加入Spring Security更是十分简单,使用Spring Security 减少了为企业系统安全控制编写大量重复代码的工作。

正如你可能知道的关于安全方面的两个核心功能是“认证”和“授权”,一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是 SpringSecurity 重要核心功能。

  • (1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录
  • (2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点讲就是系统判断用户是否有权限去做某些事情。

1.1 竞品对比

  • Spring Security

    Spring 技术栈的组成部分。

    https://spring.io/projects/spring-security

    通过提供完整可扩展的认证和授权支持保护你的应用程序

    特点:

    • 和 Spring 无缝整合
    • 全面的权限控制
    • 专门为 Web 开发而设计
      • 旧版本不能脱离 Web 环境使用
      • 新版本对整个框架进行了分层抽取,分成核心模块和 Web 模块。单独引入核心模块就可以脱离 Web 环境
    • 重量级
  • Shiro

    Apache 旗下的轻量级权限控制框架。

    特点

    • 轻量级。Shiro 主张的理念是把复杂的事情变简单。针对对性能有更高要求的互联网应用有更好表现。
    • 通用性。
      • 好处:不局限于 Web 环境,可以脱离 Web 环境使用。
      • 缺陷:在 Web 环境下一些特定的需求需要手动编写代码定制

二、Spring Security实现权限

要对Web资源进行保护,最好的办法莫过于Filter。
要想对方法调用进行保护,最好的办法莫过于AOP

Spring Security进行认证和鉴权的时候,就是利用的一系列的Filter来进行拦截的。

img

如图所示,一个请求想要访问到API就会从左到右经过蓝线框里的过滤器,其中绿色部分是负责认证的过滤器,蓝色部分是负责异常处理,橙色部分则是负责授权。进过一系列拦截最终访问到我们的API。

  • FilterSecurityInterceptor:是一个方法级的权限过滤器,基本位于过滤器链的最底部。
  • ExceptionTranslationFilter:是一个异常过滤器,用来处理认证授权过程中抛出的异常。
  • UsernamePasswordAuthenticationFilter:对/login的POST请求做拦截,校验表单中用户名,密码。

这里面我们只需要重点关注两个过滤器即可:UsernamePasswordAuthenticationFilter负责登录认证,FilterSecurityInterceptor负责权限授权。

说明:Spring Security的核心逻辑全在这一套过滤器中,过滤器里会调用各种组件完成功能,掌握了这些过滤器和组件你就掌握了Spring Security!这个框架的使用方式就是对这些过滤器和组件进行扩展。


1.引入依赖

		<!-- Spring Security依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>provided </scope>
        </dependency>

说明:依赖包(spring-boot-starter-security)导入后,Spring Security就默认提供了许多功能将整个应用给保护了起来:

​ 1、要求经过身份验证的用户才能与应用程序进行交互

​ 2、创建好了默认登录表单

​ 3、生成用户名为user的随机密码并打印在控制台上

​ 等等......

2.添加配置类

@Configuration
@EnableWebSecurity //@EnableWebSecurity是开启SpringSecurity的默认行为
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

}

3.启动测试

启动你自己的项目,并在浏览器输入任意接口路径,如:http://localhost:8080/test/findAll(填写你自己的接口)

会发现进入到了Spring Security默认提供认证页面,不需要额外开发,但实际中没人用。

默认账号:user

密码随机生成在控制台:55155fd5-5862-42d4-b508-e4d063467c8f(每次都是随机不同的)