복붙노트

[SPRING] 스프링 보안 커스텀 UserDetailsService와 커스텀 사용자 클래스

SPRING

스프링 보안 커스텀 UserDetailsService와 커스텀 사용자 클래스

사용자 주체 개체에 추가 데이터를 저장하려고합니다.

내가 한 일은 :

내 추가 데이터가 저장되는 기존 사용자 클래스 (예 : 전자 메일 주소 등)에 "UserDetails"인터페이스를 구현하십시오.

@Entity
public class User implements UserDetails {

그런 다음 UserDetailsService 구현을 만들었습니다.

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    UserDAO userDAO;

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        User user = userDAO.findOneByUsername(username);
        if (user == null)
            throw new UsernameNotFoundException("username " + username
                    + " not found");

        System.out.println("---------------------> FOUND ------------->"
                + user.getEmail());

        return user;
    }

}

마지막 단계는 내 보안 구성에 UserDetailsService를 추가하는 것입니다.

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
UserDetailsService userDetailsService;



@Override
protected void configure(AuthenticationManagerBuilder auth)
        throws Exception {
    auth.userDetailsService(userDetailsService());
// ...

}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.userDetailsService(userDetailsService());
// ...
}

@Override
protected UserDetailsService userDetailsService() {
    return userDetailsService;
}

내 콘솔에서 "loadUserByName"이 두 번 호출되는 것을 볼 수 있습니다 ( "Found"출력 때문에).

내 컨트롤러의 주요 개체에 액세스하려고 할 때 ->

System.out.println(SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal());

나는 나의 추가 데이터를 얻지 못한다. 내가 그것을 내 사용자 개체에 캐스트하려고하면 예외를 캐스팅 할 수 없습니다.

내가 누락 된 것이 있습니까?

미리 감사드립니다.

해결법

  1. ==============================

    1.승인. 내 문제는 내가 게시하지 않은 코드에 숨겨져있었습니다.

    승인. 내 문제는 내가 게시하지 않은 코드에 숨겨져있었습니다.

    이 detailsService는 추가 세부 정보 만 얻는 것이지만 로그인 자체에 사용되는 것으로 생각했습니다.

    나는 "jdbcAuthentication"을 추가적으로 설정했고 Spring은 이것을 항상 사용하는 것처럼 보였다.

    이제는 detailsService 만 구성하면 모든 것이 올바르게 작동합니다.

    편집하다.:

    그래서 난이 코드를 삭제해야만했다.

    auth.jdbcAuthentication() .dataSource(dataSource)
         * .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
    //   ....
    

    그리고 지금도 위의 질문에서 내 코드와 함께 작동합니다.

  2. ==============================

    2.확장 클래스 만들기 :

    확장 클래스 만들기 :

    public class CustomUserDetails extends org.springframework.security.core.userdetails.User{
    
        private User user;
    
        public CustomUserDetails(User user, Collection<? extends GrantedAuthority> authorities) {
            super(user.getName(), user.getPassword(), authorities);
            this.user = user;
        }
    
        public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
            super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
            this.user = user;
        }
    
        public User getUser() {
            return user;
        }
    }
    

    UserDetailsService에 추가하는 것보다 :

    @Service("userDetailsService")
    public class UserDetailsServiceImpl implements UserDetailsService {
    public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {
        UserDetails userDetails = null;
        User user = userService.getByLogin(login);
        userDetails = new CustomUserDetails(user,
                    true, true, true, true,
                    getAuthorities(user.getRole()));
    
        return userDetails;
    }
    

    잡아!

     (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()   
    
  3. from https://stackoverflow.com/questions/25383286/spring-security-custom-userdetailsservice-and-custom-user-class by cc-by-sa and MIT license