Spring Security JWT and Oauth2



我想使用Spring Security设置一个中央身份验证/授权服务器,从那里我可以获取JWT令牌,然后我可以使用它访问另一个Spring Security备份的REST服务器上的受限资源。

以下是我的流程:

1) HTML JS/Mobile等客户端在身份验证服务器上进行身份验证以获得JWT令牌2) 客户端在HTTP标头中将此令牌发送到REST服务器,以获得对安全资源的访问权限

我认为JWT最适合这种场景,因为它可以包含所有相关数据,REST服务器可以完全无状态,只需解码令牌即可在REST服务器上获得所有必要的数据(角色、客户端ID、电子邮件…)。

Oauth2对此的选择是正确的吗?如果是的话,有人能为我指明正确的方向吗?如果JWT不是正确的选择,我对其他解决方案持开放态度:)我应该提到,在我的情况下,也可以在REST服务器上从数据库加载客户端信息,但它不应该负责验证用户(意味着没有用户名/密码检查,只有令牌解码/验证…)

Cloudfoundry UAA是一个开源的OAuth2身份管理解决方案(Apache 2),可发布JWT令牌。您可以查看它的实现方式,也可以自己使用它,既可以作为服务器,也可以仅作为JAR。它在SpringOAuth中实现了一系列现有的策略。它还可以选择拥有自己的用户数据库,或者您可以实现自己的数据库。有很多选项和扩展点,很多人以各种方式使用它(不是所有的Cloudfoundry),因为它是通用的。

Spring OAuth 2.0也支持JWT令牌,但它还没有发布(大部分实现来自UAA)。

但是,既然您说您不介意不透明的令牌(和数据库loookup),那么您可能更喜欢在Spring OAuth 1.0中使用JDBC支持。在我们搬到JWT之前,它在Cloudfoundry中已经使用了很长一段时间,所以我可以在生产中为它担保。

至于OAuth2对于您的用例是否是一个好的选择:您处于决定这一点的最佳位置。到目前为止,你所说的一切都没有让我觉得这是个坏主意。如果有帮助的话,下面是我做的一个演示(如果你喜欢的话,你可能会在YouTube的SpringSource频道上找到它)。

Alvaro Sánchez开发了一个与jwt兼容的插件。http://alvarosanchez.github.io/grails-spring-security-rest/1.5.0.RC4/docs/guide/tokenStorage.html#jwt

BuildConfig.groovy:中安装当前版本

compile ":spring-security-rest:1.5.0.RC4", {
excludes: 'spring-security-core'
}

您只需要更改Config.groovy 中的机密选项

grails.plugin.springsecurity.rest.token.storage.jwt.secret = 'YourSecretKey'

并设置一个chainMap,将使用传统模式管理的安全性与新的rest无状态安全性分开。

grails.plugin.springsecurity.filterChain.chainMap = [
'/yourApi/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter',    // Stateless chain
'/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                                                                          // Traditional chain
]

您可以使用spring安全核心插件管理应用程序中的授权和身份验证。

最新更新