Spring security 具有自定义身份验证和本地数据库的Spring Security 4
SpringSecurity4使开发人员能够编写更少的代码,但有时这也会导致事情很容易失控。例如,现在我正在编写一个登录函数,一旦用户按下一个按钮(login/unionauth URI),就会启动第三方提供的类似OAuth 2.0的身份验证,最后返回结果,我们将用户与本地数据库进行比较。为此,首先我有如下适配器类:Spring security 具有自定义身份验证和本地数据库的Spring Security 4,spring-security,Spring Security,SpringSecurity4使开发人员能够编写更少的代码,但有时这也会导致事情很容易失控。例如,现在我正在编写一个登录函数,一旦用户按下一个按钮(login/unionauth URI),就会启动第三方提供的类似OAuth 2.0的身份验证,最后返回结果,我们将用户与本地数据库进行比较。为此,首先我有如下适配器类: @覆盖 受保护的无效配置(HttpSecurity http)引发异常{ http .antMatcher(“/**”) .授权请求() .antMatchers(“/”、“/lo
@覆盖
受保护的无效配置(HttpSecurity http)引发异常{
http
.antMatcher(“/**”)
.授权请求()
.antMatchers(“/”、“/login**”、“/webjars/**”).permitAll()
.anyRequest().authenticated()
.及()
.例外处理()
.authenticationEntryPoint(新的LoginRuthenAuthenticationEntryPoint(“/”)
.及()
.logout()
.logoutSuccessUrl(“/”).permitAll()
.及()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.WithTpOnlyFalse())
.及()
.addFilterBefore(ssoFilter(),BasicAuthenticationFilter.class);
}
@凌驾
public void configure(AuthenticationManagerBuilder auth)引发异常{
auth.userDetailsService(myUserDetailsService);
}
然后我有了如下ssoFilter()
:
公共类UnionAuthenticationProcessingFilter扩展了AbstractAuthenticationProcessingFilter{
@凌驾
公共身份验证尝试身份验证(HttpServletRequest HttpServletRequest,HttpServletResponse HttpServletResponse)引发AuthenticationException、IOException、ServletException{
//验证步骤。
UsernamePasswordAuthenticationToken=新的UsernamePasswordAuthenticationToken(“tom”,“N/A”,null);
AuthenticationManager=this.getAuthenticationManager();
返回管理器。验证(令牌);
}
现在,问题是,管理器是null
。为什么它是null
?我认为在密码用户名模式下,适配器中的auth.userDetailsService(myUserDetailsService);
将启用DAO管理器。在中,它有以下功能:
如何添加本地用户数据库
许多应用程序需要在本地保存用户的数据,即使
身份验证委托给外部提供程序。我们不显示
在此处编写代码,但只需两步即可完成
用户
对象,以满足您的需要和
可以从外部完全或部分填充
认证User
对象
检查/user
端点中的存储库。如果已经存在
具有当前主体的身份的用户,可以对其进行更新,
否则创建
User
对象中添加一个字段以链接到中的唯一标识符
外部提供者(不是用户名,而是
对于外部提供程序中的帐户是唯一的)
您知道如何将数据库添加到Spring Security OAuth2中,或者为什么第一段中的管理器是
null
?您从未调用UnionAuthenticationProcessingFilter
的AuthenticationManager
的设置器。为什么不应该是null
?向我们展示ssoFilter()的实现
method.@dur ssoFilter()返回UnionAuthenticationProcessingFilter的一个对象,根据configure(AuthenticationManagerBuilder auth)的注释和auth.userDetailsService的注释,我认为这是设置AuthenticationManager的地方,不是吗?现在在auth.userDetailsService(myUserDetailsService)之后,您说得对了;我从spring获得了一个DaoAuthenticationManager,并使用setter将其添加到自定义筛选器中。我不知道在SSOFFILTER()之前调用了configure(AuthenticationManagerBuilder auth)。