수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 시큐리티
authentication인증객체의 name과 credentials 의 자료형
안녕하세요 선생님.customAuthenticationProvider를 강의에서 구현하실 때,사용자가 폼인증시 입력했던 정보가 authentication객체에 있기 때문에getName() , getCredentials()로 얻어내는 과정을 거쳤습니다.name의 경우 String이나credentials의 경우 Object로 얻어오기 때문에 (String) 형변환이 필요했는데요. 질문1왜 비밀번호의 경우 Object 타입으로Authentication(구현클래스 UsernamePasswordAuthenticationToken)에 보관하는지 궁금합니다. 질문2CustomAuthenticationProvider.java 를 구현하실 때 아래와 같이 최종리턴하는 객체는 Authentication입니다.@Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { ... return new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, authorities); }강의에서 return문에서 생성자의 첫 인자로 accountContext(User객체)가 아닌 Acount(엔티티객체)를 넣어줬습니다.principal자리에는 username 혹은 user객체를 넣는 것으로 이해를 하고 있었는데갑자기 엔티티가 나와서 당황한 상황입니다.new UsernamePasswordAuthenticationToken(accountContext, null, authorities); 가 아닌new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, authorities); 인 이유가 있는지 궁금합니다.(실전프로젝트-인증프로세스Form인증구현 > 5.DB연동인증처리2 > 강의시각10:00)
- 미해결스프링 시큐리티
질문 session 만료시 메시지
안녕하세요. 세션 타임이 끝나서 만료됐을때와 maximumSessions 개수가 초과했을때 다르게 url을 설정하고 싶은데 가능할까요? 파라미터를 다르게 설정하여 html에서 메시지를 다르게 보여주고싶습니다.
- 미해결스프링 시큐리티
addlogouthandler에서요 ~
안녕하세요 선생님 !! addlogouthandler여기서 세션무효화, 토큰 삭제 외에 추가작업을 한다고 하셨는데 여기서 제가 만들 핸들러를 집어넣으면 1)세션 무효화 ,토큰 삭제 + 알파로 제가 만든 기능이 추가된다는 건가요?? 2)그냥 제가 만든 기능만 추가된다는 것인가요?? 그래서 따로 무효화와 토큰을 구현해줘야 한다는 ....? 1번과 2번중에 어떤거죠??
- 해결됨스프링 시큐리티
2)정적자원관리 질문드립니다.
화면 강의와 다르게 기존 뷰 페이지를 담당하던 html 파일들의 확장명을 jsp 로 변경해줬습니다.이후 아래와 같은 에러가 나는데 어떻게 고쳐줘야 할까요?
- 해결됨스프링 시큐리티
2) 필터 초기화와 다중 보안 설정 강좌
WebSecurityConfigurerAdapter가 deparcated된 후 SecurityFilterChain을 빈으로 등록하여 사용중인데, @Order를 사용하지 않아도 두 개의 SecurityConfig 클래스가 충돌이 나지는 않습니다.그런데 순서를 명시적으로 보장하기 위하여 @Order를 사용해도 원하는 순서대로 등록이 되지 않고 클래스 이름의 오름차순으로 먼저 호출되어 Bean으로 등록 됩니다. 이렇게 하는 것이 좋은 방법은 아닌 거 같아 여쭤봅니다. 다른 방법이 있을까요?
- 미해결스프링 시큐리티
필터 순서파악
WebSecurityConfigurerAdapter 추상클래스를 extends하는 securityConfig클래스는 기본적으로 위와 같은 방식으로 API가 호출됩니다.질문1.API호출 순서대로 필터가 배치되는지 궁금합니다.즉, 요청이 들어올 때 요청이 만나게 되는 필터의 순서가 csrf 필터를 시작으로 basicAuthenticationFilter로 끝나는 것인지 알고싶습니다. 질문2.RememberMe API를 설정클래스에서 호출하면 RememberMeAuthenticationFilter가 추가가 되는데 이때 위 그림에 나와있는 필터들 사이에 몇번째 순번으로 위치하는지를 단번에 파악할 수 있는 방법이 있을까요? 제가 현재 떠오르는 방법은 위 모든 Filter들에 중단점을 하나씩 걸어놓고 디버깅 흐름을 체크하는 고된 방법입니다ㅠㅠ
- 미해결스프링 시큐리티
DelegatingFilterProxy 질문
DelegatingFilterProxy를 공부하면서 두 가지 궁금한 점이 생겼습니다.질문1. package org.springframework.web.filter; 의 패키지 경로를 갖는 DelegatingFIlterProxy.java 프록시가 스프링컨텍스트의 빈이 아닌 서블릿컨텍스트 에 있는 빈이라는 것을 소스코드를 보고 알 수 있는지 궁금합니다.DelegatingFilterProxy가 서블릿컨테이너에 있는 빈이라면 톰캣이 내장하고 있는 클래스라 생각이 들었고 그에 따라 springframework 패키지경로를 갖는 상황이 혼란스럽습니다 ㅠㅠ 질문2.수업시간에 SecurityFilterAutoConfiguration -> DelegatingFilterProxyRegistrationBean 순으로DelegatingFilterProxy가 생성되는 아래 생성자호출 로직을 살펴봤습니다. new DelegatingFilterProxy(this.targetBeanName, getWebApplicationContext()); 하지만, ctrl + shift + f 로 AbstractSecurityWebApplicationInitializer 추상클래스의 로직에서도 아래와 같이 DelegatingFilterProxy를 생성하는 것을 확인했는데요. private void insertSpringSecurityFilterChain(ServletContext servletContext) { String filterName = DEFAULT_FILTER_NAME; DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(filterName); String contextAttribute = getWebApplicationContextAttribute(); if (contextAttribute != null) { springSecurityFilterChain.setContextAttribute(contextAttribute); } registerFilter(servletContext, true, filterName, springSecurityFilterChain); } 위 두 가지에 어떤 차이점이 있는지 궁금합니다.
- 미해결스프링 시큐리티
antMatchers 의 access 메소드의 표현식
anyMatchers("/admin/**").access("표현식")을 작성할 때 표현식에"hasRole('ADMIN') or hasRole('SYS')" 을 작성하면 문법에러가 나옵니다. 최신버전의 시큐리티에서는 위와 같은 방법을 써야하나요? 현재 스프링부트의 버전은 2.7.4 입니다.
- 미해결스프링 시큐리티
provider안쪽에
log.info("username : "+username); log.info("password : "+password ); AccountContext accountContext = (AccountContext) userDetailsService.loadUserByUsername(username);이부분에서 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exceptionjava.lang.NullPointerException: null이에러가나는데@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("로그로그로그");여기 자체로 넘어오지를 않습니다.어떤거를 손봐야할까요..@RequiredArgsConstructor public class CustomUserDetailsService implements UserDetailsService { private final UserRepository userRepository;지금 보통 RequiredArgsConstructor 로 초기화중입니다.빼고 해봐도 별차이가없네요.. @Getter public class AccountContext extends User { private Account account; public AccountContext(Account account, ArrayList<GrantedAuthority> roles) { super(account.getUsername(), account.getPassword(), roles); this.account = account; } }AccountContext 코드입니다.제가 혼자 해보려고해도 시간이많이없어서 질문올립니다..오래된강의인거는 알고있었지만 너무많이 바뀐거같아요..
- 미해결스프링 시큐리티
질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 안녕하세요실전프로젝트 -인증 프로세스 Form 인증 구현 - 1강을 듣고 따라하고있는데저는 user ID로 로그인했을때 /messages에도 접근가능한데 왜 이럴까요 ㅠㅠ@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } //사용자 추가 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { String password = passwordEncoder().encode("1111"); auth.inMemoryAuthentication().withUser("user").password(password).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER"); auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").permitAll() //루트 페이지는 전부 접근 가능 .antMatchers("/config").hasRole("ADMIN") .antMatchers("/messages").hasRole("MANAGER") .antMatchers("/mypage").hasRole("USER") .anyRequest().authenticated() .and() .formLogin(); } }@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } //사용자 추가 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { String password = passwordEncoder().encode("1111"); auth.inMemoryAuthentication().withUser("user").password(password).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER"); auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").permitAll() //루트 페이지는 전부 접근 가능 .antMatchers("/config").hasRole("ADMIN") .antMatchers("/messages").hasRole("MANAGER") .antMatchers("/mypage").hasRole("USER") .anyRequest().authenticated() .and() .formLogin(); } }있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결스프링 시큐리티
AbstractSecurityInterceptor 실습
AbstractSecurityInterceptor.java 에 중단점을 걸어놓고 루트경로인 localhost:8080/ 으로 접속을 시도했는데abstractSecurityIntercepter 의 중단점으로 디버깅흐름이 이동하지 않습니다.혹시 GlobalMethodSecurity 설정과 관련이 있는 문제인가요? (어떤 커뮤니티에서 힌트만 들었습니다)
- 해결됨스프링 시큐리티
AjaxSecurityConfig 에러에 관해 질문드립니다.
AjaxSecurityConfig 제작 중 authenticationManager must be specified 오류가 발생합니다.@Configuration @Order(0) public class AjaxSecurityConfig { private AuthenticationConfiguration authenticationConfiguration; @Autowired private void setAjaxSecurityConfig(AuthenticationConfiguration authenticationConfiguration) { this.authenticationConfiguration = authenticationConfiguration; } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } @Bean public AccessDeniedHandler ajaxAccessDeniedHandler() { return new AjaxAccessDeniedHandler(); } @Bean public AuthenticationProvider ajaxAuthenticationProvider(){ return new AjaxAuthenticationProvider(passwordEncoder()); } @Bean public AjaxAuthenticationSuccessHandler ajaxAuthenticationSuccessHandler(){ return new AjaxAuthenticationSuccessHandler(); } @Bean public AjaxAuthenticationFailureHandler ajaxAuthenticationFailureHandler(){ return new AjaxAuthenticationFailureHandler(); } @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } @Bean public SecurityFilterChain FilterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.authenticationProvider(ajaxAuthenticationProvider()); http .antMatcher("/api/**") .authorizeRequests() .antMatchers("/api/messages").hasRole("MANAGER") .antMatchers("/api/login").permitAll() .anyRequest().authenticated() .and() .exceptionHandling() .authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint()) .accessDeniedHandler(ajaxAccessDeniedHandler()); // http.csrf().disable(); ajaxConfigurer(http); return http.build(); } private void ajaxConfigurer(HttpSecurity http) throws Exception { http .apply(new AjaxLoginConfigurer<>()) .successHandlerAjax(ajaxAuthenticationSuccessHandler()) .failureHandlerAjax(ajaxAuthenticationFailureHandler()) .loginPage("/api/login") .loginProcessingUrl("/api/login") .setAuthenticationManager(authenticationManager(authenticationConfiguration)); } // @Bean // public AjaxLoginProcessingFilter ajaxLoginProcessingFilter() throws Exception { // AjaxLoginProcessingFilter ajaxLoginProcessingFilter = new AjaxLoginProcessingFilter(); // ajaxLoginProcessingFilter.setAuthenticationManager(authenticationManager(authenticationConfiguration)); // ajaxLoginProcessingFilter.setAuthenticationSuccessHandler(ajaxAuthenticationSuccessHandler()); // ajaxLoginProcessingFilter.setAuthenticationFailureHandler(ajaxAuthenticationFailureHandler()); // return ajaxLoginProcessingFilter; // } } public final class AjaxLoginConfigurer<H extends HttpSecurityBuilder<H>> extends AbstractAuthenticationFilterConfigurer<H, AjaxLoginConfigurer<H>, AjaxLoginProcessingFilter> { private AuthenticationSuccessHandler successHandler; private AuthenticationFailureHandler failureHandler; private AuthenticationManager authenticationManager; public AjaxLoginConfigurer() { super(new AjaxLoginProcessingFilter(), null); } @Override public void init(H http) throws Exception { super.init(http); } @Override public void configure(H http) { if(authenticationManager == null){ authenticationManager = http.getSharedObject(AuthenticationManager.class); } getAuthenticationFilter().setAuthenticationManager(authenticationManager); getAuthenticationFilter().setAuthenticationSuccessHandler(successHandler); getAuthenticationFilter().setAuthenticationFailureHandler(failureHandler); SessionAuthenticationStrategy sessionAuthenticationStrategy = http .getSharedObject(SessionAuthenticationStrategy.class); if (sessionAuthenticationStrategy != null) { getAuthenticationFilter().setSessionAuthenticationStrategy(sessionAuthenticationStrategy); } RememberMeServices rememberMeServices = http .getSharedObject(RememberMeServices.class); if (rememberMeServices != null) { getAuthenticationFilter().setRememberMeServices(rememberMeServices); } http.setSharedObject(AjaxLoginProcessingFilter.class,getAuthenticationFilter()); http.addFilterBefore(getAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } @Override public AjaxLoginConfigurer<H> loginPage(String loginPage) { return super.loginPage(loginPage); } public AjaxLoginConfigurer<H> successHandlerAjax(AuthenticationSuccessHandler successHandler) { this.successHandler = successHandler; return this; } public AjaxLoginConfigurer<H> failureHandlerAjax(AuthenticationFailureHandler authenticationFailureHandler) { this.failureHandler = authenticationFailureHandler; return this; } public AjaxLoginConfigurer<H> setAuthenticationManager(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; return this; } @Override protected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingUrl) { return new AntPathRequestMatcher(loginProcessingUrl, "POST"); } } Intellij 에서 AjaxLoginConfigurer에서 setAuthenticationManager 메소드 쪽에 Return value of the method is never used 라고 하는 것을 보면 Manager의 return 값이 없는 것 같습니다. @Bean public AjaxLoginProcessingFilter ajaxLoginProcessingFilter() throws Exception { AjaxLoginProcessingFilter ajaxLoginProcessingFilter = new AjaxLoginProcessingFilter(); ajaxLoginProcessingFilter.setAuthenticationManager(authenticationManager(authenticationConfiguration)); ajaxLoginProcessingFilter.setAuthenticationSuccessHandler(ajaxAuthenticationSuccessHandler()); ajaxLoginProcessingFilter.setAuthenticationFailureHandler(ajaxAuthenticationFailureHandler()); return ajaxLoginProcessingFilter; } 에서는 정상적으로 authenticationManager가 등록이 되었습니다. 오류가 왜 일어나는지는 알 것 같지만, 해결 방법이 도저히 이해가 가지 않습니다. 아니면 전에 올린 ajaxAuthenticationProvider가 등록되지 않은 것이 문제인지 생각했지만. Filter로는 잘 되어서 그 문제는 아닐 거라 생각해 질문을 올립니다.전체 코드는 Othkkartho/SpringSecurityLearn at ch4.7 (github.com) 입니다. 좋은 강의와 질문 대답 항상 감사합니다.
- 미해결스프링 시큐리티
RememberMe 의 user계정 조회
TokenBasedRememberMeServices 를 강의에서 설명하실 때 메모리상에 있는 user계정 정보를 조회하는 용도로 쓰인다고 설명해주셨습니다.저 클래스를 찾아보니 아래와 같은 구현 상속관계를 갖습니다.TokenBasedRememberMeServices -> AbstractRememberServices -> RememberServices 반면, 강의의 SecurityConfig.java 에서 설정을 해주실 때 작성했던 코드입니다.@Autowired UserDetailsService userDetailsService;http.rememberMe() .rememberMeParameter("remember") .tokenValiditySeconds(3600) .userDetailsService(userDetailsService) ;강의 6) Remember Me 인증 07:05 에서도 user계정을 조회하는 용도로인터페이스userDetailsService 에 빈을 주입한다고 하셨습니다.(주입되는 구현 클래스의 정체를 모르겠습니다) 질문.위 글에서 먼저 언급했던RememberServices 인터페이스와userDetailsService 인터페이스는 서로 다른 인터페이스인데 두 인터페이스의 관계를 어떻게 바라봐야하는지 궁금합니다.두 인터페이스의 구현클래스 모두 "user계정을 조회" 하는 기능으로 소개를 해주셔서 질문드립니다.
- 미해결스프링 시큐리티
AjaxAuthenticationProvider가 ProviderManager에게 등록이 안됩니다.
@Configuration @Order(0) public class AjaxSecurityConfig { private AuthenticationConfiguration authenticationConfiguration; @Autowired private void setAjaxSecurityConfig(AuthenticationConfiguration authenticationConfiguration) { this.authenticationConfiguration = authenticationConfiguration; } @Bean public AuthenticationProvider ajaxAuthenticationProvider() { return new AjaxAuthenticationProvider(); } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } @Bean public SecurityFilterChain ajaxFilterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.authenticationProvider(ajaxAuthenticationProvider()); http .antMatcher("/api/**") .authorizeRequests() .anyRequest().authenticated() .and() .addFilterBefore(ajaxLoginProcessingFilter(), UsernamePasswordAuthenticationFilter.class); http.csrf().disable(); return http.build(); } @Bean public AjaxLoginProcessingFilter ajaxLoginProcessingFilter() throws Exception { AjaxLoginProcessingFilter ajaxLoginProcessingFilter = new AjaxLoginProcessingFilter(); ajaxLoginProcessingFilter.setAuthenticationManager(authenticationManager(authenticationConfiguration)); return ajaxLoginProcessingFilter; } }AjaxSecurityConfig.java AjaxAuthenticationProvider.java@Component public class AjaxAuthenticationProvider implements AuthenticationProvider { private UserDetailsService userDetailsService; private PasswordEncoder passwordEncoder; @Autowired private void setAjaxAuthenticationProvider(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) { this.userDetailsService = userDetailsService; this.passwordEncoder = passwordEncoder; } @Override @Transactional public Authentication authenticate(Authentication authentication) throws AuthenticationException { AccountContext accountContext = FormAuthenticationProvider.authenticationIf(authentication, userDetailsService, passwordEncoder); return new AjaxAuthenticationToken(accountContext.getAccount(), null, accountContext.getAuthorities()); } @Override public boolean supports(Class<?> authentication) { return authentication.equals(AjaxAuthenticationToken.class); } } 설정을 모두 완료하고 확인해보니 Filter는 정상적으로 등록이 되고, ProviderManager에 넘기는 것 까지는 진행이 됩니다. 그런대 ProviderManager에 BreakPoint를 걸고 확인해 보니 DaoAuthenticationProvider만 providers에 등록이 되어있습니다. 그래서 Form 방식을 확인해 보니 Form은 정상작동 하는 것을 확인했습니다. 혹시 자세한 코드가 필요하시다면 아래 링크의 브런치 ch4.3입니다. 항상 모든 질문에 최선을 다해 답변해 주시니 감사합니다.추가 사항으로 SecurityConfig에 넣어서 돌렸더니 Provider가 정상적으로 추가되는 것을 확인했습니다. 또한 오류는 인식하고, AjaxAuthenticationFailureHandler는 또 호출을 합니다. 점점 뭐가 문제인지 잘 모르겠습니다.Othkkartho/SpringSecurityLearn at ch4.3 (github.com)
- 미해결스프링 시큐리티
[질문] 스프링시큐리티 추가 파라미터
안녕하세요 강사님 며칠 전 질문에 대한 소스 업로드 하였습니다.스프링 시큐리티 이용시 파라미터 추가되어아래와 같이 addFilterBefore 를 지정하였으나 넘어 가지 않고그냥 UsernamePasswordAuthenticationFilter로 넘어갑니다.왜 안되는지 모르겠습니다..addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class)아래 다른 방법으로 해결하긴 했는데 왜 안되었는지 궁금하네요.
- 미해결스프링 시큐리티
세션쿠키를 제거한 상태에서 securityContext찾기
강의시간 11:26위 상황은 jsession 쿠키를 제거한 상태에서 remember-me쿠키만 지닌채 서버로 요청한 상황입니다.jsession이 없기 때문에 securityContextHolder 에서 getContext() 로 찾을 수 있는 securityContext객체가 없기 때문에 getContext( )의 결과는 null 이지 않을까...?위의 물음에 잘못된 점이 있는지 궁금합니다.
- 미해결스프링 시큐리티
Session과 SecurityContext의 생명주기
01:05 securityContext 안에 Authentication인증객체가 없는 경우30분이 지나 세션이 만료된 경우브라우저를 종료하여 세션쿠키가 없어진 경우위 두 가지 경우 아래와 같은 순서로 정리해도 될까요? 세션id로 세션객체를 찾을 수 없는 상황에 놓이게 됩니다. 그에 따라 세션 안에 저장된 securityContext 또한 찾을 수 없다. 2의 이유로 securityContext안에 있는 인증객체를 찾을 수 없다이 정리가 모두 맞다면, 세션과 securityContext는 항상 생명주기를 같이하는 관계인지도 궁금합니다
- 미해결스프링 시큐리티
securityContext 삭제 질문
12:17 강의시간에서 SecurityContextLogoutHandler.java 의 logout 메소드에서 securityContextHolder.clearContext(); 호출이 있습니다.사용자 A, B, C 의 접속으로 인해 securityContextHolder에는 3개의 securityContext가 저장되어 있는 상황에서사용자 A만 /logout 요청을 진행했을 때,위 clearContext() 메소드로 사용자A의 securityContext만 삭제할 수 있는 원리가 궁금합니다.언뜻 봐서 메소드명에서 느껴지는 의미로는 securityContextHolder안에 있는 모든 securityContext를 삭제하라 라고 해석되기 떄문입니다.
- 미해결스프링 시큐리티
AbstractUserDetailsAuthenticaationProvider 질문
11:30 에서 ProviderManager.java 에서 AbstractUserDetailsAuthenticaationProvider.java 로 d이동하실 때 로직의 흐름이 발생할 수 있게 만드는 코드가 어디에 있는지 알 수 있을까요?강의에서는 '다음 중단점으로 이동' 기능을 이용 하셔서 인지하기가 어려웠습니다.
- 미해결스프링 시큐리티
인텔리제이에서 구현클래스로의 이동
강의 09:30 에서AbstractAuthenticationProcessingFilter의 authResult = attemptAuthentication(req, res); 구문에서 어떤 단축키를 사용해서UsernamePasswordAuthenticationFilter의attemptAuthentication(req, res) 메소드로 이동하셨는지 궁금합니다.