如何集成Spring Security和Struts2

时间:2013-01-15 08:47:23

标签: java spring security struts2 spring-security

我已经针对这个问题进行了大量的谷歌搜索,到目前为止我找不到任何有关集成Struts2和Spring Security的教程。

我的问题是我如何集成Spring Security和Struts2?

我想要限制某些操作或页面,例如管理页面/网址只能由管理员访问,而其他类似的东西,如果用户试图访问该页面,他或她将被重定向到另一个页面。

2 个答案:

答案 0 :(得分:7)

假设您需要保护/admin/*路径上可访问的内容。您需要在web.xml中声明Spring Security Filter,Struts过滤器应该在之后,如果您正在访问/admin,Spring Security将首先处理请求并且能够让它根据用户的角色传递或阻止它:

<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>/admin/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

然后声明你的春季安全背景:

<http>
    <intercept-url pattern="/*" filters="none" />
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />           
    <form-login login-page="/login" />
    <logout logout-url="/logout" />
</http>

我建议您使用struts2-convention插件,以便像/login这样的网址自动绑定到名为let {s} com.foo.bar.actions.LoginAction的类。 LogoutAction

也是如此

现在,/admin/*下的内容应该由Spring Security保护,其余的应该直接转发到Struts2过滤器。

最后,在您的JSP中,您可以检查某人是否为Admin:

<sec:authorize access="hasRole('ROLE_ADMIN')">
   <p>you are an admin</p>
</sec:authorize>

其余的可以在任何Spring Security教程中找到。真正重要的是过滤器声明的顺序,弹簧安全性必须首先。

修改:在Google上搜索,还有this link可以为您提供帮助。

答案 1 :(得分:5)

这实际上非常简单 - Spring Security与Web框架无关:)

您需要定义Spring Security过滤器链 - 这是一个应该映射到所有请求的Java过滤器。过滤器将检查路径是否需要任何特权,如果是,则检查用户是否已登录并具有这些特权。

简单设置示例。

web.xml(插入现有的,与struts配置一起):

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:META-INF/spring/applicationContext-security.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<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>

Spring安全配置(在contextConfigLocation参数的web.xml中提到的文件中):

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<http pattern="/js/**" security="none" />
<http pattern="/css/**" security="none" />
<http pattern="/images/**" security="none" />

<http auto-config="false" use-expressions="true">
    <http-basic/>
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
    <session-management session-fixation-protection="newSession" />
</http>
</beans:beans>

您可以根据需要进行扩展 - Spring's documentation is rather well written

您可以选择更简单的自动配置:

<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

以上选项可根据请求路径保护您的网络应用。您可能也希望保护这些操作。添加以下内容可以帮助您:

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" proxy-target-class = "true" />

让我知道您需要什么功能,我可以指出您的方向。请记住,命名空间配置不是一个灵丹妙药 - 如果你需要一个非常自定义的解决方案,你可能需要自己配置所有的spring bean,但文档解释得很好。