如何使用Spring Security Oauth来保护Struts2 Rest服务

莱德马克

我在Spring Security Oauth的配置上苦苦挣扎,无法在Struts2应用程序上使用它来保护其余Web服务。我已经使用Spring Security很长时间了。

如果我很了解,问题是Spring安全性Oauth需要在root上设置spring mvc调度程序。这与Struts2冲突。

这是我的尝试

2)在根上使用Struts2,在/ oauth / *上使用Spring MVC

<!-- Struts 2 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/struts/*</url-pattern>
    </filter-mapping>

<servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

对于Oauth来说可以,但是Struts2不再起作用。

1)root上的Struts2和Spring MVC

<!-- Struts 2 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/struts/*</url-pattern>
    </filter-mapping>

<servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/oauth/*</url-pattern>
    </servlet-mapping>

在Struts2中,oauth可以识别权限,但是响应是在/ token而不是/ oauth / token上进行的,因此出现404错误。

spring-security.xml的摘录在这里:

<http pattern="/oauth/token" create-session="stateless"
        authentication-manager-ref="clientAuthenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" />
        <anonymous enabled="false" />
        <http-basic entry-point-ref="clientAuthenticationEntryPoint" />
        <!-- include this only if you need to authenticate clients via request 
            parameters -->
        <custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
        <access-denied-handler ref="oauthAccessDeniedHandler" />

</http>

<!-- This is where we tells spring security what URL should be protected 
    and what roles have access to them -->
<http pattern="/api/**.api" create-session="never"
    entry-point-ref="oauthAuthenticationEntryPoint"
    access-decision-manager-ref="accessDecisionManager"
    xmlns="http://www.springframework.org/schema/security">
    <anonymous enabled="false" />
    <intercept-url pattern="/api/**.api" access="ROLE_API" />
    <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
    <access-denied-handler ref="oauthAccessDeniedHandler" />
</http>
莱德马克

解决方案是使用2个不同的Spring Dispatcher:

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/oauth/*</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>rest-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>rest-dispatcher</servlet-name>
    <url-pattern>/restapi/*</url-pattern>
</servlet-mapping>

一个用于其余WS,另一个用于证券化。

之后,您将令牌投注在/ oauth / token上,而不是/ oauth / oauth / token上。

为了解决这个问题,您必须复制Spring Security Parameterization:

<http pattern="/oauth/token" create-session="stateless"
    authentication-manager-ref="clientAuthenticationManager"
    xmlns="http://www.springframework.org/schema/security">
    <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" />
    <anonymous enabled="false" />
    <http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <!-- include this only if you need to authenticate clients via request 
        parameters -->
    <custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
    <access-denied-handler ref="oauthAccessDeniedHandler" />
</http>

<http pattern="/oauth/oauth/token" create-session="stateless"
    authentication-manager-ref="clientAuthenticationManager"
    xmlns="http://www.springframework.org/schema/security">
    <intercept-url pattern="/oauth/oauth/token" access="IS_AUTHENTICATED_FULLY" />
    <anonymous enabled="false" />
    <http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <!-- include this only if you need to authenticate clients via request 
        parameters -->
    <custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
    <access-denied-handler ref="oauthAccessDeniedHandler" />
</http>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Security,无状态REST服务和CSRF

Spring Security OAuth2:在REST Web服务中获取用户名

如何使用Spring Boot和Spring Security保护REST API?

当我有2种类型的用户时如何使用Spring Security保护Rest API

Spring Security OAuth2纯资源服务器

从Android调用受Spring Security保护的REST Web服务

Spring Boot:调用受OAuth2保护的REST服务

具有OAuth2的Spring Security 5 Rest Client

Spring Security OAuth2在REST服务上获得访问被拒绝

Spring Security:将OAuth2声明与角色进行映射以保护资源服务器端点

如何保护REST Web服务?

使用Spring-security @PreAuthorize批注和OAuth2保护REST API

微服务和Spring Security OAuth2

使用Spring oauth2消耗受OAuth保护的REST Web服务

使用Spring Security保护REST端点

如何在单个带有Spring Cloud Security Oauth2的Spring引导应用程序中使用多个Oauth2 SSO服务器?

如何在Java中使用Spring Security OAuth2在资源服务器中动态配置Httpsecurity?

如何使用Spring Security和OAuth2保护Apache Camel Rest端点

如何使用Spring 2创建基于Jackson的JSON Rest服务

使用Spring Security保护REST API

禁用Spring Security Basic登录-Spring REST Web服务

通过Spring Security保护REST

如何使用Spring Security保护Grails Web服务

使用Spring Security在入口点后面保护微服务

使用Struts2和Hibernate创建Web服务(SOAP或REST)

带有REST服务的Spring Integration Security示例

如何使用spring security同时保护2条路径?

SpringBoot 2.0:使用 Spring Security Oauth2 保护 REST API

如何使用 Spring Security OAuth2 跳过同意步骤