认证和权限控制

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策略的认证流程。

代码地址:
https://github.com/Rying/twitter-clone.git

最新文章

  1. instanceof, isinstance,isAssignableFrom的区别
  2. Ajax 密码验证
  3. android SQLiteOpenHelper使用示例
  4. Java学习之约瑟夫环的两中处理方法
  5. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())[4]
  6. PHPCMSV9 更改后台地址
  7. 1.2 sikuli API
  8. 1、初识Java
  9. ADO中最重要的对象有三个:Connection、Recordset和Command
  10. java用swing画可以行走的乌龟
  11. 【Jenkins】新版本的特性:自定义流水线
  12. JavaScript学习(八)
  13. 【Java】Java批量文件打包下载zip
  14. 关于javaagent拦截不到File类的问题
  15. Java中带标签的break,continue
  16. 附录A——面向对象基础
  17. 百度地图api定位和导航简写
  18. docker使用问题总结
  19. python 一些乱七八糟的东西
  20. 【摘自张宴的"实战:Nginx"】使用nginx的fastcgi_cache缓存php输出的内容

热门文章

  1. LESS嵌套中的Mixins和classes
  2. Oracle案例02——ORA-12034: "SCOTT"."USER_TABLE" 上的实体化视图日志比上次刷新后的内容新
  3. Android笔记——Socket通信实现简单聊天室
  4. c++11简单的线程
  5. Ubuntu中的两种link的区别
  6. C#图解教程读书笔记(第4章 类:基础)
  7. tcp长连接分包方法
  8. 理解Underscore中的节流函数
  9. O(1) 和 O(n) 的区别
  10. Javascript 中 Array的 sort()和 compare()方法