@[TOC](spring security OAuth实践(未完待续))

参考文章

核心filter

spring security维护了一个FilterChainProxy,这个类会依次调用spring security过滤器链,默认的过滤器链是11个,加上自定义的(MyusernamePasswordAuthentication是自定义过滤器,用户代替默认的usernamePasswordAuthentication)一个是十二个,如图,调用顺序从0-12
spring security OAuth实践

SecurityContextPersistenceFilter

整个Spring Security 过滤器链的开端,它有两个作用:一是当请求到来时,检查Session中是否存在SecurityContext,如果不存在,就创建一个新的SecurityContext。二是请求结束时将SecurityContext放入 Session中,并清空 SecurityContextHolder。

UsernamePasswordAuthenticationFilter

继承自抽象类 AbstractAuthenticationProcessingFilter,当进行表单登录时,该Filter将用户名和密码封装成一个 UsernamePasswordAuthentication进行验证。
改filter主要校验表单参数,之后封装成一个 UsernamePasswordAuthentication,如果需要修改spring security自动生成的表单元素(如添加一个验证码参数),需要自定义一个UsernamePasswordAuthenticationFilter,在过滤器配置自定义filter以替换UsernamePasswordAuthenticationFilter实现表单校验构造UsernamePasswordAuthentication

AnonymousAuthenticationFilter

匿名身份过滤器,当前面的Filter认证后依然没有用户信息时,该Filter会生成一个匿名身份——AnonymousAuthenticationToken。一般的作用是用于匿名登录。

ExceptionTranslationFilter

异常转换过滤器,用于处理 FilterSecurityInterceptor抛出的异常。
过滤器链经过此filter时会进行try…catch…,如果后面的filter抛出异常,会在此处捕获并处理(如后面的FilterSecurityInterceptor投票后抛出SpringSecurityException)

FilterSecurityInterceptor

过滤器链最后的关卡,从 SecurityContextHolder中获取 Authentication,比对用户拥有的权限和所访问资源需要的权限。

认证过程

spring security OAuth实践
认证过程之后再补充
如果需要自定义认证过程需要自定义LoginAuthenticationProvide实现AuthenticationProvider接口(AuthenticationProvider默认的实现是DaoAuthenticationProvider)
重写authenticate和supports方法
authenticate方法参考DaoAuthenticationProvider类的authenticate方法,认证成功返回一个UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities())对象,认证失败抛出AuthenticationException异常,AuthenticationException异常是一个spring security的抽象异常,它有很多子类实现,其中之一就是UsernameNotFoundException和BadCredentialsException

相关文章: