如何使用Spring Security在过滤链中对POST和GET调用进行区分?

时间:2015-04-23 08:13:03

标签: spring post filter spring-security get

我搜索了互联网,但我无法找到这个问题的完美答案。

我使用Spring后端制作基于REST的应用程序。我使用过滤链进行授权。

我在同一个网址上有两个不同的电话(POST和GET),

public static final String THINGS_GET = "/rest/things";
public static final String THINGS_REGISTER = "/rest/things";

问题是只有管理员可以执行THINGS_REGISTER调用,并且每个人都可以执行THINGS_GET调用。 我无法找到一种方法来在我的过滤链中以不同的方式定义这两个网址。

这是我的securitycontext.xml,其中包含已定义的RoleFilters:

<beans:bean id="roleEveryoneFilter" class="RoleFilter">
    <beans:property name="userRole" value="EVERYONE"/>
</beans:bean>
<beans:bean id="roleAdminstratorFilter" class="RoleFilter">
    <beans:property name="userRole" value="ADMIN"/>
</beans:bean>

我的过滤链:

GET: <filter-chain pattern="/rest/things" filters="roleEveryoneFilter"/>
POST: <filter-chain pattern="/rest/things" filters="roleAdminstratorFilter"/>

那么如何在我的过滤链或其他地方对POST和GET调用进行区别呢?

1 个答案:

答案 0 :(得分:0)

您能否告诉我们您使用的弹簧安全版本(也许发布您的pom.xml)? 您可以尝试使用RoleFilter:

public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        if (httpRequest.getMethod().equalsIgnoreCase("POST")) {
        // ... do for ADMIN
            filterChain.doFilter(request, response);
        }
        else if(httpRequest.getMethod().equalsIgnoreCase("GET")){
        // ... do for Everyone and maybe return without filterChain.doFilter
        //    filterChain.doFilter(request, response);
        }
    }

或使用access =&#34; permitAll&#34;

在http元素中使用intercept-url
<http auto-config="true">
    <intercept-url pattern="/rest/things" access="permitAll" method="GET" />
    <intercept-url pattern="/rest/things" access="hasRole('ADMIN')" method="POST" />
</http>