我有宁静的 API。我使用了 Spring MVC 注释。我需要对用户 ID 进行身份验证,并在身份验证时创建一个会话并允许用户调用其他 API,直到会话结束。我的问题是:创建一个会话并保持它是否违背了宁静的想法。如果是,我如何保护我的 RESTful API?如果我不保护它,网络中的任何人都可以点击 URL 并获得响应。请建议!
1 回答
确实,您是对的,REST 应该是无状态的,这意味着保留带有会话 ID 的 cookie 违反了原则。但不要绝望,有解决办法。
基本的
我假设您正在使用弹簧安全性。最简单的选项是对 REST 路径使用无状态 HTTP Basic 身份验证,并为站点的其余部分保留表单登录,这在 spring-security 中直接支持。安全配置 XML 如下所示:
<!-- for the REST api, the ROLE_API_CONSUMER is a custom role
I usually use so that not all users are allowed to use the API -->
<security:http pattern="/api/**" auto-config="false" create-session="stateless">
<security:http-basic />
<security:intercept-url pattern="/api/**" access="ROLE_API_COSUMER" />
</security:http>
<!-- for the other MVC controllers -->
<security:http auto-config="true">
<security:form-login />
</security:http>
<!-- usual stuff to keep track of users -->
<security:authentication-manager>
<security:authentication-provider
user-service-ref="userDetailsService">
<security:password-encoder ref="encoder" />
</security:authentication-provider>
</security:authentication-manager>
这种方法要求HTTPS真正安全,缺点是REST客户端必须存储用户的用户名和密码。如果客户端是智能手机,则窃取手机将提供以纯文本形式访问用户凭据的权限。
身份验证
OAuth(1.0a 或 2)是大多数现代 API 使用的,并提供了额外的安全级别。为了访问 API,REST 客户端首先请求服务器的访问权限,而不是存储用户的凭据。简而言之,服务器然后向用户显示“你批准这个客户端访问 API 吗?”——一种通知,如果用户批准,REST 客户端会获得一个令牌,它可以用来作为用户进行身份验证,但是没有用户的密码。如果用户的手机被盗,小偷看不到那里的任何密码,并且可以使访问令牌无效。
我没有在 spring-security 中设置 OAuth 的经验,但确实有一个模块,请查看http://static.springsource.org/spring-security/oauth/
我希望对你有所帮助!