스프링 보안을 사용하여 프로그래밍 방식으로 사용자 로그인
반대 : 스프링 보안으로 사용자를 수동으로 로그 아웃하는 방법은 무엇입니까?
내 앱 에서 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
'programing tip' 카테고리의 다른 글
사용자 지정 비교기를 사용하여 int 배열을 정렬하는 방법은 무엇입니까? (0) | 2020.12.09 |
---|---|
Ctrl + C와 Ctrl + [의 차이점은 무엇입니까? (0) | 2020.12.09 |
다른 저장소와 연결하는 github (0) | 2020.12.09 |
"null"상수를 전달할 때 예외가 발생하지만 "null"문자열 참조를 전달할 때 예외가 발생하는 이유는 무엇입니까? (0) | 2020.12.09 |
selectInput 선택에 반응하는 R 반짝이는 전달 (0) | 2020.12.09 |