Spring Security学习笔记(一)
认证和权限控制
authenticationmanager是认证的主要接口,它只有一个authenticate方法,可以做3件事情。
- 返回一个认证信息(authentication),表示认证成功
- 抛一个authenticationexception异常,如果认证不成功
- 返回null,如果不能确定是否认证成功
最常见的authenticationmanager实现是providermanager(经常看到一些authenticationprovider实例)。有时候应用的保护资源有逻辑分组,每组都有自己的认证方式,也就是说分别有各自的providermanager。他们共享一个parent。
@configuration
public class applicationsecurity extends websecurityconfigureradapter {
... // web stuff here
@autowired
public initialize(authenticationmanagerbuilder builder, datasource datasource) {builder.jdbcauthentication().datasource(datasource).withuser("dave")
.password("secret").roles("user");
}}
如果authenticationmanagerbuilder以autowired方式生成实例,那就是创建了一个global/parent的 authenticationmanager实例。
授权(authorization)或权限控制(access control)
一旦认证成功,我们继而可以进行权限控制。
web security(网络安全)
web层面的spring security是基于filters servlet。
客户端发送一个请求到app, 容器根据请求url决定使用哪些filters。通常,一个servlet可以处理一个请求,因此filters是顺序执行的。filter的顺序很重要,spring boot实用两种机制来处理filter的顺序。
- @bean的filter可以有@order声明或者实现ordered。
- 成为一个已经有order的filterregistrationbean的一部分。
spring security在filter chain中作为一个单独的filter,它实际的类型是filterchainproxy(是一系列的filter构成的)。
filterchainproxy通过filters chain实现所有security逻辑。所有的filter都implement servlet spec的filter 接口。
请求的匹配规则
一个security filter chain(websecurityconfigureradapter)有一个请求matcher用来决定filter规则是否应用到该请求。一旦有一个特定的filter chain,其他的filter chain就不work了。一个filter chain你可以定义多种规则。
- java config方式配置security filter chain。以global(@autowired)的方式生成一个authenticationmanager实例,该实例为自定义的authenticationmanager,即usernameandpasswordauthenticationprovider的一个实例。该自定义的usernameandpasswordauthenticationprovider主要实现一个自定义的authentication方法。
- 然后在spring filter chain添加一个自定义的filter,该filter处理主要的认证过程。
- 该filter主要干了两件事:
- 将http request的请求body的值,转为authenticationtocken。
- 然后authenticationmanager(这里是usernameandpasswordauthenticationprovider)的authentication方法处理认证逻辑。
- usernameandpasswordauthenticationprovider的authentication方法具体实现:
这里注意support方法默认返回false,这样就不会掉用自定义的authentication方法。需要逻辑判断调用条件。
这样就使用spring security实现了一个简单的自定义authentication策略的认证流程。
上一篇: 语音一对一聊天
推荐阅读
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理
-
ES6(阮一峰)学习笔记(二)解构赋值
-
Spring学习笔记之RedisTemplate的配置与使用教程
-
Spring学习笔记之RedisTemplate的配置与使用教程
-
Android手势密码view学习笔记(一)
-
MSSQL存储过程学习笔记一 关于存储过程
-
SQL学习笔记一SQL基础知识
-
Android手势密码view学习笔记(一)
-
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
-
Spring Cloud学习教程之Zuul统一异常处理与回退