我已经阅读了很多关于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中使用什么属性呢?我应该实现自己的摘要入口点吗?
非常感谢您的回答。