Spring源代码解析(十):Spring Acegi框架授权的实现(6页).doc
《Spring源代码解析(十):Spring Acegi框架授权的实现(6页).doc》由会员分享,可在线阅读,更多相关《Spring源代码解析(十):Spring Acegi框架授权的实现(6页).doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-Spring源代码解析(十):Spring Acegi框架授权的实现-第 7 页Spring源代码解析(十):Spring Acegi框架授权的实现我们从FilterSecurityInterceptor我们从入手看看怎样进行授权的: Java代码 1. /这里是拦截器拦截HTTP请求的入口 2. publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain) 3. throwsIOException,ServletException 4. FilterInvocationfi=newFil
2、terInvocation(request,response,chain); 5. invoke(fi); 6. /这是具体的拦截调用 7. publicvoidinvoke(FilterInvocationfi)throwsIOException,ServletException 8. if(fi.getRequest()!=null)&(fi.getRequest().getAttribute(FILTER_APPLIED)!=null) 9. &observeOncePerRequest) 10. /在第一次进行过安全检查之后就不会再做了 11. fi.getChain().doFilt
3、er(fi.getRequest(),fi.getResponse(); 12. else 13. /这是第一次收到相应的请求,需要做安全检测,同时把标志为设置好-FILTER_APPLIED,下次就再有请求就不会作相同的安全检查了 14. if(fi.getRequest()!=null) 15. fi.getRequest().setAttribute(FILTER_APPLIED,Boolean.TRUE); 16. /这里是做安全检查的地方 17. InterceptorStatusTokentoken=super.beforeInvocation(fi); 18. /接着向拦截器链执
4、行 19. try 20. fi.getChain().doFilter(fi.getRequest(),fi.getResponse(); 21. finally 22. super.afterInvocation(token,null); TTP请求的入口 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException FilterInvocation fi = new FilterInvocation
5、(request, response, chain); invoke(fi);/这是具体的拦截调用 public void invoke(FilterInvocation fi) throws IOException, ServletException if (fi.getRequest() != null) & (fi.getRequest().getAttribute(FILTER_APPLIED) != null) & observeOncePerRequest) /在第一次进行过安全检查之后就不会再做了 fi.getChain().doFilter(fi.getRequest(), f
6、i.getResponse(); else /这是第一次收到相应的请求,需要做安全检测,同时把标志为设置好 - FILTER_APPLIED,下次就再有请求就不会作相同的安全检查了 if (fi.getRequest() != null) fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE); /这里是做安全检查的地方 InterceptorStatusToken token = super.beforeInvocation(fi); /接着向拦截器链执行 try fi.getChain().doFilter(fi.getRequ
7、est(), fi.getResponse(); finally super.afterInvocation(token, null);我们看看在AbstractSecurityInterceptor是怎样对HTTP请求作安全检测的: Java代码 1. protectedInterceptorStatusTokenbeforeInvocation(Objectobject) 2. Assert.notNull(object,Objectwasnull); 3. if(!getSecureObjectClass().isAssignableFrom(object.getClass() 4. t
8、hrownewIllegalArgumentException(Securityinvocationattemptedforobject5. +object.getClass().getName() 6. +butAbstractSecurityInterceptoronlyconfiguredtosupportsecureobjectsoftype:7. +getSecureObjectClass(); 8. /这里读取配置FilterSecurityInterceptor的ObjectDefinitionSource属性,这些属性配置了资源的安全设置 9. ConfigAttributeD
9、efinitionattr=this.obtainObjectDefinitionSource().getAttributes(object); 10. if(attr=null) 11. if(rejectPublicInvocations) 12. thrownewIllegalArgumentException( 13. NopublicinvocationsareallowedviathisAbstractSecurityInterceptor.14. +Thisindicatesaconfigurationerrorbecausethe15. +AbstractSecurityInt
10、erceptor.rejectPublicInvocationspropertyissettotrue); 16. if(logger.isDebugEnabled() 17. logger.debug(Publicobject-authenticationnotattempted); 18. publishEvent(newPublicInvocationEvent(object); 19. returnnull;/nofurtherworkpost-invocation 20. if(logger.isDebugEnabled() 21. logger.debug(Secureobject
11、:+object.toString()+;ConfigAttributes:+attr.toString(); 22. /这里从SecurityContextHolder中去取Authentication对象,一般在登录时会放到SecurityContextHolder中去 23. if(SecurityContextHolder.getContext().getAuthentication()=null) 24. credentialsNotFound(messages.getMessage(AbstractSecurityInterceptor.authenticationNotFound
12、, 25. AnAuthenticationobjectwasnotfoundintheSecurityContext),object,attr); 26. /如果前面没有处理鉴权,这里需要对鉴权进行处理 27. Authenticationauthenticated; 28. if(!SecurityContextHolder.getContext().getAuthentication().isAuthenticated()|alwaysReauthenticate) 29. try/调用配置好的AuthenticationManager处理鉴权,如果鉴权不成功,抛出异常结束处理 30.
13、authenticated=this.authenticationManager.authenticate(SecurityContextHolder.getContext() 31. .getAuthentication(); 32. catch(AuthenticationExceptionauthenticationException) 33. throwauthenticationException; 34. /Wedontauthenticated.setAuthentication(true),becauseeachprovidershoulddothat 35. if(logge
14、r.isDebugEnabled() 36. logger.debug(SuccessfullyAuthenticated:+authenticated.toString(); 37. /这里把鉴权成功后得到的Authentication保存到SecurityContextHolder中供下次使用 38. SecurityContextHolder.getContext().setAuthentication(authenticated); 39. else/这里处理前面已经通过鉴权的请求,先从SecurityContextHolder中去取得Authentication 40. authen
15、ticated=SecurityContextHolder.getContext().getAuthentication(); 41. if(logger.isDebugEnabled() 42. logger.debug(PreviouslyAuthenticated:+authenticated.toString(); 43. /这是处理授权的过程 44. try 45. /调用配置好的AccessDecisionManager来进行授权 46. this.accessDecisionManager.decide(authenticated,object,attr); 47. catch(
16、AccessDeniedExceptionaccessDeniedException) 48. /授权不成功向外发布事件 49. AuthorizationFailureEventevent=newAuthorizationFailureEvent(object,attr,authenticated, 50. accessDeniedException); 51. publishEvent(event); 52. throwaccessDeniedException; 53. if(logger.isDebugEnabled() 54. logger.debug(Authorizationsu
17、ccessful); 55. AuthorizedEventevent=newAuthorizedEvent(object,attr,authenticated); 56. publishEvent(event); 57. /这里构建一个RunAsManager来替代当前的Authentication对象,默认情况下使用的是NullRunAsManager会把SecurityContextHolder中的Authentication对象清空 58. AuthenticationrunAs=this.runAsManager.buildRunAs(authenticated,object,att
18、r); 59. if(runAs=null) 60. if(logger.isDebugEnabled() 61. logger.debug(RunAsManagerdidnotchangeAuthenticationobject); 62. /nofurtherworkpost-invocation 63. returnnewInterceptorStatusToken(authenticated,false,attr,object); 64. else 65. if(logger.isDebugEnabled() 66. logger.debug(SwitchingtoRunAsAuthe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring源代码解析十:Spring Acegi框架授权的实现6页 Spring 源代码 解析 Acegi 框架 授权 实现
限制150内