认证和权限控制

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

Spring Security学习笔记(一)的更多相关文章

  1. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  2. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  3. SpringBoot + Spring Security 学习笔记(二)安全认证流程源码详解

    用户认证流程 UsernamePasswordAuthenticationFilter 我们直接来看UsernamePasswordAuthenticationFilter类, public clas ...

  4. Spring Security学习笔记

    Spring Web Security是Java web开发领域的一个认证(Authentication)/授权(Authorisation)框架,基于Servlet技术,更确切的说是基于Servle ...

  5. Spring Security学习笔记一

    一.使用Spring Security 1.在pom 文件中添加Spring Security的依赖. <dependency> <groupId>org.springfram ...

  6. SpringBoot + Spring Security 学习笔记(一)自定义基本使用及个性化登录配置

    官方文档参考,5.1.2 中文参考文档,4.1 中文参考文档,4.1 官方文档中文翻译与源码解读 SpringSecurity 核心功能: 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) ...

  7. Spring Security学习笔记(三)

    之前提到过认证后怎么存放用户信息,令牌token是一种方式,session是另一种方式,这里介绍使用spring session data redis存储httpSession. 添加了以上依赖后,我 ...

  8. Spring security学习笔记(二)

    对比两种承载认证信息的方式: session vs token token验证方案: session验证方案: session即会话是将用户信息保存在服务端,根据请求携带的session_id,从服务 ...

  9. Spring Security 学习笔记-securityContext过滤器过滤链学习

    web.xml配置委托代理filter,filter-name默认与filter bean的名字保持一致. <filter> <filter-name>springSecuri ...

随机推荐

  1. 对连接到 Azure 中 Linux VM 时出现的问题进行详细的 SSH 故障排除的步骤

    有许多可能的原因会导致 SSH 客户端无法访问 VM 上的 SSH 服务. 如果已经执行了较常规的 SSH 故障排除步骤,则需要进一步排查连接问题. 本文指导用户完成详细的故障排除步骤,以确定 SSH ...

  2. zookeeper & kafka 集群

    http://cloudurable.com/blog/kafka-architecture/index.html 静态解析 cat >> /etc/hosts << EOF ...

  3. C++ Notes 1 - size_type - Accelerated Ch3

    1. 为什么用string::size_type而不是int? --Why use string::size_type ? int is supposed to work! it holds numb ...

  4. 【NLP_Stanford课堂】情感分析

    一.简介 实例: 电影评论.产品评论是positive还是negative 公众.消费者的信心是否在增加 公众对于候选人.社会事件等的倾向 预测股票市场的涨跌 Affective States又分为: ...

  5. Jsonp实现Ajax跨域Demo

    JSONP 1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准: 2.不过我们又发现,Web页面上调用j ...

  6. MapReduce编程中常用的字符操作

    本文主要用于记录自己在编写mapreduce程序时常用的一些方法,后期会不断更新,用于自己复习和给新手一些帮助. 字符串操作 String str = " 12345"; // 字 ...

  7. MySQL的存储函数(自定义函数)的定义和使用方法

    存储函数 什么是存储函数: 封装一段sql代码,完成一种特定的功能,返回结果. 存储函数的语法:  create function 函数([函数参数[,….]]) Returns 返回类型 Begin ...

  8. xwork-2.1.2.jar与xwork-core-2.1.6.jar的区别是什么? 在线等待 先谢谢了

    两个包是一样,都是struts2的核心包.不过有时下在的struts2的jar包中只有xwordk-core-2.1.6.jar包.做项目的时候最好两个都导入.

  9. Eclipse_java项目中导入外部jar文件

    非常多时候,在java项目中须要导入外部 .jar文件.比方:须要导入数据库连接驱动等等一些包.不熟悉eclipse的人可能会犯愁,事实上非常easy. ...过程例如以下:  在须要加入外部文件的项 ...

  10. tensorflow一个很好的博客

    http://blog.csdn.net/mydear_11000/article/details/53197891