복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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);
    
  4. from https://stackoverflow.com/questions/26447739/how-to-create-custom-userdetail-object-in-spring-security by cc-by-sa and MIT license