当前位置: 首页 > 知识库问答 >
问题:

Spring Security自定义身份验证--AuthenticationProvider与

张嘉熙
2023-03-14
@Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth    
            //.authenticationProvider(authProvider)  // option 1
            .userDetailsService(userDetailsService); // option 2

    }
public Authentication authenticate(Authentication authentication){
        if (checkUsernameAndPassword(authentication)) {
            CustomUserDetails userDetails = new CustomUserDetails();
            //add whatever you want to the custom user details object
            return new UsernamePasswordAuthenticationToken(userDetails, password, grantedAuths);
        } else {
            throw new BadCredentialsException("Unable to auth against third party systems");
        }
    }
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        CustomUserDetails user = new CustomUserDetails();
        //add whatever you want to the custom user details object
        return user;
    }

共有1个答案

和斌
2023-03-14

参见spring security Documentation,https://docs.spring.io/spring-security/site/docs/5.0.0.rc1/reference/htmlsingle/#otall-architecture

对于UserDetailsService经常会有一些混淆。它纯粹是用户数据的DAO,除了将数据提供给框架内的其他组件之外,不执行其他功能。特别是,它不对用户进行身份验证,这是由AuthenticationManager完成的。在许多情况下,如果需要自定义身份验证过程,直接实现AuthenticationProvider更有意义。

AuthenticationProvider和UserDetailsService有不同

示例:Spring提供了以下默认设置,以根据数据库对用户详细信息进行身份验证

  • AuthenticationProvider-DAOAuthenticationProvider,它扩展了AbstractUserDetailsAuthenticationProvider,通过传递用户名、身份验证对象调用authenticatehtml" target="_blank">方法
  • userdetailsservice-jdbcdaoimpl
  • 身份验证流
  1. DaoAuthenticationProvider的职责是用数据库用户验证从请求中获得的用户名和密码。
  2. 为了获取相应的数据库用户,它要求UserDetailsService Implementataion JdbcDaoImpl从数据库中获取一个名称与请求用户名相同的UserDetail对象。这里JdbcDaoImpl只是从系统中获取UserDetails对象。它会发送回在DB中找到的用户,或者发送一个未找到用户的异常。
  3. 如果在数据库中找到用户详细信息,DaoAuthenticationProvider将继续使用数据库找到的用户密码检查请求用户密码,否则身份验证失败。
  4. DAOAuthenticationProvider将根据JdbcDaoImpl响应来响应用户是否经过身份验证。

看看这里,更好地理解它:

AuthenticationProvider-DaoAuthenticationProvider扩展

UserDetailsService-JDBCDAOImpl

 类似资料:
  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 问题内容: 我可以使用Google帐户在AppEngine中对用户进行身份验证的方式非常好。 但是,我需要使用 自定义的身份验证登录系统 。 我将有一个AppUsers表,其中包含用户名和加密密码。 我阅读了有关gae会话的内容,但在启动应用安全性方面需要帮助。 如何跟踪经过身份验证的用户会话?设置cookie? 初学者。 问题答案: 您可以使用cookie来做到这一点……其实并不难。您可以使用C

  • 我在spring MVC项目中实现了一个自定义身份验证提供程序。在我自己的重载authenticate()方法中,我实现了自己的身份验证,其中我构造了自己的UserPasswordAuthenticationToken()并返回对象。 现在,上述对象“UserPasswordAuthentictionToken”中的用户ID被匿名化,密码为null,权限设置为授予该用户的权限。 问题: 这是否会导

  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • Postman上有没有办法在执行请求A之前预先执行请求B? 上下文:我创建了一个Symfony应用程序来管理一组web服务。大多数路由只有在用户完全通过身份验证后才能被调用(对于熟悉框架的人使用form_login和防火墙) 因此,我必须先打电话: 邮政 /login 用户名 密码 在能够呼叫之前 获取/某些_安全_路线 (返回 JSON 响应) 当我在Postman构建器中连续手动调用路由时,这