接学习笔记12,
2. 处理安全上下文(security context)
HTTP是一个无状态协议,因此如果HTTP不能记住你的信息,你每次提交请求都需要登陆。基于Java的web应用使用会话来保存来保存请求的数据。在Spring中,一个请求最先被传递给HttpSessionContextIntegrationFilter。这个filter负责读取用户的身份信息,配置方法如下:
<bean id=”httpSessionIntegrationFilter”
class=”org.acegisecurity.context.HttpSessionContextIntegrationFilter” />
当一个请求到来时,HttpSessionContextIntegrationFilter会检查会话中是否包含用户验证信息。如果包含,Spring就会在当前请求中使用该验证信息。请求结束后,HttpSessionContextIntegrationFilter会把认证信息放回到session中以备下次使用。
如果HttpSessionContextIntegrationFilter在会话中找到了用户的验证信息,那么用户就不需要重新登录。如果没有找到,那么就需要配置一个身份验证filter,也就是下一个要讨论的filter——FilterChainProxy。
3. 用户登录
身份验证工作需要一个验证入口点(authentication entry point)和一个验证处理filter。验证入口点提供登录界面,让用户输入用户名密码。验证处理filter负责对登录用户进行身份验证。Spring提供了5对<入口点,fliter>。先从最常用的说起:BasicProcessingFilterEntryPoint,BasicProcessingFilter。
·基本认证方式:基于web的认证方式。它向浏览器发送HTTP401(未授权)响应。浏览器收到响应后弹出对话框提示用户输入用户名密码。用户登录之后,浏览器向服务器发送消息开始进行身份认证。如果成功,定向到指定的URL;反之服务器再次发送HTTP401响应表明重新登录。Spring中配置BasicProcessingFilterPoint方法如下:
<bean id=”authenticationEntryPoint”
class=”org.acegisecurity.ui.basicauth. BasicProcessingFilterPoint”>
<property name=”realmName” value=”RoadRantz” />
</bean>
realmName属性可以是任意字符串,通常都是一些登录提示信息。用户点击OK按钮之后,用户名密码信息封装在HTTP头部一同被送至服务器端。这时,BasicProcessingFilter将其取出并处理:
<bean id=”authenticationProcessingFilter”
class=”org.acegisecurity.ui.basicauth. BasicProcessingFilter”>
<property name=”authenticationManager” ref=”authenticationManager”/>
<property name=”authenticationEntryPoint
ref=”authenticationEntryPoint” />
</bean>
BasicProcessingFilter把用户名密码封装在HTTP头部并把它们发送给认证管理器。如果成功,一个Authentication对象放入会话以便未来使用;如果失败,控制权交给一个验证入口点供用户再次登录。
基本认证方式有一些缺点:浏览器提供的登录对话框不能满足各种应用的要求。因此你就需要使用AuthenticationProcessingFilterEntryPoint。
·基于表格的验证
AuthenticationProcessingFilterEntryPoint提供用户一个基于HTML的登录表格。对于RoadRantz应用来说,配置如下:
<bean id=”authenticationEntryPoint”
class=”….AuthenticationProcessingFilterEntryPoint”/>
<property name=”loginFormUrl” value=”/login.htm” />
<property name=”forceHttps” value=”true” />
</bean>
loginFormUrl属性设置成一个URL,该URL会显示在登录页面上。forceHttps属性设置为true表明登录页面使用采用ssl的http,即使最初的请求没有采用ssl。
这里loginFormUrl设置为/login.htm,它和Spring的MVC类
UrlFilenameViewController关联。但是,无论登录页面如何显示,其HTML代码都包含下面的内容:
<form method=”POST” action=”j_acegi_security_check”>
<b>Username: </b><input type=”text” name=”j_username”><br>
<b>Password: </b><input type=”password” name=”j_password”><br>
</form>
AuthenticationProcessingFilter会用到属性action,输入框j_username和j_password。其配置方法如下:
<bean id=”authenticationProcessingFilter”
class=”….AuthenticationProcessingFilter”>
<property name=”filterProcessfingUrl” value=”/j_acegi_security_check” />
<property
name=”authenticationFailureUrl” value=”/login.htm?login_error=1”/>
<property name=”defaultTargetUrl” value=”/” />
<property name=”authenticationManager” ref=”authenticationManager”/>
</bean>
filterProcessesUrl属性表明了要被解析的URL地址,默认值是/j_acegi_security_check,但你也可以自行修改其值。authenticationFailureUrl属性设置了当认证失败时被定向到的页面。
通常情况下,如果认证成功,AuthenticationProcessingFilter会将一个Authentication对象放入session中并且重定向到用户指定的页面。defaultTargetUrl属性指定了当目标URL不可达时的默认定向页面。authenticationManager属性声明了一个authenticationManager bean。和其他认证处理filter一样,AuthenticationProcessingFilter也依赖于认证管理器的帮助。