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