使用 Spring Security 自定义 Http 授权标头

Posted

技术标签:

【中文标题】使用 Spring Security 自定义 Http 授权标头【英文标题】:Custom Http Authorization Header with Spring Security 【发布时间】:2013-03-06 03:38:35 【问题描述】:

我们正在使用 Grails 框架构建一个 Restful 服务,并使用 Spring Security 插件为其提供安全性。当您想使用自定义授权标头进行身份验证时,我想与大家一起检查最佳方法。可以在此处阅读有关此方法的更多信息 Custom HTTP Authorization Header

在我的例子中,客户端 ID 和密码存储在 Ldap 中,并且标头带有 SHA1 加密。使用 Spring Security 实现这一点的最佳方法是什么?

我也在 Grails 邮件列表中问过同样的问题。

任何见解都会有所帮助。谢谢。

~阿比

【问题讨论】:

您的问题并不清楚您在问什么或您已经拥有什么。另外,SHA1 是干什么用的?散列您发送的身份验证数据不会增加任何安全性。 嗨,卢克,我们想扩展授权标头,而不是使用普通的 base64 编码。因此,我们使用 SHA1 加密。我们将 clientid 和 secret 作为纯文本存储在 LDAP 中。所以,我一直在寻找一种方法,我可以编写一个过滤器,该过滤器首先解密标头,然后针对 LDAP 进行身份验证。希望这能说明问题。 并非如此。如果攻击者截获了标头中的 SHA-hash,他们可以自己发送,因为它相当于用户名/密码。因此,它不会使您的身份验证比基本身份验证更安全。您需要使用 HTTPS。此外,您不应将密码作为纯文本存储在服务器端。 谢谢Luke,我明白你的意思了,我们正在使用Https并且还添加了盐。在这篇文章中,当您有自定义授权标头时,我正在研究一种使用 Spring Security 的方法。可以更改标头的确切内容以及解密方式。 盐也不会产生太大影响。 Salting 用于存储散列密码,但您将它们存储为纯文本。 【参考方案1】:

您必须实现自己的过滤器、身份验证提供程序和身份验证令牌(将数据传递给您的提供程序)。

见:

什么是安全过滤器链 - http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html 身份验证提供程序 - http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-services.html#core-services-dao-provider 如何将过滤器注册到 Spring Secutory Core 插件 - http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html 如果您需要示例,请查看 Spring Security Core 的一些现有身份验证子插件 - http://grails.org/plugin/spring-security-core

【讨论】:

谢谢伊戈尔,会试试这个。【参考方案2】:

列表项

如果您使用基本授权标头,则以下配置适用于您在 context-security.xml 文件中。

< http  auto-config="true" use-expressions="true" pattern="/project/api/**">
        < intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="$security.requires.channel" method="POST"/>
        < custom-filter ref="basicAuthenticationFilter" position="PRE_AUTH_FILTER"/>
    < /http>    
    < beans:bean id="basicAuthenticationFilter" class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
        < beans:property name="authenticationManager" ref="authenticationManager" />
        < beans:property name="authenticationEntryPoint" ref="authenticationEntryPoint" />      
    < /beans:bean>

我对其余服务使用了相同的方法但是您需要注意,无论您使用什么方案来编码用户名和密码,都应该在过滤器中使用相同的方案来解码“授权”标头信息。如果您使用一些自定义方案来编码“授权”标头,那么您需要扩展“BasicAuthenticationFilter”并提供“授权”标头的适当解码

【讨论】:

以上是关于使用 Spring Security 自定义 Http 授权标头的主要内容,如果未能解决你的问题,请参考以下文章

使用邮递员测试启用 Spring Security 的 API

四Spring Security使用自定义认证页面

四Spring Security使用自定义认证页面

Spring Security 实现自定义登录和认证:使用自定义的用户进行认证

spring boot spring security 基于自定义令牌的身份验证和自定义授权

如何使用自定义登录页面纠正 Spring Security 异常?