我正在开发一个需要进行以下身份验证的spring mvc应用
我尝试使用loadUserByUsername()实现#2,但不知道如何访问loadUserByUsername()中的证书内容?
我发现this相关。发布的答案是从HttpServletRequest
读取。我可以从HttpServletRequest
访问loadUserByUsername()
吗?
我试过
SecurityContextHolder.getContext().getAuthentication().getCredentials();
但未在loadUserByUsername()
中设置身份验证对象。
答案 0 :(得分:2)
<强>更新强>
经过一番挖掘后,我发现Java Config提供了一种非常简单的方法来通过AuthenticationUserDetailsService的简单实现来获取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深入了解,可以使用自定义PreAuthenticatedAuthenticationProvider
和UserDetailsChecker
配置AuthenticatedUserDetailsService
。这些可能足以让您从X509Certificate
中提取详细信息并进行验证。
答案 1 :(得分:0)
在我的情况下,我在UserDetailsService的以下实现中从id获取证书ID。它是security.xml中的一个简单配置 public UserDetails loadUserByUsername(String id)throws UsernameNotFoundException { security.xml文件
但是,如果未在公共类中调用onAuthenticationSuccess证书,myAuthSuccessHandler将实现AuthenticationSuccessHandler {
有什么建议吗?想法?