Spring security 具有自定义身份验证和本地数据库的Spring Security 4

Spring security 具有自定义身份验证和本地数据库的Spring Security 4,spring-security,Spring Security,SpringSecurity4使开发人员能够编写更少的代码,但有时这也会导致事情很容易失控。例如,现在我正在编写一个登录函数,一旦用户按下一个按钮(login/unionauth URI),就会启动第三方提供的类似OAuth 2.0的身份验证,最后返回结果,我们将用户与本地数据库进行比较。为此,首先我有如下适配器类: @覆盖 受保护的无效配置(HttpSecurity http)引发异常{ http .antMatcher(“/**”) .授权请求() .antMatchers(“/”、“/lo

SpringSecurity4使开发人员能够编写更少的代码,但有时这也会导致事情很容易失控。例如,现在我正在编写一个登录函数,一旦用户按下一个按钮(login/unionauth URI),就会启动第三方提供的类似OAuth 2.0的身份验证,最后返回结果,我们将用户与本地数据库进行比较。为此,首先我有如下适配器类:

@覆盖
受保护的无效配置(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管理器。在中,它有以下功能:

如何添加本地用户数据库

许多应用程序需要在本地保存用户的数据,即使 身份验证委托给外部提供程序。我们不显示 在此处编写代码,但只需两步即可完成

  • 为数据库选择后端,并设置一些存储库(例如。 使用Spring数据)创建一个自定义
    用户
    对象,以满足您的需要和 可以从外部完全或部分填充 认证

  • 为通过登录的每个唯一用户提供一个
    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)。