Spring技术内幕——深入解析Spring架构与设计原理(六)Spring ACEGI
Spring ACEGI
作为Spring丰富生态系统中的一个非常典型的应用,安全框架Spring ACEGI的使用是非常普遍的。尽管它不属于Spring平台的范围,但由于它建立在Spring的基础上,因此可以方便地与Spring应用集成,从而方便的为基于Spring的应用提供安全服务。
作为一个完整的Java EE安全应用解决方案,ACEGI能够为基于Spring构建的应用项目,提供全面的安全服务,它可以处理应用需要的各种典型的安全需求;例如,用户的身份验证、用户授权,等等。ACEGI因为其优秀的实现,而被Spring开发团队推荐作为Spring应用的通用安全框架,随着Spring的广泛传播而被广泛应用。在各种有关Spring的书籍,文档和应用项目中,都可以看到它活跃的身影。
Spring ACEGI的基本实现
关于ACEGI的基本设置,在这里就不多啰嗦了。我们关心的是ACEGI是怎样实现用户的安全需求的,比如最基本的用户验证,授权的工作原理和实现。
在ACEGI配置中,是通过AuthenticationProcessingFilter的过滤功能来启动Web页面的用户验证实现的。AuthenticationProcessingFilter过滤器的基类是AbstractProcessingFilter,在这个AbstractProcessingFilter的实现中,可以看到验证过程的实现模板,在这个实现模板中,可以看到它定义了实现验证的基本过程,如以下代码所示:
public void decide(Authentication authentication, Object object, ConfigAttributeDefinition config) throws AccessDeniedException { //取得配置投票器的迭代器,可以用来遍历所有的投票器 Iterator iter = this.getDecisionVoters().iterator(); int deny = 0; while (iter.hasNext()) { //取得当前投票器的投票结果 AccessDecisionVoter voter = (AccessDecisionVoter) iter.next(); int result = voter.vote(authentication, object, config); //对投票结果进行处理,如果是遇到ACCESS_GRANT的结果,授权直接通过 //否则,累计ACCESS_DENIED的投票票数 switch (result) { case AccessDecisionVoter.ACCESS_GRANTED: return; case AccessDecisionVoter.ACCESS_DENIED: deny++; break; default: break; } }//如果有反对票,那么拒绝授权 if (deny > 0) { throw new AccessDeniedException(messages.getMessage("AbstractAccessDecisionManager.accessDenied", "Access is denied")); }// 这里对弃权票进行处理,看看是全是弃权票的决定情况,默认是不通过,这种处理情况,是由allowIfAllAbstainDecisions变量来控制的 // To get this far, every AccessDecisionVoter abstainedcheckAllowIfAllAbstainDecisions(); }