5

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

这是我的流程:

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

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

Oauth2 是正确的选择吗?如果是这样,有人可以指出我正确的方向吗?如果 JWT 不是正确的选择,我愿意接受其他解决方案:) 我应该提到,在我的情况下,也可以在 REST 服务器上从数据库加载客户端信息,但它不应该负责验证用户(意味着没有用户名/密码检查,只是令牌解码/验证......)

4

2 回答 2

3

Cloudfoundry UAA是一个发布 JWT 令牌的开源 OAuth2 身份管理解决方案 (Apache 2)。您可以查看它的实现方式,或者仅将其用作服务器或仅用作 JAR。它在 Spring OAuth 中实现了一堆现有的策略。它还可以选择拥有自己的用户数据库,或者您可以实现自己的。有很多选项和扩展点,许多人以各种方式使用它(并非全部使用 Cloudfoundry),因为它被设计为通用的。

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

但是,由于您说您不介意不透明的令牌(和数据库查找),您可能更喜欢只使用 Spring OAuth 1.0 中的JDBC 支持。在我们迁移到 JWT 之前,它已经在 Cloudfoundry 中使用了很长一段时间,所以我可以在生产环境中保证它。

至于 OAuth2 是否适合您的用例:您处于做出决定的最佳位置。到目前为止,你所说的一切都没有让我认为这是一个坏主意。如果有帮助,这是我做的一个演示文稿(如果你喜欢那种东西,你可以在 YouTube 的 SpringSource 频道找到它)。

于 2014-02-21T17:55:59.620 回答
0

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 中的 secret 选项

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

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

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

您可以使用 spring-security-core 插件在应用程序中管理授权和身份验证。

于 2015-04-29T23:02:28.917 回答