使用登录名和密码或证书进行身份验证
Posted
技术标签:
【中文标题】使用登录名和密码或证书进行身份验证【英文标题】:Authenticaton with login and password or with certificate 【发布时间】:2021-08-09 05:00:30 【问题描述】:我有一个带有 spring boot 的应用程序,用户可以使用登录名和密码或数字证书进行身份验证。 我尝试使用用户名和密码进行验证,但当我尝试使用证书进行验证时,chrome 不会显示窗口来选择我想在验证中使用的证书(我有多个证书并且服务器是安全的,等等。 ..)
有什么想法吗? 我附上我的 WebSecurityConfigurerAdapter 的代码,以防我出错
> @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@EnableWebSecurity
@Configuration
@RequiredArgsConstructor
@Slf4j
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Configuration
@Order(2)
public static class AdminSecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
CustomAuthenticationProvider customAuthProvider;
@Override
public void configure(HttpSecurity http) throws Exception
http.authorizeRequests()
.mvcMatchers(PublicUrls.URLS).permitAll()
.anyRequest().fullyAuthenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
.cors()
.and()
.logout()
.invalidateHttpSession(true)
.clearAuthentication(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login?logout")
.permitAll();
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(customAuthProvider);
@Configuration
@Order(1)
public static class UserSecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
CustomAuthenticationProvider2 customAuthProvider2;
@Override
protected void configure(HttpSecurity http) throws Exception
http.antMatcher("/loginCert*").authorizeRequests()
.mvcMatchers(PublicUrls.URLS).permitAll()
.anyRequest().fullyAuthenticated()
.and().x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(userDetailsService());
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(customAuthProvider2);
@Bean("authenticationManager")
@Override
protected AuthenticationManager authenticationManager() throws Exception
return super.authenticationManager();
配置属性为:
server.ssl.key-store=store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit server.ssl.enabled=true server.ssl.client-auth=需要 server.port=8443
【问题讨论】:
“导航器不显示窗口”是什么意思?你在使用浏览器吗?客户端应用程序?邮递员 ***.com/questions/33808603/… 的可能重复项 我使用谷歌浏览器并且不显示您选择要在验证中使用的证书的典型窗口 【参考方案1】:让浏览器提示您输入客户端证书 如果使用嵌入式 tomcat,则需要在 application.properties 中设置以下 Spring 属性
server.ssl.client-auth=need
对于专用 tomcat,您需要在 server.xml 中设置以下属性
clientAuth="want"
参考以下教程设置双向认证/2-way SSL
https://www.baeldung.com/x-509-authentication-in-spring-security
【讨论】:
当我在 goolge chrome 中尝试此操作时,它会响应以下消息:安全连接失败连接到 localhost:8443 期间发生错误。 SSL 对等方无法验证您的证书。错误代码:SSL_ERROR_BAD_CERT_ALERT 您尝试查看的页面无法显示,因为无法验证接收数据的真实性。请联系网站所有者告知他们这个问题。 我使用了以下证书:github.com/eugenp/tutorials/tree/master/spring-security-modules/… 我建议您按照答案中链接的教程处理任何后续错误。如果您的原始问题得到解答,请接受答案并投票 还有一个问题...有什么方法可以将证书传递给 userDetailService 进行一些自定义验证?以上是关于使用登录名和密码或证书进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章