如何集成 Spring Security 和 Struts2

Posted

技术标签:

【中文标题】如何集成 Spring Security 和 Struts2【英文标题】:How to integrate Spring Security and Struts2 【发布时间】:2012-12-29 07:56:43 【问题描述】:

我已经在谷歌上搜索了很多关于这个问题的内容,但到目前为止,我找不到任何关于集成 Struts2 和 Spring Security 的教程。

我的问题是?

如果我希望限制某些操作或页面,例如管理页面/url 只能由管理员访问,以及其他类似的事情,如果用户尝试访问该页面,他或她将被重定向到另一个页面。

【问题讨论】:

你到底有什么问题? 我不知道从哪里开始,一个简单的例子就可以了。 只需遵循一些 spring-security 教程/示例。 Struts2 Action 类不会有任何变化吗?还是struts2.xml?我真的会放一个security.xml吗? 【参考方案1】:

这实际上非常简单 - 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 安全配置(在 web.xml 中 contextConfigLocation 参数中提到的文件中):

<?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,但文档对此进行了很好的解释。

【讨论】:

我会先研究一下 Spring Security。那我就回去了 @theadam spring 的文档链接已损坏 @granz 感谢您的提示,现已更新。他们已经迁移了文档。该链接现在有效。【参考方案2】:

假设您需要保护/admin/* 路径上可访问的内容。您需要在 web.xml 中声明 Spring Security 过滤器,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>

然后你声明你的 spring 安全上下文:

<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 之类的URL 就会自动绑定到一个名为com.foo.bar.actions.LoginAction 的类。 LogoutAction也一样

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

最后,在您的 JSP 中,您可以检查某人是否是管理员:

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

其余的可以在任何 Spring Security 教程中找到。真正重要的是过滤器声明的顺序,spring security 必须是第一位的。

编辑:在google上搜索,也有this link可以帮到你。

【讨论】:

我不会在动作类中注释 hasRole 吗? 如果您需要在 Java 操作类中执行此操作,可以使用 SecurityContextHolderAwareRequestWrapper.isUserInRole("ROLE_ADMIN") 进行检查 有没有关于注解的教程?专门用于struts2? 有一个名为 struts2-annotation: struts.apache.org/2.2.1/docs/struts-2-annotations.html 的插件以及 @PreAuthorize 等 static.springsource.org/spring-security/site/docs/3.0.x/… 等弹簧安全插件 如果我下载 struts2-annotation,它会自动拥有 @PreAuthorize 吗?

以上是关于如何集成 Spring Security 和 Struts2的主要内容,如果未能解决你的问题,请参考以下文章

如何集成 Spring Security 和 Struts2

如何将 spring security 与 rest oauth2 服务和 spring social 集成?

Angular集成Spring Boot,Spring Security,JWT和CORS

如何将 Spring Security 与我现有的 REST Web 服务集成

Security安全认证 | Spring Boot如何集成Security实现安全认证

Spring Boot如何集成Security实现安全认证