从loadUserByUsername访问证书内容

时间:2015-10-15 00:22:53

标签: spring spring-security x509certificate

我正在开发一个需要进行以下身份验证的spring mvc应用

  1. 通过tomcat cert store验证客户端证书
  2. 验证客户端证书的其他属性
  3. 我尝试使用loadUserByUsername()实现#2,但不知道如何访问loadUserByUsername()中的证书内容?

    我发现this相关。发布的答案是从HttpServletRequest读取。我可以从HttpServletRequest访问loadUserByUsername()吗?

    我试过

    SecurityContextHolder.getContext().getAuthentication().getCredentials();
    

    但未在loadUserByUsername()中设置身份验证对象。

2 个答案:

答案 0 :(得分:2)

<强>更新

经过一番挖掘后,我发现Java Config提供了一种非常简单的方法来通过AuthenticationUserDetailsS​​ervice的简单实现来获取X509Certificate:

@Configuration
protected static class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
            .x509()
            .authenticationUserDetailsService(new X509AuthenticatedUserDetailsService());
    }

    protected static class X509AuthenticatedUserDetailsService implements AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> {

        @Override
        public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken token)
                throws UsernameNotFoundException {
            X509Certificate certificate = (X509Certificate)token.getCredentials();
            // do your extra checking here...

            // add granted authorities, etc.
            Collection<GrantedAuthority> authorities = Collections.EMPTY_LIST;

            // generate your user how you deem fit
            User user = new User(certificate.getSubjectX500Principal().getName(), null, authorities);
            return user;
        }

    }
}

请注意,在loadUserDetails方法中,您执行的操作与实现UserDetailsService时的操作完全相同,只是此方法采用整个Authentication对象。

<强> ORIGINAL

我不确定这是否是预期的方式;但是,X509Certificate是通过X509AuthenticationFilter中生成的身份验证令牌传递的。调用PreAuthenticatedAuthenticationToken#getCredentials应该为您获得证书。

通过API深入了解,可以使用自定义PreAuthenticatedAuthenticationProviderUserDetailsChecker配置AuthenticatedUserDetailsService。这些可能足以让您从X509Certificate中提取详细信息并进行验证。

答案 1 :(得分:0)

在我的情况下,我在UserDetailsS​​ervice的以下实现中从id获取证书ID。它是security.xml中的一个简单配置 public UserDetails loadUserByUsername(String id)throws UsernameNotFoundException { security.xml文件  

但是,如果未在公共类中调用onAuthenticationSuccess证书,myAuthSuccessHandler将实现AuthenticationSuccessHandler {

有什么建议吗?想法?