[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.승인. 내 문제는 내가 게시하지 않은 코드에 숨겨져있었습니다.
승인. 내 문제는 내가 게시하지 않은 코드에 숨겨져있었습니다.
이 detailsService는 추가 세부 정보 만 얻는 것이지만 로그인 자체에 사용되는 것으로 생각했습니다.
나는 "jdbcAuthentication"을 추가적으로 설정했고 Spring은 이것을 항상 사용하는 것처럼 보였다.
이제는 detailsService 만 구성하면 모든 것이 올바르게 작동합니다.
편집하다.:
그래서 난이 코드를 삭제해야만했다.
auth.jdbcAuthentication() .dataSource(dataSource) * .passwordEncoder(passwordEncoder) .usersByUsernameQuery( // ....
그리고 지금도 위의 질문에서 내 코드와 함께 작동합니다.
-
==============================
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()
from https://stackoverflow.com/questions/25383286/spring-security-custom-userdetailsservice-and-custom-user-class by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring : 프로토 타입 범위의 bean을 완전히 종료시키는 법? (0) | 2019.04.04 |
---|---|
[SPRING] 봄 부팅 - Exclude가 작동하지 않는 EnableAutoConfiguration (0) | 2019.04.04 |
[SPRING] 스프링 3 MVC와 아파치 타일 2 통합 오류 (0) | 2019.04.04 |
[SPRING] Spring에서 MappingJacksonJsonView가 사용하는 JSON 필드 이름 바꾸기 (0) | 2019.04.04 |
[SPRING] Spring 데이터 나머지에 목록을 게시하는 방법? (0) | 2019.04.04 |