背景
前面分析过关于系统认证相关的术语,这里说明一下认证在web应用中的实现,以即spring security对认证的实现。
认证流程
- 用户使用客户端(比如:浏览器),通过HTTP的URL,访问应用资源。
- 应用根据请求信息(比如:sessionId)判断用户是否认证。
- 如果没有认证,则跳转到登录界面,要求用户填入认证信息进行认证。
- 用户输入认证信息,进行认证,认证通过以后,应用给用户一个系统凭证。
- 用户后续请求带系统凭证(比如:sessionId,token)等,访问应用资源。
spring security对认证的实现
认证配置
spring security通过对封装的HttpSecurity对象做以下配置,就可以实现上述的认证流程。
http.authorizeRequests()
.anyRequest()
.authenticated()
.addFilter(UsernamePasswordAuthenticationFilter.class)
。。。。。。
源码分析
首先,spring security继承于GennericFilterBean,实现了一个过滤器UsernamePasswordAuthenticationFilter。
image.png这个过滤器的作用就是基于用户输入的认证信息,封装为一个认证信息对象进行认证。
如下所示:
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) throws AuthenticationException {
if (postOnly && !request.getMethod().equals("POST")) {
throw new AuthenticationServiceException(
"Authentication method not supported: " + request.getMethod());
}
String username = obtainUsername(request);
String password = obtainPassword(request);
if (username == null) {
username = "";
}
if (password == null) {
password = "";
}
username = username.trim();
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
username, password);
// Allow subclasses to set the "details" property
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
其中最重要的就是调用AuthenticationManager接口了,这个接口就是针对不同的认证信息,进行不同的认证处理。
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
boolean supports(Class<?> authentication);
相关的接口及实现类如下图所示:
image.png- AuthenticationManager是认证行为管理的抽象接口。
- ProviderManager是对认证行为管理的实现,其中存储了一个认证行为集合。
- AuthenticationProvider是对认证行为的抽象接口。
- AbstractAuthenticationProvider是对认证行为的抽象实现,其中逻辑是通过用户详情接口(UserDetails)获取用户信息。
- DaoAuthenticationProvider是对AbstractAuthenticationProvider抽象类的实现,实现了从数据库中获取用户信息。
AuthenticationProvider 还有很多的认证行为的实现类,如下图所示:
网友评论