认证处理过滤器authenticationProcessingFilter的配置
- < bean id = "authenticationProcessingFilter" class = "org.acegisecurity.ui.webapp.AuthenticationProcessingFilter" >
- < property name = "filterProcessesUrl" value = "/j_security_check" />
- < property name = "authenticationFailureUrl" value = "/index.jsp?login_error=1" />
- < property name = "defaultTargetUrl" value = "/main.do" />
- < property name = "authenticationManager" ref = "authenticationManager" />
- < property name = "rememberMeServices" ref = "" /> <!-可选 -- >
- </ bean >
- 说明:
- 1)负责处理基于表单的身份验证请求。
- 2)当接收到与filterProcessesUrl所定义相同的请求时,它会首先通过AuthenticationManager来验证用户身份。如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面。如果验证失败,则再从 rememberMeServices中获取用户身份。若再获取失败,则重定向到auhenticationFailureUrl所定义的登陆失败页面。
- 3)filterProcessesUrl:默认值为/j_acegi_security_check。该值必须与登录页面form的action值一致。
- form中输入用户名的input控件的name必须为j_username;输入密码的input控件的name必须为j_password。
- 4)rememberMeServices 负责通过以cookie的形式保存先前的用户登录信息。在Authentication对象不存在时, rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookies 中获取用户登录信息,如果存在则返回Authentication对象。在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功后,则会调用loginSuccess()方法记录用户信息在cookies中,否则调用loginFail()方法清除cookie。
认证管理器authenticationManager的配置
- < bean id = "authenticationManager" class = "org.acegisecurity.providers.ProviderManager" >
- < property name = "providers" >
- < list >
- < ref local = "daoAuthenticationProvider" />
- < ref local = "anonymousAuthenticationProvider" />
- </ list >
- </ property >
- </ bean >
- 说明:
- 1)认证管理器用来管理身份验证提供者。它将验证的功能委托给多个Provider,并通过遍历Providers, 以保证获取不同来源的身份认证,若某个Provider能成功确认当前用户的身份,authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象,否则会抛出一个AuthenticationException。
- 2)无论成功与否,认证管理器都会发布一个ApplicationEvent事件对象。
身份验证提供者的配置
- < bean id = "daoAuthenticationProvider" class = "org.acegisecurity.providers.dao.DaoAuthenticationProvider" >
- < property name = "userDetailsService" ref = "userDao" />
- < property name = "userCache" ref = "userCache" />
- < property name = "passwordEncoder" ref = "passwordEncoder" /> <!-可选 -- >
- </ bean >
- < bean id = "anonymousAuthenticationProvider" class = "org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider" >
- < property name = "key" value = "anonymous" />
- </ bean >
- < bean id = "userDao" class = "com.cjm.web.dao.impl.UserDaoImpl" >
- < property name = "sessionFactory" ref = "sessionFactory" />
- </ bean >
- < bean id = "userCache" class = "org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache" >
- < property name = "cache" >
- < bean class = "org.springframework.cache.ehcache.EhCacheFactoryBean" >
- < property name = "cacheManager" >
- < bean class = "org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />
- </ property >
- < property name = "cacheName" value = "userCache" />
- </ bean >
- </ property >
- </ bean >
- < bean id = "passwordEncoder" class = "org.acegisecurity.providers.encoding.Md5PasswordEncoder" />
- 说明:
- 1)daoAuthenticationProvider:负责提供用户信息,包括用户名和密码。其中取用户名密码的工作交给userDetailsService来做。
- 2)anonymousAuthenticationProvider:匿名用户身份验证。
- 3)userDao:用于在数据库中获取用户信息。UserDaoImpl需要实现Acegi 提供的UserDetailsService接口类。
- 4)userCache:缓存用户和资源相对应的权限信息。每当请求一个受保护资源时,daoAuthenticationProvider就会被调用以获取用户授权信息。如果每次都从数据库获取的话,那代价很高,对于不常改变的用户和资源信息来说,最好是把相关授权信息缓存起来。
- 5)passwordEncoder:使用加密器对用户输入的明文进行加密。Acegi 提供了三种加密器:
- PlaintextPasswordEncoder---默认,不加密,返回明文
- ShaPasswordEncoder---哈希算法(SHA)加密
- d5PasswordEncoder---消息摘要(MD5)加密