《Spring Security3》第二章第三部分翻译(上)(转载)
安全的复杂之处:安全web请求的架构
?Spring Security在XML配置文件中的自动配置属性,建立了十个servlet过滤器,它们通过使用Java EE的servlet过滤器链按顺序组合起来。Filter chain是Java EE Servlet API的一个概念,通过接口javax.servlet.FilterChain进行定义,它允许在web应用中的一系列的servlet过滤器能够应用于任何给定的请求。
?正如你能从链这个词汇中推断出的那样,servlet请求按照一定的顺序从一个过滤器到下一个穿过整个过滤器链,最终到达目标servlet。与之相对的是,当servelt处理完请求并返回一个response时,过滤器链按照相反的顺序再次穿过所有的过滤器。
?站在一个较高层次上看,你可以看到有三个主要的组件负责这项重要的事情:
?让我们看一下在较高层次示意图中反映出的抽象工作流程,并将其细化到这个基于表单认证的具体实现。你可以看到UsernamePasswordAuthenticationFilter负责(通过代理从它的抽象父类中)创建UsernamePasswordAuthenticationToken对象(Authentication接口的一个实现),并部分填充这个对象依赖的信息,这些信息来自HttpServletRequet。但是它是从哪里获取用户名和密码的呢?spring_security_login是什么?我们怎么到达这个界面的?
?URL的spring_security_login部分表明这是一个默认的登录的页面并且是在DefaultLoginPageGeneratingFilter中命名的。我们可以使用配置属性来修改这个页面的名字从而使得它对于我们应用来说是唯一的。
?正如你可能想象的那样,认证是相当可配置化的。大多数的Spring Security例子要么使用基于内存的用户凭证存储要么使用JDBC(在数据库中)的用户凭证存储。我们已经意识到修改JBCP Pets应用以实现数据库存储用户凭证是一个好主意,我们将会在第四章来处理这个配置变化。
异常类
何时抛出
extraInformation内容
BadCredentialsException
如何没有提供用户名或者密码与认证存储中用户名对应的密码不匹配
UserDetails
LockedException
如果用户的账号被发现锁定了
UserDetails
UsernameNotFoundException
如果用户名不存在或者用户没有被授予的GrantedAuthority
String(包含用户名)
这些以及其他的异常将会传递到过滤器链上,通常将会被request请求的过滤器捕获并处理,要么将用户重定向到一个合适的界面(登录或访问拒绝),要么返回一个特殊的HTTP状态码,如HTTP 403(访问被拒绝)。