由于之前看过security,并且练习过对应的demo ,以及实现用户的验证与鉴权, 实现用户角色权限的动态配置,但是之前的代码没写对应的博客,也找不到对应的code了,这里重新记录一下,省的自己忘记了。
Spring Security的功能原理:
验证和鉴权

spring security 动态拦截器验证机制
spring security 中加密的方式是如何的
正常流程走,一般验证密码需要走
1. UsernamePasswordAuthenticationFilter.attemptAuthentication(),会调用AuthenticationManager
.authenticate(usernamePasswordAuthenticationToken)方法,
2. AuthenticationManager的实现类providerManager, 会调用
providerManger.authenticate(authentication), 里面会调用 List<AuthenticationProvider> providers, 多个调用providers,
3. 每个provider会调用方法authenticate(authentication), authenticationProvider实现类AbstractUserDetailsAuthenticationProvider,
它会调用方法authenticate(authentication),会调用retrieveUser(username, UsernamePasswordAuthenticationToken),
4. 会调用继承类daoAuthenticationProvider.retrieveUser方法,会调用getUserDetailsService().loadUserByUsername(username),
上面这个是用于存储user信息与权限信息,
5. 在类AbstractUserDetailsAuthenticationProvider调用authenticate(authentication)中还需要调用additionalAuthenticationChecks(UserDetails, UsernamePasswordAuthenticationToken), 主要是验证密码的, 会调用
daoAuthenticationProvider.additionalAuthenticationChecks()方法,会调用passwordEncoder.isPasswordValid(userDetails.getPassword(),
presentedPassword, salt),
6. 主要看passwordEncoder的实现类,
这个实现类在configure(AuthenticationManager)配置userDetailsService和passwordEncoder。
passwordEncoder的实现类有两种类,
一种是org.springframework.security.authentication.encoding.PasswordEncoder
另一种是org.springframework.security.crypto.password.PasswordEncoder,
authentication.****.passwordEncoder的实现有PlaintextPasswordEncoder、Md5PasswordEncoder、MessageDigestPasswordEncoder、
LdapShaPasswordEncoder等等,这些类中有一个isPasswordValid方法,用于验证密码,
crypto.*****.PasswordEncoder的实现有BCryptPasswordEncoder、StandardPasswordEncoder,
主要有两个方法encode(rawPassword)、matches(rawpassword, encodedPassword),
encode主要是用于对密码进行加密,matches主要是对密码进行对比
试一下无encode会如何, 还是成功登录
网友评论