programing tip

스프링 보안을 사용하여 프로그래밍 방식으로 사용자 로그인

itbloger 2020. 12. 9. 07:54
반응형

스프링 보안을 사용하여 프로그래밍 방식으로 사용자 로그인


반대 : 스프링 보안으로 사용자를 수동으로 로그 아웃하는 방법은 무엇입니까?

내 앱 에서 db 내에서 새 사용자를 생성하고 몇 가지 명백한 확인을 수행하는 컨트롤러에 게시하는 new user screen등록했습니다 . 그런 다음이 새 사용자가 자동으로 로그인되기를 원합니다 ... 이렇게 :

SecurityContextHolder.getContext().setPrincipal(MyNewUser);

편집 Spring Security 3.1을 사용하여 프로그래밍 방식으로 사용자 로그인하는 방법 에 대한 답변을 기반으로 거의 구현했습니다.

 Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null);
 SecurityContextHolder.getContext().setPrincipal(MyNewUser);

그러나 배포되면 jsp는 내 액세스를 할 수 없지만 MyNewUser.getWhateverMethods()정상적인 로그인 절차를 따를 때 수행합니다. 정상적으로 작동하지만 위와 같이 로그인하면 오류가 발생하는 코드는 다음과 같습니다.

<sec:authentication property="principal.firstname" /> 

내 컨트롤러에는 다음과 같이 사용자가 정상적으로 로그인합니다 .

Authentication auth = 
  new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());

SecurityContextHolder.getContext().setAuthentication(auth);

user는 새로 생성 된 사용자 정의 사용자 객체 (UserDetails 구현)입니다. getAuthorities()방법은이 작업을 수행합니다 (모든 사용자가 동일한 역할을 가지고 있기 때문에).

public Collection<GrantedAuthority> getAuthorities() {
        //make everyone ROLE_USER
        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        GrantedAuthority grantedAuthority = new GrantedAuthority() {
            //anonymous inner type
            public String getAuthority() {
                return "ROLE_USER";
            }
        }; 
        grantedAuthorities.add(grantedAuthority);
        return grantedAuthorities;
    }

또한 UserDetailsManager컨트롤러에 구성된 스프링 보안을 삽입 하고이를 사용 UserDetails하여 중복 코드를 방지하기 위해 주체와 권한을 보유 하는 것을 가져올 수 있습니다.

// inject

@Autowired
private UserDetailsManager manager; 

// use in your method

UserDetails userDetails = manager.loadUserByUsername (token.getUsername ());
Authentication auth = new UsernamePasswordAuthenticationToken (userDetails.getUsername (),userDetails.getPassword (),userDetails.getAuthorities ());
SecurityContextHolder.getContext().setAuthentication(auth);

스프링 보안 소스에서 AbstractAuthenticationProcessingFilter:

protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
        Authentication authResult) throws IOException, ServletException {

    if (logger.isDebugEnabled()) {
        logger.debug("Authentication success. Updating SecurityContextHolder to contain: " + authResult);
    }

    // you need this
    SecurityContextHolder.getContext().setAuthentication(authResult);

    rememberMeServices.loginSuccess(request, response, authResult);

    if (this.eventPublisher != null) {
        eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
    }

    successHandler.onAuthenticationSuccess(request, response, authResult);
}

그러나 SecurityContextHolder일반적으로 필터 체인이 완료되면 지워집니다.

참고 URL : https://stackoverflow.com/questions/7900994/programmatically-log-in-a-user-using-spring-security

반응형