[SPRING] 스프링 보안에서 커스텀 UserDetail 객체를 생성하는 방법
SPRING스프링 보안에서 커스텀 UserDetail 객체를 생성하는 방법
나는 스프링 보안을위한 나의 커스텀 인증 관리자를 만들었다.
public class AccountAuthenticationProvider implements AuthenticationProvider{
@Autowired
private AuthenticationService authService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String userName = authentication.getName();
String password = (String)authentication.getCredentials();
if(authService.isValid(userName,password)){
List<GrantedAuthority> grantedAuthorityList = new ArrayList<GrantedAuthority>();
grantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_USER"));
SecurityContext securityContext = new SecurityContextImpl();
return new UsernamePasswordAuthenticationToken(userName,password);
}
return null;
}
public void setAuthService(AuthenticationService authService) {
this.authService = authService;
}
@Override
public boolean supports(Class<?> authentication) {
return true;
}
}
하지만 어떻게 내 자신의 사용자 정의 UserDetail 객체를 만들 수 있습니까? 계정 관련 값을 저장하는 데 사용하겠습니다.
해결법
-
==============================
1.사용자 정의 UserDetails 클래스를 리턴하려면 UserDetailsService를 구현하고 loadUserByUsername 메소드를 대체해야합니다.
사용자 정의 UserDetails 클래스를 리턴하려면 UserDetailsService를 구현하고 loadUserByUsername 메소드를 대체해야합니다.
아래 링크를 확인하십시오.
http://www.javaroots.com/2013/03/how-to-use-custom-dao-classe-in-spring.html http://www.javacodegeeks.com/2012/08/spring-security-implementing-custom.html
-
==============================
2.사용자 정의 UserDetails 클래스를 리턴하려면 UserDetailsService를 구현하고 loadUserByUsername 메소드를 대체해야합니다. 이처럼 -
사용자 정의 UserDetails 클래스를 리턴하려면 UserDetailsService를 구현하고 loadUserByUsername 메소드를 대체해야합니다. 이처럼 -
public class UserServiceImpl implements UserDetailsService {` @Autowired UserDaoImpl userDao; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { System.out.println(username); Users user = (Users) userDao.findByUserName(username); List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRoles()); System.out.println("after...."); return buildUserForAuthentication(user, authorities); } private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) { Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>(); for(UserRole userRole : userRoles){ System.out.println("called buildUserAuthority(Set<UserRole> userRoles) method....."); setAuths.add(new SimpleGrantedAuthority(userRole.getRole())); } List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(setAuths); return grantedAuthorities; } private User buildUserForAuthentication(Users user, List<GrantedAuthority> authorities) { //accountNonExpired, credentialsNonExpired, accountNonLocked, authorities properties System.out.println("called buildUserForAuthentication(Users user, List<GrantedAuthority> authorities) method...."); return new User(user.getUsername(), user.getPassword(), user.getEnabled(), true, true, true, authorities); }}
-
==============================
3.너 거의 먹었어!
너 거의 먹었어!
if(authService.isValid(userName,password)) { List<GrantedAuthority> grantedAuthorityList = new ArrayList<GrantedAuthority>(); grantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_USER")); MyObject myObj = new MyObject(userName, password, otherInfo); return new UsernamePasswordAuthenticationToken(mjObj,"", grantedAuthorityList); }
UsernamePasswordAuthenticationToken의 첫 번째 인수는 원칙입니다. 원리는 방금 로그인 한 사람 (또는 사물)을 나타내는 시스템 내의 객체입니다.
인증 전에는 원리는 (String) 사용자 이름 뿐이므로 그 시점에서 모든 정보를 얻을 수 있습니다. 로그인 한 후에는 사용자와 함께 갈 다른 정보를 수집 할 수 있습니다.
Spring은 사용자, UserDetails 및 UserDetailsService를 사용하여 사용자를 관리하고 사용자가 Springy 관련 작업을 수행 할 수 있도록하므로 MyObject가 UserDetails를 구현하면 Spring 환경에서 몇 가지 추가 이점을 얻을 수 있지만 필요하지는 않습니다. MyObject.
컨트롤러에서 (Spring 4) @AuthenticationPrincipal을 사용하여 사용자 객체를 호출에 삽입 할 수 있습니다 (예 :
@RequestMapping(method = RequestMethod.GET, value = "/foo/{bar}") public SomeObject myCommand(@AuthenticationPrincipal MyObject user, @PathVariable String bar);
from https://stackoverflow.com/questions/26447739/how-to-create-custom-userdetail-object-in-spring-security by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring의 CachingConnectionFactory를 사용할 때 세션 닫기 (0) | 2019.03.29 |
---|---|
[SPRING] Spring 보안 3.0.2로 OpenId 인증 및 자동 등록 (0) | 2019.03.29 |
[SPRING] DataSourceUtils.getConnection 대 DataSource.getConnection (0) | 2019.03.29 |
[SPRING] <constructor-arg>를 Spring Annotation으로 대체한다. (0) | 2019.03.28 |
[SPRING] 스프링 타이머 실행을 취소하는 방법 (0) | 2019.03.28 |