Spring Security 基本原理
Spring Security 过滤器链
Spring Security实现了一系列的过滤器链,就按照下面顺序一个一个执行下去。
....class
一些自定义过滤器(在配置的时候你可以自己选择插到哪个过滤器之前),因为这个需求因人而异,本文不探讨,大家可以自己研究UsernamePasswordAithenticationFilter.class
Spring Security 自带的表单登入验证过滤器,也是本文主要使用的过滤器BasicAuthenticationFilter.class
ExceptionTranslation.class
异常解释器FilterSecurityInterceptor.class
拦截器最终决定请求能否通过Controller
我们最后自己编写的控制器
相关类说明
User.class
:注意这个类不是我们自己写的,而是Spring Security官方提供的,他提供了一些基础的功能,我们可以通过继承这个类来扩充方法。详见代码中的CustomUser.java
UserDetailsService.class
: Spring Security官方提供的一个接口,里面只有一个方法loadUserByUsername()
,Spring Security会调用这个方法来获取数据库中存在的数据,然后和用户POST过来的用户名密码进行比对,从而判断用户的用户名密码是否正确。所以我们需要自己实现loadUserByUsername()
这个方法。详见代码中的CustomUserDetailsService.java
。
项目逻辑
为了体现权限区别,我们通过HashMap构造了一个数据库,里面包含了4个用户
ID | 用户名 | 密码 | 权限 |
---|---|---|---|
1 | jack | jack123 | user |
2 | danny | danny123 | editor |
3 | alice | alice123 | reviewer |
4 | smith | smith123 | admin |
说明下权限
user
:最基础的权限,只要是登入用户就有 user
权限
editor
:在 user
权限上面增加了 editor
的权限
reviewer
:与上同理,editor
和 reviewer
属于同一级的权限
admin
:包含所有权限
为了检验权限,我们提供若干个页面
网址 | 说明 | 可访问权限 |
---|---|---|
/ | 首页 | 所有人均可访问(anonymous) |
/login | 登入页面 | 所有人均可访问(anonymous) |
/logout | 退出页面 | 所有人均可访问(anonymous) |
/user/home | 用户中心 | user |
/user/editor | editor, admin | |
/user/reviewer | reviewer, admin | |
/user/admin | admin | |
/403 | 403错误页面,美化过,大家可以直接用 | 所有人均可访问(anonymous) |
/404 | 404错误页面,美化过,大家可以直接用 | 所有人均可访问(anonymous) |
/500 | 500错误页面,美化过,大家可以直接用 | 所有人均可访问(anonymous) |
代码配置
Maven 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.inlighting</groupId>
<artifactId>security-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>security-demo</name>
<description>Demo project for S