我正在学习 Spring Core 认证,但不清楚如何将 Spring Security 项目配置到应用程序中。
在类(class)文档中我找到了这两个代码片段:
1) web.xml中的配置:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我对 Java EE(以及 Spring)还很陌生,所以在线阅读时我了解到这个过滤器类似于 Servlet,它对资源(servlet 或静态内容)的请求或来自资源的响应或两者执行过滤任务。因此,如果标准 Servlet 是用于处理请求、创建内容并给出响应的对象(例如,处理 HttpRequest 的 HttpServlet,并给出包含要显示的 View 的 HttpResponse),则 Filter 不会创建内容,而是精心设计资源。
因此,过滤器是 Java 类,可在 Servlet 编程中用于以下目的:
- 在客户端访问后端资源之前拦截来自客户端的请求
- 在将来自服务器的响应发送回客户端之前对其进行操作
规范中建议存在各种类型的过滤器作为身份验证过滤器(这是 Spring Security 用于此任务的类型吗?)
那么声明并映射到前面的代码片段中的过滤器到底做了什么?我认为它将 springSecurityFilterChain 应用于所有指向 /* URL 模式的请求(我认为这意味着所有最终声明处理请求的 servlet)。
好的,但是这个springSecurityFilterChain到底是什么?。看这里:http://docs.spring.io/spring-security/site/docs/3.0.x/reference/security-filter-chain.html
在我看来,Spring 不使用单个过滤器,但是这个 springSecurityFilterChain 在内部维护一个过滤器链(因此它使用更多过滤器),其中每个过滤器都有特定的职责,并且根据需要的服务在配置中添加或删除过滤器。
但是这些过滤器到底是在哪里声明的呢?
2)类(class)幻灯片中显示的第二个代码片段是这个(我无法理解它是否与前一个代码片段相关\链接):
<beans>
<security:http>
<security:intercept-url pattern="/accounts/edit*"
access="ROLE_ADMIN" />
<security:intercept-url pattern="/accounts/account*"
access="ROLE_ADMIN,ROLE_USER" />
<security:intercept-url pattern="/accounts/**"
access="IS_AUTHENTICATED_FULLY" />
<security:intercept-url pattern="/customers/**"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
</security:http>
</beans>
据我了解,它会拦截 url,并且这些拦截的 URL 会按列出的顺序进行评估(使用第一个匹配项,将特定匹配项放在前面)。
例如,如果 URL 与 /accounts/edit* 模式匹配,则会应用 ROLE_ADMIN 访问级别。但这到底是什么?这是我必须写的东西还是Spring框架提供的东西?
其他疑问是:第二个代码片段是在哪里声明的?进入XML Spring配置文件?它与第一个代码片段有何关系(如果存在关系)?
Tnx
最佳答案
- DelegatingFilterProxy 顾名思义,它仅将 Web 容器过滤器请求委托(delegate)给 Spring Security 过滤器链,并且从未实现 Servlet Filter。 Spring security 过滤器链定义在 spring-security.xml 文件中,如果我们为 http 请求设置自动配置属性,则所有过滤器链都会添加。
可以单独添加每个安全过滤器,例如
<bean id="filterSecurityInterceptor"
class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="securityMetadataSource">
<security:filter-security-metadata-source>
<security:intercept-url pattern="/secure/super/**" access="ROLE_WE_DONT_HAVE"/>
<security:intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR,ROLE_TELLER"/>
</security:filter-security-metadata-source>
</property>
</bean>
并且bean定义xml文件名通过
添加到web容器中<init-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath:**/*-security.xml</param-value>
</init-param>
默认情况下,spring 提供了几组角色。当您在 bean 定义中使用安全上下文时,它会执行很多操作。我们只需要添加 spring-security.jar 文件。甚至您可以使用 ldap 服务器进行身份验证,我们可以将其放入
如果我们想添加您自己的一套身份验证管理器服务,可以通过添加自定义身份验证管理器服务来完成。
<authentication-manager>
<authentication-provider user-service-ref='myUserDetailsService'/>
</authentication-manager>
安全命名空间有很多魔力,这在 http://docs.spring.io/spring-security/site/docs/3.0.x/reference/technical-overview.html#tech-intro-config-attributes , http://docs.spring.io/spring-security/site/docs/3.0.x/reference/ns-config.html
关于java - 这个 Spring Security 配置到底意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28127703/