前置知识
- 掌握Spring框架
- 掌握SpringBoot使用
- 掌握JavaWEB技术
文章目录
- 前置知识
- 1. 简介
- 1.1 概要
- 1.2 历史
- 2.入门案例
- 2.1 创建一个项目
- 2.1.1 pom.xml
- 2.1.2 controller层
- 2.2 运行这个项目
- 2.3
- 2.4 SpringSecurity 基本原理
- 2.5 UserDetailsService 接口讲解
- 2.6 PasswordEncoder 接口讲解
- 3.web项目权限方案
- 3.1 设置登录系统的账号、密码
1. 简介
1.1 概要
Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。
1.2 历史
2.入门案例
2.1 创建一个项目
2.1.1 pom.xml
<!-- springboot的web依赖包 -->
<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>
<!-- springboot的测试依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.1.2 controller层
package com.example.helloworld.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello security";
}
}
2.2 运行这个项目
访问 localhost:8080/test/hello
默认的用户名:user
密码在项目启动的时候在控制台会打印,注意每次启动的时候密码都回发生变化!
输入用户名,密码,这样表示可以访问了
2.3
2.4 SpringSecurity 基本原理
SpringSecurity 本质是一个过滤器链,在SpringSecurity里面边会有很多的过滤器,这些很多的过滤器构成一个过滤器链,在如下列出了比较常见过滤器,SpringSecurity底层大概有十几个过滤器,这些过滤器在我项目一启动就可以进行加载,当你过滤到里边的请求内容时,会执行相应的过滤器,实现里面对应的功能。
从启动是可以获取到过滤器链:
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
org.springframework.security.web.context.SecurityContextPersistenceFilter
org.springframework.security.web.header.HeaderWriterFilter
org.springframework.security.web.csrf.CsrfFilter
org.springframework.security.web.authentication.logout.LogoutFilter
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter
org.springframework.security.web.savedrequest.RequestCacheAwareFilter
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
org.springframework.security.web.authentication.AnonymousAuthenticationFilter
org.springframework.security.web.session.SessionManagementFilter
org.springframework.security.web.access.ExceptionTranslationFilter
org.springframework.security.web.access.intercept.FilterSecurityInterceptor
代码底层流程:重点看三个过滤器:
FilterSecurityInterceptor:是一个方法级(这个过滤器里边可以操作哪些方法可以访问,哪些方法不可以访问)的权限过滤器, 基本位于过滤链的最底部。
super.beforeInvocation(fi) 表示查看之前的 filter 是否通过。
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());表示真正的调用后台的服务。
ExceptionTranslationFilter:是个异常过滤器,用来处理在认证授权过程中抛出的异常
UsernamePasswordAuthenticationFilter :对/login 的 POST 请求做拦截,校验表单中用户
名,密码。
过滤器如何进行加载的?
再没有使用SpringBoot整合SpringSecurity,配置Spring与SpringSecurity整合,则需要配置DelegatingFilterProxy这个过滤器(在web.xml中通过filter标签进行配置)
看DelegatingFilterProxy类的doFilter方法
进入initDelegate方法
然后看FilterChainProxy类的doFilterInternal方法
List filters = getFilters(fwRequest);这个filters就是过滤链中的多个过滤器,就是启动SpringSecurity会配置的十多个过滤器
2.5 UserDetailsService 接口讲解
当什么也没有配置的时候,账号和密码是由 Spring Security 定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。
实现自己去查数据库的自定义认证步骤
- 写个类继承UsernamePasswordAuthenticationFilter,并重写该类的attemptAuthentication方法
- 然后在attemptAuthentication方面里边得到用户输入的用户名和密码,如果认证成功,则调用AbstractAuthenticationProcessingFilter类的successfulAuthentication,如果认证失败,则调用AbstractAuthenticationProcessingFilter类的unsuccessfulAuthentication。
- 但查数据库里的用户名和密码则在UserDetailsService写你查数据库的过程
- 创建类继承UsernamePasswordAuthenticationFilter,重写三个方法attemptAuthentication,successfulAuthentication,unsuccessfulAuthentication
- 创建类实现UserDetailsService,编写查询查询数据库过程,返回User对象,这个User对象是SpringSecurity提供的对象
2.6 PasswordEncoder 接口讲解
数据加密接口,用于返回User对象里面密码加密