《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)
?
手动配置Spring Security设施的bean???????? 自己构建并织入所有需要的bean,将为你提供很高的灵活性和自定义功能,这是通过security命名空间的<http>风格配置所不允许的。
【我们不是开玩笑地说构建所需的bean是很复杂的。即使一个必须的bean都可能需要多达25个单独的bean。,这需要开发人员明确理解bean之间的依赖关系以及每个bean的所有属性。记住,一旦你不再使用基于XML命名空间的便利配置方式,就会与Spring Security代码和整体结构更密切相关了。Security XML命名空间提供了一层很受欢迎的抽象并能很好地满足大多数的需求。】
???????? 希望到本书的这个地方,你已经理解了请求处理架构和相关的主要组件,这样的话,面对大量需要配置的bean才不会感到吃惊。完全理解表面下所有的组件,对于配置每个bean来说是很有用的。
???????? 我们将会花些时间来介绍自己搭建Spring Security基础设施时所需要的主要组成部分。注意的是在有些场景下,当没有必要进行阐述时,我们将会省略一些没有意思bean的细节;但是,完整的配置文件(在本章源码中的dogstore-explicit-base.xml中)需要支持它。现在让我们进入主要的配置过程。
总体理解Spring Security bean的依赖关系
?需要记住的是,这个图中包含的bean超过了是系统启动和运行所需要的最少值。我们将会渐进的阐述怎样添加所有的bean,从最小的集合开始,并逐渐构建出与用security命名空间相匹配的功能。
<display-name>Dog Store</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/dogstore-explicit-base.xml </param-value> </context-param>
?我们不再需要单独dogstore-security.xml文件了,这个文件是我们为了使用XML security命名空间声明而创建的。我们大多数的配置将会使用Spring标准的bean注入语法,但有少量的security命名空间装饰器在里面。
配置一个最小的Spring Security环境<bean id="springSecurityFilterChain" filters=" securityContextPersistenceFilter, usernamePasswordAuthenticationFilter, anonymousAuthenticationFilter, filterSecurityInterceptor" /> </security:filter-chain-map></bean>
?你可以看到这里我们已经引用了security命名空间。尽管可以使用手动的方式来配置需要bean的属性以建立路径模式匹配和过滤器列表组合,但是使用security命名空间的filter-chain-map包装器更简便和便利。如果将这与<http>风格的配置进行对比的话,我们要注意以下的配置元素:
需要意识到很重要的一点是,不同于Spring的一些配置(比较明显的如,在web.xml中的contextConfigLocation),在过滤器的名字之间需要需要使用逗号分隔。
?
?
你会意识到<filter-chain>元素引用了很多逻辑beandefinitions,而它们还没有进行定义。现在对它们进行定义,并逐个进行详细介绍。
配置最少的servlet过滤器集合<bean id="securityContextPersistenceFilter" name="code"><bean id="UsernamePasswordAuthenticationFilter" ref="customAuthenticationManager"/></bean>?
?
<bean id="anonymousAuthenticationFilter" value="anonymousUser,ROLE_ANONYMOUS"/> <property name="key" value="BF93JFJ091N00Q7HF"/></bean>
?列出的这两个属性都是需要的。userAttribute属性声明了为匿名用户提供的用户名和GrantedAuthority。用户名和GrantedAuthority可能在我们的应用中原来验证用户是不是匿名用户。Key可能是随机生成的,但是需要在一个bean中使用(o.s.s.authentication.AnonymousAuthenticationProvider),我们稍后将会进行配置。
FilterSecurityInterceptor<bean id="filterSecurityInterceptor" ref="customAuthenticationManager"/> <property name="accessDecisionManager" ref="affirmativeBased"/> <property name="securityMetadataSource"> <security:filter-security-metadata-source> <security:intercept-url pattern="/login.do" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <security:intercept-url pattern="/ home.do" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <security:intercept-url pattern="/ account/*.do" access="ROLE_USER"/> <security:intercept-url pattern="/*" access="ROLE_USER"/> </security:filter-security-metadata-source> </property></bean>
?在继续阅读之前请思考一下。没错,它看起来和我们在使用security命名空间的<http>配置的<intercept-url>声明一样。模式匹配和访问声明格式完全一致,但是你会发现在本例中我们使用了一些配置魔法来使用相同的声明在上下文中建立正常的Spring bean属性。
<bean id="affirmativeBased"> <property name="decisionVoters"> <list> <ref bean="roleVoter"/> <ref bean="authenticatedVoter"/> </list> </property></bean><bean id="roleVoter"/><bean id="authenticatedVoter"/><bean id="daoAuthenticationProvider" ref="jdbcUserService"/></bean><bean id=”anonymousAuthenticationProvider” class=”org.springframework.security.authentication.AnonymousAuthenticationProvider”> <property name=”key” value=”BF93JFJ091N00Q7HF”/></bean>
?这个配置为我们提供了一个最小的配置支持匿名浏览、登录以及数据库后台的认证(注意的是为了简洁我们省略了需要的jdbcUserService和dataSource beans——这些bean的定义与前面的定义没有什么变化)。记住,AnonymousAuthenticationProvider的key属性必须与我们前面定义的AnonymousAuthenticationFilter的key属性相匹配。
<bean id="customAuthenticationManager" class="org.springframework .security.authentication.ProviderManager"> <property name="providers"><list> <ref local="daoAuthenticationProvider"/> <ref local=”anonymousAuthenticationProvider”/></list></property></bean>
?AuthenticationManager的配置在这里看起来很简单,但是明确配置这个bean是很多有用增强和扩展框架的关键,这些我们将会在本章的剩余部分讲解。
???????? 在手动配置bean的所有工作完成后,我们的站点依旧不支持我们用security配置时的一些功能,包括退出功能、友好的异常处理、密码salting以及remember? me。所以,这些为什么还有价值呢?(译者注:作者的这个反问应该指的是手动配置的意义在哪里。)
1 楼 shizhijie737 2011-10-21 楼主是好人啊,我看这本书2遍了,东西多,又是英文,确实痛苦。