开发者学堂课程【Spring Security知识精讲与实战演示(三):分布式整合之实现思路分析】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/732/detail/13068
分布式整合之实现思路分析
分布式整合的整体思路
分布式认证的思路,默认情况下,用户认证的时候,使用的是usernamepasswordauthentication方法实现的验证。
认证成功之后,过滤应用之后进行查看后,可以看到它只接收post的请求,不是post请求,会报错。
但现在要进行分布式,需要修改成符合的模式进行修改,因此需要进行重写这个方法。在此页面其实就是接收到username和password。
传过来之后,需要分装一个userpassworduthentication的对象直接往下传即可。
后续的步骤就是框架自己完成,会去验证密码和用户名是否正确。
)else(
String username = this.obtainUsername(request);
String password = this.obtainPassword(request);
if(username == null) (
username =排A
if(password== null) [
password="”
username =username.trim();
UsernamePasswordAuthenticationToken
authRequest = new UsernamePasswordAuthenticationToken(username, password); this.setDetails(request, authRequest);
return this.getAuthegticationManager().authenticate(authRequest);
protected String obtainPassword(HttpServletRequest request) (return request.getParameter(this.passwordParameter);)
成功之后的操作在filter里面查看到一个seccussful的页面,成功之后直接将结果放到了userpassworduthentication中,得到了自己的容器。名字叫securitycontext,相当于在容器中放入了一个认证通过的对象。但这里面很明显不是想要的结果,如果认证成功,首先发起认证,系统需要判断是否成功,成功是发放一个令牌,而不是筛选一个对象。
rotected
void
successfulAuthentication(HttpServletRequest
request, HttpServletResponse response, FilterChain chain, Authentication if(this.logger.isDebugEnabled())(
this.
logger.debug(0:"Authentication
success.
Updating SecurityContextHolder to contain:" + authResult);
SecurityContextHolder.getContext().setAuthentication(authResult);
this.rememberleServices.
loginSuccess(request, response, authResult);
if (this.eventPublisher!= null) (
this.erentPublisher.publishEvent
(new
InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
this. successHandler.onAuthenticationSuccess(request, response, authResult);
rotected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) SecurityContextHolder.clearContext();
if (this.logger.isDebugEnabled())(
this. logger.debug( o:"Authentication request failed:"+ failed.toString(), failed);
上述为认证流程的分析。
1.用户认证
由于,分布式项目,多数是前后端分离的架构设计,我们要满足可以接受异步post的认证请求参数,需要修改UsernamePasswordAuthenticationFilter过滤器中attemptAuthentication方法,让其能够接收请求体。
另外,默认successfulAuthentication方法在认证通过后,是把用户信息直接放入session就完事了,现在我们需要修改这个方法,在认证通过后生成token并返回给用户。
2.身份校验
原来BasicAuthenticationFilter过滤器中doFilterInternal方法校验用户是否登录,就是看session中是否有用户信息,我们要修改为,验证用户携带的token是否合法,并解析出用户信息,交给SpringSecurity,以便于后续的授权功能可以正常使用。
需要重写BasicAuthenticationFilter过滤器中doFilterInternal方法。到此,分析完成分布式认证要做的就是自定义俩个过滤器,进行重新的分析认证即可。