Spring Security

1.框架简介

Spring是非常流行和成功的Java应用开发框架,Spring Security正是Spring家族中的成员。Spring Security基于Spring框架,提供了一套Web应用安全性的完整解决方案。"

正如你可能知道的关于安全方面的两个主要区域是"认证"和"授权"(或者访问控制),一般来说,Web应用的安全性包括用户认证(Authentication )和用户授权( Authorization) 两个部分,这两点也是 Spring Security重要核心功能。 ( 1)用户认证 指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录 . (2)用户授权 指的是验证某个用户是否有权限执行某个操作。在一个系统中不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点讲就是系统判断用户是否有权限去做某些事情。

2.同类型比较

Spring Security与 Apache Shiro

SpringSecurity特点:

  • 和Spring无缝整合。

  • 全面的权限控制。

  • 专门为Web开发而设计。

    旧版本不能脱离Web环境使用。

    新版本对整个框架进行了分层抽取,分成了核心模块和Web模块.单独引入核心模块就可以脱离Web环境。

  • 重量级。 依赖多

Shiro 特点:

轻量级。Shiro主张的理念是把复杂的事情变简单。针对对性能有更高要求的互联网应用有更好表现

通用性。■好处:不局限于Web环境,可以脱离Web环境使用。·

■缺陷:在Web环境下一些特定的需求需要手动编写代码定制。

Spring Security是Spring家族中的一个安全管理框架,实际上,在Spring Boot 出现之前,Spring Security就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是Shiro的天下。

自从有了Spring Boot之后,Spring Boot对于Spring Security提供了自动化配置方案,可以使用更少的配置来使用Spring Security。"

因此,一般来说,常见的安全管理技术栈的组合是这样的:,

SSM + Shiro

Spring Boot/Spring Cloud + Spring Security.

以上只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合都是可以运行

3 security 入门案例 2.6.7

springboot+ spring security 入门案例

按照讲解 cloud 方式 配置 父子工程, 父项目中 指定 springboot 版本为 2.6.7

父工程的pom.xml为

XML 复制代码
 <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-dependencies</artifactId>
             <version>2.6.7</version>
             <scope>import</scope>
             <type>pom</type>
         </dependency>
     </dependencies>
 </dependencyManagement>

子工程pom.xml ,引入spring-boot-starter-security

XML 复制代码
 <dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
     </dependency>
 ​
 </dependencies>

编写 启动类

java 复制代码
 @SpringBootApplication
 public class SSApp {
     public static void main(String[] args) {
         SpringApplication.run(SSApp.class,args);
     }
 }

控制层

java 复制代码
 @RestController
 @RequestMapping("/test")
 public class TestController {
 ​
     @GetMapping("/add")
     public String add(){
         return "hello security";
     }
 }

运行启动类: 由于没有配置端口号, 默认8080

再地址栏输入(http://localhost:8080/test/add 结果发现 并没有按照之前的 显示 hello security

结果为:

需要输入 用户名及密码, 这就是 security起作用了, 这就是认证

在 security中 默认用户名为 user , 密码 在 启动项目时 ,打印在控制台中

Using generated security password: 05df0e50-6523-4156-9a35-3c4aace26d83

输入 用户名及密码后

原理

SpringSecurity本质是一个过滤器链:

其中 最主要的有3个:

  • FilterSecurityInterceptor;是一个方法级的权限过滤器,基本位于过滤链的最底部。过滤器安全截止器;是一个方法级的权限过滤器,基本位于过滤链的最底部

(在idea 中 ctrl+shift+t 查找)

  • ExceptionTranslationFilter:是个异常过滤器,用来处理在认证授权过程中抛出的异常·

  • UsernamePasswordAuthenticationFilter : 对/login的 POST请求做拦截,校验表单中用户名,密码。

过滤器如何加载的?

  1. 使用security配置过滤器DelegatingFilterProxy(boot 不需要配置)

    java 复制代码
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        ....
         delegateToUse = this.initDelegate(wac);
         ,,,,
     }
     protected Filter initDelegate(WebApplicationContext wac) throws ServletException {
         String targetBeanName = this.getTargetBeanName();  //FilterChainProxy
         Assert.state(targetBeanName != null, "No target bean name set");
         Filter delegate = (Filter)wac.getBean(targetBeanName, Filter.class);
         if (this.isTargetFilterLifecycle()) {
             delegate.init(this.getFilterConfig());
         }
     ​
         return delegate;
     }

在 FilterChainProxy.class 中, 加载所有的过滤器

UserDetailsService接口

当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。如果需要自定义逻辑时,只需要实现 UserDetailsService接口即可。

UserDetailsService接口:查询数据库用户名和密码过程

创建类继承UsernamePasswordAuthenticationFilter,重写三个方法

创建类实现UserDetailService,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象

PasswordEncoder接口

PasswordEncoder 数据加密接口,用于返回User对象里面密码加密

相关推荐
今天背单词了吗98012 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师15 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构30 分钟前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖44 分钟前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan1 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea
缘来是庄1 小时前
设计模式之迭代器模式
java·设计模式·迭代器模式
Liudef061 小时前
基于HTML与Java的简易在线会议系统实现
java·前端·html
JosieBook1 小时前
【Java编程动手学】Java常用工具类
java·python·mysql