1.DefaultLoginPageGeneratingFilter 默认登录页生成
从名字就可以看出,这是默认登录页生成过滤器。内容比较简单,就简单过一下。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 是不是异常页面
boolean loginError = isErrorPage(request);
// 是不是登出成功页面
boolean logoutSuccess = isLogoutSuccess(request);
if (isLoginUrlRequest(request) || loginError || logoutSuccess) {
// 登录的,异常的,登出成功的都返回登录页面
// 这里进行页面生成
String loginPageHtml = generateLoginPageHtml(request, loginError,
logoutSuccess);
response.setContentType("text/html;charset=UTF-8");
response.setContentLength(loginPageHtml.getBytes(StandardCharsets.UTF_8).length);
response.getWriter().write(loginPageHtml);
return;
}
chain.doFilter(request, response);
}
登录页面生成有好几种:
表单登录: formLogin
openId登录:openId
oauth2登录:oauth2Login
saml2登录:saml2Login
2.DefaultLogoutPageGeneratingFilter 默认登出页生成
登出页就没有登录页那么复杂了。
3.BasicAuthenticationFilter
这个跟表单认证不同,这是HTTP基本认证(Basic Authentication),至于什么是Basic认证,请参考《HTTP Basic 认证》
看一下Basic如何从header中解析出用户名和密码
上面其实就是从头信息中获取Authorization的参数,然后将值进行base64解码。然后进行通过冒号:
进行分隔,前面是用户名,后面是密码。
其实从这里可以看出。Basic其实不适用于外网使用,跟裸奔一样。适用于高安全性的内部网络使用。
4.RequestCacheAwareFilter
5.SecurityContextHolderAwareRequestFilter
这里是将request又包装了一遍,将SecurityContextHolder包装进去,同时还增加了Servlet3对异步获取SecurityContextHolder的支持。
6.AnonymousAuthenticationFilter 匿名认证对象
每个匿名对象都要像真正的认证对象一样有userName,password,authority。
其中key(userName)的生成方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
password和权限:
所以这个类就是生成了一个匿名认证对象
7.小结
今天看了一下6个Filter,还有3个,明天继续~