묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티
프로젝트는 직접 만들어야하나요?
챕터 1,2 건너뛰고챕터 3부터 들으려고 합니다.근데 프로젝트 만드는건 각자한다해도안에 기본적인 컨트롤러나 뷰계층 파일들 다 만들어져있는 상태에서 강의 진행하시는데 이건 각자 알아서 만드나요?깃허브 주소 공유해주신건 완성본인데여기서 필요한것만 가져와서 플젝을 만들어야하나요?
-
해결됨스프링 시큐리티
익명사용자를 왜 사용하는지 모르겠습니다.
인증에서 user 객체가 없으면 null로 반환하면 체크가 될텐데 굳이 익명사용자 인증 처리 필터를 이용해서 익명 사용자와 인증 사용자를 구분하는 이유가 뭔가요? null로 비교 시 위험해서 그런건가요?
-
미해결스프링 시큐리티
SecurityContextHolder 관련해서
안녕하세요. 강의보면서 질문이 있어 문의 드립니다. (섹션 4. 실전프로젝트 - 인증 프로세스 Ajax 인증 구현) ------------------------------------------------------------------------------------------------------ SecurityConfig 구현은 http.csrf().disable(); 이렇게 설정하고 임의로 CustomUserDetails details = (CustomUserDetails) userDetailsService.loadUserByUsername("userId"); SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(details.getUserInfo(), null, details.getAuthorities())); 사용자 정보를 넣어 (디버깅으로 사용자 조회하여 데이터 들어가는것까지 확인했습니다. authorities 는 ROLE_USER) ------------------------------------------------------------------------------------------------------ 사용하고자 하는 서비스에서 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 호출하여 사용자 정보를 가져오려고 하는데 anonymous_user 라고 나오네요. SecurityConfig 에서 넣은 사용자 정보도 없고요. 강제로 인증되어 사용자 정보까지 가져오려면 어떻게 해야 할까요? ------------------------------------------------------------------------------------------------------ 이렇게 하는 이유는 개발환경에서만 security를 풀어 SecurityContextHolder 를 사용하는 다른 곳에서 security 를 동작했을때와 같은 환경으로 사용하고자 합니다.
-
해결됨스프링 시큐리티
(해결완료) AjaxSecurityConfig 클래스에서 cofigure 이전 강의코드에서 살짝 바뀌었으니 참고들 하세요!
이전 강의 코드 현재 강의 코드
-
미해결스프링 시큐리티
(해결완료) 코드 변경사항 있습니다. 참고들 하세요!
package io.security.basicsecurity.security.provider; import io.security.basicsecurity.security.common.FormWebAuthenticationDetails; import io.security.basicsecurity.security.service.AccountContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.transaction.annotation.Transactional; @Slf4j public class FormAuthenticationProvider implements AuthenticationProvider { @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; public FormAuthenticationProvider(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } @Override @Transactional public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = (String) authentication.getCredentials(); AccountContext accountContext = (AccountContext) userDetailsService.loadUserByUsername(username); if(!passwordEncoder.matches(password, accountContext.getAccount().getPassword())) { throw new BadCredentialsException("Invalid Password"); // throw new BadCredentialsException("BadCredentialsException"); } String secretKey = ( (FormWebAuthenticationDetails) authentication.getDetails() ).getSecretKey(); // FormWebAuthenticationDetails formWebAuthenticationDetails = (FormWebAuthenticationDetails) authentication.getDetails(); // String secretKey = formWebAuthenticationDetails.getSecretKey(); if(secretKey == null || ! secretKey.equals("secret")) { // if(secretKey == null || !"secret".equals(secretKey)) { throw new IllegalArgumentException("invalid Secret"); // throw new InsufficientAuthenticationException("InsufficientAuthenticationException"); } return new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, accountContext.getAuthorities()); // UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, accountContext.getAuthorities()); // return authenticationToken; } @Override public boolean supports(Class<?> authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); // return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } }
-
미해결스프링 시큐리티
(해결완료) successHandler 작동 안되시는분들 꼭 참고하세요
.defaultSuccessUrl("/") 이거를 꼭 successHandler위에 위치하세요.. 원래는 아래 있었습니다.. 1시간 삽질했네요..
-
해결됨스프링 시큐리티
(해결완료) FormAuthenticationProvider 클래스가 이전에 작성했던 CustomAuthenticationProvider 클래스였네요;
1. 클래스명 CustomAuthenticationProvider -> FormAuthenticationProvider 변경되었습니다. 2. class 위에 @Slf4j 애노테이션이 추가되었습니다.3. public FormAuthenticationProvider 생성자가 추가되었습니다. 4. authenticate 메서드 위에 @Transactional이 추가되었습니다. 다른분들은 저처럼 혼란스러워서 저번 강의 다시 보시지 않기를.. ---------------------------------------------------------- 5. SecurityConfig 클래스에 authenticationProvider 메서드에 passwordEncoder() 매개변수가 추가되었습니다.
-
해결됨스프링 시큐리티
SecurityContextHolder , SecurityContext 질문 드립니다.
안녕하세요.. 좋은 내용의 강의를 잘 듣고 있습니다. 현재 1. 스프링 시큐리티 주요 아키텍처 이해 4) 인증저장소( SecurityContextHolder , SecurityContext) 관련해서 2가지 질문이 있는데요. [질문1] 예제 설명에서 Main Thread 에서 자식 Tread 를 새로 생성해서, 테스트 하는 예제가 있는데요. 실제 업무에서, MVC 모델에서 자식 Thread 를 선언해서, 사용하는 예제를 그동안 못 봐서요. @Controller 에서 @Service 를 호출하고, 대부분 처리하는 방식인데요. 자식 쓰레드를 만드는 패턴은 실제적으로 어느때 사용하나요? [질문2] 기본 설정이 strategyName = MODE_THREADLOCAL 인데요. 자식 쓰레드가 Authentication authentication = SecurityContextHolder.getContext().getAuthentication() 로 접근할때는 안 되지만, 세션으로 get 으로, 호출하면, 같은 WAS 세션에 존재함으로, authentication 정보를 가져올 수 있는 건 아닌지요? 개인적으로 2가지 문의사항이 있어서, 질문드립니다. 감사합니다.
-
해결됨스프링 시큐리티
다중 보안 설정
안녕하세요. 강의 잘 보고 있습니다~ 이번 강의 보다가 궁금한게 있는데 실제로도 다중 보안 설정 방식을 자주 사용하는지와 사용한다면 어떤 경우에 쓰여지는지가 궁금합니다.
-
미해결스프링 시큐리티
동시 세션 제어 - 동일 브라우저에서 로그아웃이 정책 미적용
안녕하세요. 강좌를 유익하게 잘 보고 있습니다. 동시 세션 제어 부분에서 해당 Security 2.3.1 버전을 사용하고 있는데 "maxSessionsPreventsLogin(true)" 상태에서 아래와 같은 동작 시 "Maximum sessions of 1 for this principal exceeded" 오류 발생으로 제대로 동작을 하지 않고 있습니다. login --> logout --> 재 login 해당 이슈를 검색을 해보니 "https://stackoverflow.com/questions/41429778/spring-security-logout-and-maximum-sessions" 에서 해결점을 찾을 수 있었지만. securityRegistry 가 Bean으로 노출되지 않는 상태라서 그렇다는데.. 이부분이 이해가 가지 않아서요 버그 인지 실제 스프링 정책인 것인지 , 아니면 스프링에서 유도(?) 하는 코딩 방식이 있는 것인지 궁금합니다. 행복한 날 되세요
-
미해결스프링 시큐리티
강의 PPT 관련 질문
안녕하세요~ 강의 잘 듣고 있는 사람입니다. 강의를 듣다보니 HTTP Basic 부분의 강의가 PPT 에는 나와있는 것 같은데, 강의에는 건너뛰고 Form 인증 부분부터 나오더라구요~! 굳이 할 필요가 없어서 생략하신 걸까요? 좋은 강의 만들어주셔서 감사합니다!
-
미해결스프링 시큐리티
인증 실패하지 않고 로그인할 경우 savedRequest
안녕하세요! 먼저 강의 너무 잘 듣고있습니다. 감사합니다. 이번 강의를 보는 중 의문점이 생겨 질문 남깁니다.강의 마지막의 디버깅 과정에서 과정 부분입니다. 캐싱 과정 확인을 위해 인위적으로 /로 접근한 후 요청 정보를 캐시에 남기게 하고, login 페이지로 redirect 되게 하여 인증을 하여, 캐시에서 요청 정보를 가져와서 해당 경로로 이동하게 하였습니다.(successHandler()를 통해서) 여기서 의문점이 생겼습니다. /로 접근하지 않고 바로 /login으로 접근해 요청 정보를 캐싱하지 않는 경우는 어떻게 될지가 궁금했습니다. 결과는 예상했던대로 savedRequest가 null이어서 에러가 났습니다. 그래서 제 결론은 이 요청 정보 캐싱 기능을 이용하는 경우, successHandler에서 바로 /login으로 접근하는 경우도 고려해서 구현해야 하는지, 아니면 successHandler 이 외에 자동 설정이나 다른 설정을 해야하는 것이 있는지 궁금합니다. 감사합니다!
-
미해결스프링 시큐리티
RequestCache와 savedRequest에 대해서
커스터마이징 하니 너무 개념이 복잡해서 헷갈리는데 HttpSessionRequestCache DefaultRedirectStrategy 와 같이 아키텍쳐 관점에서 전체적인 흐름 한번만 설명해주실수 있나요ㅜ
-
미해결스프링 시큐리티
JSESSIONID의 생성에 대해서
안녕하세요. 좋은 강의 감사합니다. 아래와 같이 STATELESS로 설정하면 로그인은 안되지만 JSESSIONID는 쿠키에 저장되는데요 JSESSIONID는 스프링 에서 세션을 만들지 않더라도 무조건 부여되는 건가요? http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .sessionFixation().none();