Spring Security 的 Web 应用和指纹登录实践(4)
- UID
- 1066743
|
Spring Security 的 Web 应用和指纹登录实践(4)
指纹登录实践指纹登录和用户名密码登录区别很小,只是将密码换成了指纹特征值。下面采用 Spring Security 推荐写法 Filter-AuthenticationProvider 的形式来定义相关组件以实现指纹登录。完整的项目地址: 。
FingerPrintTokenFingerPrintToken 增加 name 和 fingerPrint 字段,分别代表用户名和指纹特征值,如清单 16 所示:
清单 16. FingerPrintToken 函数签名1
2
3
4
5
| public class FingerPrintToken implements Authentication {
private String name;
private String fingerPrint;
......
}
|
FingerPrintFilterFingerPrintFilter 处理指纹登录请求,调用 AuthenticationManager 进行验证,验证通过后调用 SecurityContextHolder 将重新注入的 Authentication 填充到 SecurityContext 中,如清单 17 所示:
清单 17. doFilter 函数签名1
2
3
4
5
6
| public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
if (Objects.equals(httpServletRequest.getRequestURI(), "/api/finger-print")) {
// 调用 AuthenticationManager, 并填充 SecurityContext
}
}
|
FingerPrintProviderFingerPrintProvider 负责处理 FingerPrintToken,需要在 supports 函数中支持处理 FingerPrintToken。authenticate 函数负责 UserDetails 获取,指纹校验,FingerPrintToken 的重新注入。
FingerPrintUserDetailsFingerPrintUserDetails 继承 User 并实现 UserDetails 的方法,应用的用户信息可以加载到 Spring Security 中使用。
FingerPrintUserDetailsServiceFingerPrintUserDetailsService 获取 FingerUserDetails。通过 UserDao 查找到 User,并将 User 转换为 Spring Security 可识别 UserDetails。
SecurityConfigSecurityConfig 继承 WebSecurityConfigurerAdapter,需要定义 Spring Security 配置类。Spring Security 的配置不是本文的重点,配置时只需要注意以下几点:
- 将 FingerPrintFilter、FingerPrintProvider 添加进去。
- 将 FingerPrintFilter 的执行顺序放置在 SecurityContextPersistenceFilter 之后即可。Spring Security 维护了一个 Filter 的 list,因此每个 Filter 是有顺序的。
- 将 "/api/test" 请求设置为用户验证成功后才允许方问。
配置代码在 configure 函数中,如清单 18 所示:
清单 18. configure 函数1
2
3
4
5
6
7
8
| protected void configure(HttpSecurity http) throws Exception {
http
.userDetailsService(userDetailsService())
.addFilterAfter(fingerPrintFilter(), SecurityContextPersistenceFilter.class)
.authenticationProvider(fingerPrintProvider())
.authorizeRequests()
.mvcMatchers(HttpMethod.GET, "/api/test").authenticated()
}
|
总结在 Web 时代,用户和应用的耦合度越来越高,应用中存储了大量用户的私密信息。随着各种用户信息泄露事件的爆发,安全成为了 Web 应用重要的一个环。Spring Security 由于其强大的功能和 Spring Framework 的高度集成,赢得了开发人员的青睐。本文对 Spring Security 的架构设计与核心组件进行了深入浅出的介绍,分析了 Spring Security 在 Web 应用的集成方式,并展示了一个指纹登录的实例。 |
|
|
|
|
|