Authentication 无用户服务的Spring Security X.509身份验证

Authentication 无用户服务的Spring Security X.509身份验证,authentication,spring-security,x509certificate,client-certificates,x509,Authentication,Spring Security,X509certificate,Client Certificates,X509,我在web应用程序中使用SpringSecurity(v3.1.3)进行X.509身份验证。用户和角色存储在数据库中,但我实际上不需要这样做,因为客户端证书的CNs符合“[ROLE]-[USERNAME]”模式,这意味着我已经从证书本身获得了用户名和角色。那么,如何不费吹灰之力就消除数据库呢?我应该编写自己的用户服务实现来填充UserDetails,还是有更优雅的方法?是的,最简单的选择可能是编写一个自定义的AuthenticationUserDetailsService。实现方式如下所示: U

我在web应用程序中使用SpringSecurity(v3.1.3)进行X.509身份验证。用户和角色存储在数据库中,但我实际上不需要这样做,因为客户端证书的CNs符合“[ROLE]-[USERNAME]”模式,这意味着我已经从证书本身获得了用户名和角色。那么,如何不费吹灰之力就消除数据库呢?我应该编写自己的用户服务实现来填充UserDetails,还是有更优雅的方法?

是的,最简单的选择可能是编写一个自定义的
AuthenticationUserDetailsService
。实现方式如下所示:

UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken token) {
    X509Certificate certificate = (X509Certificate[)token.getCredentials();

    // Extract what you want from the certificate
    ...

    // Create the user information
    UserDetails user = ...

    return user;
}

您应该能够在
用户服务ref
名称空间属性

中直接使用对该bean的引用,除了通过Spring的
主题主体regex提取的用户名之外,我不需要证书中的任何内容,因此,我最终实现了
UserDetailsService
接口,并从
loadUserByUsername
方法返回本地构造的
UserDetails
,并使用默认角色。应用程序是一个很小的应用程序,无论如何都不会有多个默认角色。