RESTful Web服务+ Spring令牌认证

时间:2013-03-16 12:39:29

标签: web-services spring rest authentication token

我对Spring不太熟悉,但我已经阅读了一些文章以及如何使用。

所需的业务是:

  • 典型的客户端 - 服务器架构:服务器端的移动客户端和RESTful服务
  • 客户有不同的登录移动应用程序的选择:应用程序登录和Facebook登录
  • 必须保护服务器端的所有RESTful服务免受未授权用户的侵害

我的职责是开发RESTful服务。我非常擅长应用服务器,Java EE,JMS,JDBC,分布式事务(XA),但我不太擅长安全性:(

我使用Spring开发了一些STATELESS RESTful Web服务。这些服务不受保护,所以每个人都可以使用它们。

例如:

  • http://...../api/country/{**user_id**}
  • http://...../api/country/{**user_id**},{country_id}
  • ...

我的每个网络服务都有一个 user_id 输入参数,因为我需要确定哪个用户进行了服务器调用。 Web服务的结果取决于用户。当然,这是绝对正常的。

现在,我必须开发一些新东西,因为我必须保护这些Web服务免受未经授权的用户的攻击。<​​/ p>

我的想法是:

(*)我将创建两个这样的新web服务:

applicationLogin(String username,String password)[/ INDENT]      和 facebookLogin(String accessToken)

  • http://...../api/login/{username}, {password}
  • http://...../api/login/{facebook access token}

(*)我必须保护我的网络服务免受未经授权的用户的侵害

用户登录过程可能如下所示: (1)用户填写他/她的移动设备上的用户名和密码字段 (2)单击应用程序登录按钮 (3)移动应用程序向http://...../api/login/{username}, {password}公共服务发出服务器调用 (4)如果用户名和密码正确,我将生成一个令牌(一个带有过期日期信息的长字符串),我将把用户名和令牌字符串放入HTTP头的答案中 (5)之后,所有客户端在进行webservice调用时必须将这两个参数(用户名和令牌)发送回服务器。

在服务器端,我可以从HTTP请求中读取用户名,因此我可以从所有Web服务的签名中删除 user_id 参数。

我正在尝试在Spring中实现此过程。我想我需要使用Spring安全模块中的 PRE_AUTH_FILTER 。但我不知道我的想法是否合适?

我做到了:

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>/api/country/*</url-pattern>
</filter-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext-security.xml, /WEB-INF/applicationContext.xml</param-value>
</context-param>

的applicationContext-security.xml文件

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
            xmlns:security="http://www.springframework.org/schema/security"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <security:http use-expressions="true" create-session="stateless" auto-config="false" entry-point-ref="authenticationEntryPoint">
        <security:intercept-url pattern="/api/login/*" access="permitAll"/>
        <security:intercept-url pattern="/api/country/*" access="isAuthenticated()" />
        <security:custom-filter position="PRE_AUTH_FILTER" ref="authenticationTokenProcessingFilter" />
    </security:http>

    <bean id="authenticationEntryPoint" class="com.samples.spring.auth.ForbiddenAuthenticationEntryPoint" />

    <bean id="userDetailsServiceImpl" class="com.samples.spring.auth.UserDetailsServiceImpl" />

    <bean id="preAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">

        <property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceImpl" />
    </bean>

    <bean id="authenticationTokenProcessingFilter" class="com.samples.spring.auth.AuthenticationFilter">

        <property name="authenticationManager" ref="appControlAuthenticationManager" />
    </bean>

    <security:authentication-manager alias="appControlAuthenticationManager">
        <security:authentication-provider ref="preAuthenticationProvider" />
    </security:authentication-manager>      

</beans>

您如何看待我的登录流程?这是开始实现令牌处理方法的好方法吗?

2 个答案:

答案 0 :(得分:1)

除了使用Spring安全性之外,Spring还有另一个名为Spring Social的模块。我认为这肯定会对您有所帮助,也会减少开发工作。它还允许您使用Twitter,linkedin等其他社交网络连接到您的应用程序。结帐Spring Mobile

答案 1 :(得分:0)

如果您接受一些小改动,则可以立即使用安全性。

Spring安全性使用http会话来存储用户详细信息。并且https由包含会话密钥或jsessionId参数的会话cookie进行正常跟踪。

还有一个提示:使用https而不是http。