programing

Spring Security 사용자 지정 인증 - 인증 공급자 대 사용자 세부 정보 서비스

lovecodes 2023. 9. 2. 09:18
반응형

Spring Security 사용자 지정 인증 - 인증 공급자 대 사용자 세부 정보 서비스

에서 사용자 때 Spring Security를 할 수 것으로 .AuthenticationProvider 사용자 지정 는또습UserDetailsService.

@Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth    
            //.authenticationProvider(authProvider)  // option 1
            .userDetailsService(userDetailsService); // option 2

    }

하고 Authentication Provider를 반환할 수 .Authentication사용자 지정 개체가 포함되어 있습니다.

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");
        }
    }

UserDetailsService사용자 이름만 얻고 사용자 정의 사용자 세부 정보를 반환하면 프레임워크가 암호를 확인합니다.

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        CustomUserDetails user = new CustomUserDetails();
        //add whatever you want to the custom user details object
        return user;
    }

둘 다 비슷한 결과를 낼 수 있을 것 같습니다.그렇다면 문제는 무엇이 다른가 하는 것입니다.하나를 사용할 때와 다른 하나를 사용할 때는 언제?

답은 당신의 질문 안에 있습니다.다른 인증 시스템을 사용하는 경우 암호가 사용자의 데이터베이스/데이터 모델에 제공되지 않으면 인증 공급자를 사용해야 합니다.예를 들어, 고객이 CAS(중앙 집중식 인증 시스템)를 보유하고 있는 프로젝트에서 작업한 적이 있기 때문에 시스템에서 암호에 대해 전혀 알지 못했기 때문에 Authentication Provider를 구현하고 CAS에 지정된 암호를 전송한 후 응답에 따라 작업을 수행해야 했습니다.

그러나 다른 시스템에서는 암호를 데이터베이스에 저장하고 있었기 때문에 UserDetailsService를 구현하고 사용자가 데이터베이스에 있는지 확인하기만 하면 나머지는 스프링 보안이 수행해야 했습니다.

보안 설명서, https://docs.spring.io/spring-security/site/docs/5.0.0.RC1/reference/htmlsingle/ #snmp-architecture

사용자 세부 정보 서비스에 대해 혼동이 있을 수 있습니다.이것은 순전히 사용자 데이터에 대한 DAO이며 프레임워크 내의 다른 구성 요소에 해당 데이터를 제공하는 것 외에는 다른 기능을 수행하지 않습니다.특히 Authentication Manager가 수행하는 사용자 인증은 수행하지 않습니다.대부분의 경우 사용자 지정 인증 프로세스가 필요한 경우 Authentication Provider를 직접 구현하는 것이 더 합리적입니다.

AuthenticationProvider와 UserDetailsService의 용도가 다릅니다.

AuthenticationProvider는 사용자(요청)가 제공한 사용자 이름 및 암호를 시스템 사용자에 대해 인증(비교)합니다(등록된 사용자 목록을 유지 관리하는 DB와 같은 모든 시스템일 수 있음).

사용자가 제공한 사용자 이름과 일치하는 시스템 사용자 세부 정보를 가져오는 것은 사용자 세부 정보 서비스 구현의 책임입니다.여기서는 동일한 사용자 이름을 가진 사용자만 가져오고 인증 성공 여부를 응용 프로그램에 알리지 않습니다.

예: Spring은 데이터베이스에 대해 사용자 세부 정보를 인증하기 위한 기본 설정으로 다음을 제공합니다.

  • Authentication Provider - 추상 사용자 세부 정보를 확장하는 Dao Authentication Provider사용자 이름 Authentication 개체를 전달하여 인증 메서드를 호출하는 AuthenticationProvider
  • 사용자 세부 정보 서비스 - JdbcDaoImpl
  • 인증 흐름
  1. DaoAuthenticationProvider의 책임은 데이터베이스 사용자의 요청에서 가져온 사용자 이름과 암호를 인증하는 것입니다.
  2. 해당 데이터베이스 사용자를 가져오려면 UserDetailsServiceImpleionJdbcDaoImppl에게 요청 사용자 이름과 동일한 이름의 UserDetail 개체를 데이터베이스에서 가져오도록 요청합니다.여기서 JdbcDaoImpl은 시스템에서 UserDetails 개체를 가져옵니다.DB에 있는 사용자를 다시 보내거나 사용자를 찾을 수 없는 예외를 보냅니다.
  3. DB에서 사용자 세부 정보가 발견되면 DaoAuthenticationProvider는 요청 시 DB에서 찾은 사용자 암호로 사용자 암호 확인을 계속합니다. 그렇지 않으면 인증에 실패합니다.
  4. DaoAuthenticationProvider는 JdbcDaoImppl 응답을 기반으로 사용자 인증 여부에 대해 응답합니다.

이를 더 잘 이해하려면 여기를 보십시오.

AuthenticationProvider - DaoAuthenticationProvider가 추상 사용자 세부 정보를 확장합니다.인증 공급자

사용자 세부 정보 서비스 - JdbcDaoImpl

사용자 세부 정보 - 사용자

그 둘은 친척이지만 스프링 보안에 의해 의도적으로 분리되었습니다.기업에 여러 시스템이 있는 경우 사용자 세부 정보 서비스는 인증이 완전히 다른 시스템에서 수행될 수도 있지만 특정 시스템이 보유한 특정 사용자 정보를 제공합니다.간단한 시스템에서, 그것들은 결합될 수 있습니다.예를 들어, 데이터베이스 호출은 사용자 이름/암호를 확인하고 모든 사용자의 전자 메일, ID 등을 검색합니다.

Spring Security Reference에 따르면: http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/ #getting-discovery

사용자 세부 정보 서비스에 대해 혼동이 있을 수 있습니다.이것은 순전히 사용자 데이터에 대한 DAO이며 프레임워크 내의 다른 구성 요소에 해당 데이터를 제공하는 것 외에는 다른 기능을 수행하지 않습니다.특히 Authentication Manager가 수행하는 사용자 인증은 수행하지 않습니다.대부분의 경우 사용자 지정 인증 프로세스가 필요한 경우 Authentication Provider를 직접 구현하는 것이 더 합리적입니다.

언급URL : https://stackoverflow.com/questions/31630818/spring-security-custom-authentication-authenticationprovider-vs-userdetailsser

반응형