Spring Data REST中的身份验证和授权

32

我正在实现一个基于Spring Data REST的应用程序,并希望知道是否有一种优雅的方式来使用此框架或相关框架实现身份验证和授权规则。

所有对REST服务器的HTTP请求必须携带身份验证标头,我需要检查它们并根据HTTP方法和经过身份验证的用户与所请求资源的关联来决定是否授权。例如(该应用程序是一个e-learning系统的REST服务器),教练只能访问自己的课程节,学生只能访问他们已订阅的课程节等。

我想知道是否有默认的方法在Spring Data REST中实现授权。如果答案是否,则您能为我的问题提出建议吗?我正在考虑:

  • Servlet Filters
  • Spring Security
  • Spring Data REST Handlers(如何访问HTTP标头?)

1
Spring安全性相当方便且相对简单,用于身份验证。您可能希望查看此链接:http://www.mkyong.com/spring-security/spring-security-form-login-example/ - Niklas
你可以使用servlet 过滤器实现细粒度授权。以下是一个示例: http://www.webfarmr.eu/2011/05/when-openid-meets-xacml-externalize-authentication-and-authorization-from-your-business-apps/ - David Brossard
一个问题是如何让您的CrudRepository响应SecurityContext(例如,检索与“当前用户”相关/受限数据)? - Nick Spacek
1
在使用Servlet Filters和其他解决方案时的问题在于,反序列化实体被封装到Spring Data Rest代码中,因此我无法从filter中访问它。 我需要将实体与身份验证标头中存在的用户数据进行比较。 我正在考虑分叉Spring Data Rest代码以创建授权层,提供AuthorizationLister接口,在我的应用程序中,我可以实现一个方法:boolean authorize(HttpRequest request,Object persistentEntity)。 - Rodrigo Guerra
Rodrigo,你实现了吗?编码有多容易?每次更新Spring Data Rest版本时,你需要进行更改吗? - Adam
希望这个能对你有所帮助:https://github.com/srinivas1918/spring-rest-security - Nalla Srinivas
1个回答

12

你最好的选择是Spring Security。 这将帮助您以更简单的方式实现授权。

Spring Security需要您实现一个程序,查看请求头并进行编程式的登录操作。

请参考此处的已接受答案。我也是按照这个方法,在我的REST服务(使用RestEasy构建)前面实现了安全层。

通过Spring进行RESTful身份验证

还有另一种方法... 请参考http://www.baeldung.com/spring-security-authentication-provider

在这两种情况下,您都可以通过声明Spring Security中的无状态认证来禁用会话创建,这将在大量访问无状态REST服务时显著提高性能。


14
这个问题涉及到“Spring Data REST”和实体级别的授权,因此一般的解决方案并不适用于这里。 - Seweryn Niemiec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接