使用Spring Security的Spring Restful Web Services执行授权

时间:2015-02-11 12:34:26

标签: android web-services spring-security restful-authentication

我已经阅读了很多关于Spring Web Services和身份验证方法的文献,但我仍然感到困惑。这是我的场景以及我想要尝试实现的内容:

我正在开发一些Spring(4.x)restful Web服务,以便从Android应用程序中使用。该数据存储在数据库中,我通过Spring Data JPA访问数据库。我有一些模型来表示表,所以我使用Jackson将Java对象转换为Web服务返回到Android应用程序的JSON对象。我也有一些Web服务接受JSON对象到请求中将信息存储到数据库中,但我认为这种操作并不安全。我至少暂时不能在我的服务器中使用SSL(https)(我没有足够的权限)。因此,我必须为我的Web服务提供一些安全性。

我正在考虑在请求中发送带有用户名密码哈希或加密的标头,但有人可能会嗅探网络以获取该信息。这是一个好方法吗?我应该使用什么样的加密?我应该如何通过Web服务从Android应用程序发送JSON(我的意思是纯文本,哈希等)?

如何通过Spring Security实现授权机制?我知道如何将Spring Security与使用Spring MVC的Web应用程序一起使用,但我不知道如何将它用于Web服务(尽管两者都或多或少相同)。例如,我没有在spring security xml中的http标签中使用登录表单。我正在尝试使用摘要式身份验证,然后我使用intercept-url标记来设置允许访问的路径,其值为isAuthenticated():

<http create-session="stateless" entry-point-ref="digestEntryPoint" use-expressions="true">
    <!-- The pages not marked are not allowed -->
    <intercept-url pattern="/**" access="denyAll" />

    <!-- Internal pages with restricted access -->
    <intercept-url pattern="/ws/**" access="isAuthenticated() and hasRole('ROLE_MY_ROLE')" />

    <http-basic />
    <custom-filter ref="digestFilter" after="BASIC_AUTH_FILTER" />
</http>

我已将摘要机制配置如下:

<beans:bean id="digestFilter" class="org.springframework.security.web.authentication.www.DigestAuthenticationFilter">
    <beans:property name="userDetailsService" ref="userService" />
    <beans:property name="authenticationEntryPoint" ref="digestEntryPoint" />
</beans:bean>

<beans:bean id="digestEntryPoint" class="org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint">
    <beans:property name="realmName" value="Contacts Realm via Digest Authentication"/>
    <beans:property name="key" value="acegi" />
</beans:bean>

我想用userDetailService我的自定义数据源来执行身份验证(我使用BCrytpt将密码哈希到数据库中):

<authentication-manager>
    <authentication-provider>
        <password-encoder ref="encoder"/>
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="select email as username, password, enabled from user where email=?"
            authorities-by-username-query="select p.email, a.name as authority
                from user p, player_has_authorities pha, authorities a where p.email = pha.email and pha.name = a.name and p.email =?"
            role-prefix="ROLE" />
    </authentication-provider>
</authentication-manager>

<beans:bean id="encoder" 
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
    <beans:constructor-arg name="strength" value="11" />
</beans:bean>

我应该在digestFilter bean中使用什么属性呢?我应该实现自己的摘要入口点吗?

非常感谢您的回答。

0 个答案:

没有答案