使用JavaConfig示例的Spring Security Digest Auth

如何使用javaconfig(无XML)专门为摘要式身份validation配置Spring 4.0和Spring Security(3.2.0)? 我使用下面的配置类,但所有请求都被HTTP 401拒绝,“Nonce应该产生两个令牌,但是(…消息就在那里停止)”。

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfigurationDigest extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/**").authenticated().and().addFilter(digestAuthenticationFilter(digestEntryPoint())); } @Override @Bean public UserDetailsService userDetailsServiceBean() throws Exception { return super.userDetailsServiceBean(); } public DigestAuthenticationFilter digestAuthenticationFilter(DigestAuthenticationEntryPoint digestAuthenticationEntryPoint) throws Exception { DigestAuthenticationFilter digestAuthenticationFilter = new DigestAuthenticationFilter(); digestAuthenticationFilter.setAuthenticationEntryPoint(digestEntryPoint()); digestAuthenticationFilter.setUserDetailsService(userDetailsServiceBean()); return digestAuthenticationFilter; } @Bean public DigestAuthenticationEntryPoint digestEntryPoint() { DigestAuthenticationEntryPoint digestAuthenticationEntryPoint = new DigestAuthenticationEntryPoint(); digestAuthenticationEntryPoint.setKey("mykey"); digestAuthenticationEntryPoint.setRealmName("myrealm"); return digestAuthenticationEntryPoint; } } 

我试图通过包含标题在客户端授权:

授权:Digest username =“user”,realm =“myrealm”,nonce =“”,uri =“/ service?param = 98”,response =“fcd46faf42a583499d4e7f0371171ef2”,opaque =“”

如果我将此类恢复为基于HttpBasic的配置,我可以访问预期的服务。 我的配置或我的请求有问题吗? 上面的大部分代码都是从另一篇文章中借来的,但是我无法在这种情况下使用。 所有这些都在Spring Boot 0.5.0M7中运行。

谢谢。

请求似乎不完整。 根据摘要处理filter引用,noonce参数应包含base64编码值。

摘要式身份validation的核心是“随机数”。 这是服务器生成的值。 Spring Security的nonce采用以下格式:

 base64(expirationTime + ":" + md5Hex(expirationTime + ":" + key)) expirationTime: The date and time when the nonce expires, expressed in milliseconds key: A private key to prevent modification of the nonce token 

Spring和Patrick都描述了发出请求的流程,如果没有别的东西从服务器获取nonce,服务器提供此头

“WWW-Authenticate:Digest realm =”realm“,nonce =”IVjZjc3Yg ==“,qop =”auth“

在其401回复中说“嘿,你是谁”给客户。 使用nonce和其他东西创建md5哈希并将其发送到服务器。 服务器现在很高兴并处理请求。 看看你做到第1步的光明面,并检查链接以获得更好的解释