programing

AuthorizationRequest를 대체한 후 HttpSession이 null입니다.

stoneblock 2023. 2. 28. 23:13

AuthorizationRequest를 대체한 후 HttpSession이 null입니다.

완전한 코드와 문제를 신속하게 재현하는 방법은 다음과 같습니다.


문제:
HttpSession becomes가 되다null커스텀 실장 후 전류는 절약된 것으로 치환합니다.AuthorizationRequest. This causes 후속 요구의 실패 to /oauth/token because the Csrf Filter(Csrf 필터) in the Spring Security filter chain preceding the /oauth/token endpoint is not able to find a session Csrf token in the null session to compare with the request's Csrf token.


오류 발생 시 흐름 제어:

다음 흐름도는 스텝14와 스텝15가 어떻게 되어 있는지를 나타내고 있습니다.null- - ify theHttpSession (, 가 하지 않을 이 있습니다.)JSESSIONID ) A a A 。SYSOCustomOAuth2RequestFactory.java스텝 14는, 실제로 존재하는 것을 나타내고 있습니다.HttpSession 있습니다.CsrfToken하지만, 어찌된 일인지,HttpSession has 가 되었다null스텝 15가 클라이언트로부터의 콜을 트리거 할 때까지localhost:8080/login을 url로 localhost:9999/oauth/token엔드 포인트

다음 디버깅로그에 기재되어 있는의 모든 행에 브레이크 포인트가 추가되었습니다.(에 있습니다.Maven Dependenciesauthserver이클립스 프로젝트)이러한 중단점을 통해 다음 흐름도에서 에 대한 최종 요구가 이루어지는 것이 확인되었습니다(흐름도의 왼쪽 하단).null HttpSession도 있습니다.JSESSIONID된 후 .DefaultOAuth2RequestFactory코드가 실행됩니다.

하면 이 할 수 같은 할 수 있을까요?HttpSession remains 、 remains remains to to to to to to to to to에 대한 콜 ./oauth/token순서 15의 종료 후에 엔드 포인트에 접속할 수 있습니까?


관련 코드 및 로그:

of の CustomOAuth2RequestFactory.java 이 링크를 클릭하면 파일 공유 사이트에서 볼 수 있습니다.할 수 요.null session는, 것입니다JSESSIONID 되지 않음CustomOAuth2RequestFactory2. ), 「」, 「」, 「 」,HttpSession 있는 것null- - if. - if.

Boot 에 대한 /oauth/token스텝 15 에, 없는 것을 명확하게 기술합니다.HttpSession되면 수 요.

2016-05-30 15:33:42.630 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy        : /oauth/token at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy        : /oauth/token at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : No SecurityContext was available from the HttpSession: null. A new one will be created.
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy        : /oauth/token at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@2fe29f4b
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy        : /oauth/token at position 4 of 12 in additional filter chain; firing Filter: 'CsrfFilter'
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:9999/uaa/oauth/token
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed


컴퓨터 문제 재현:

다음과 같은 간단한 단계를 수행하면 몇 분 만에 모든 시스템에서 문제를 재현할 수 있습니다.

1) 이 링크를 클릭하여 파일 공유 사이트에서 앱 압축 버전을 다운로드합니다.

을 풉니다:2) 라고 tar -zxvf oauth2.tar(4).gz

을 합니다.authserver으로 oauth2/authserver 다음 '어느 정도'를 입력합니다.mvn spring-boot:run

44.를 합니다.)resource으로 oauth2/resource 다음 '어느 정도'를 입력합니다.mvn spring-boot:run

5. 를 합니다).ui app by navigating to 앱으로 이동oauth2/ui and then typing 그리고 타이핑.mvn spring-boot:run

6. 웹 브라우저를 열고 6 라우 6저 6브 to고열 browser를 and) open웹 web navigate a 6 browser 6)를 엽니다.http : // localhost : 8080

7.) Click 7.) 을 클릭합니다.Login and then enter 그리고 나서Frodo사용자 및 자 로 as and the및 userMyRing암호를 입력하고 제출하려면 클릭하십시오.를 클릭하여 송신합니다.

8을 입력합니다.)5309Pin Code[ Submit ]을 클릭합니다.그러면 위에 표시된 오류가 트리거됩니다.

Spring Boot 디버깅로그에는 A LOT of 이 표시됩니다.이러한 로그에는 흐름도에 나타난단계에서의 및 등의 변수 값이 표시됩니다.SYSO는 디버깅로그를 쉽게 해석할 수 있도록 세그먼트화하는 데 도움이 됩니다. 그 모든 SYSO 클래스가 할 수 있습니다.SYSO- 흐름의 에서 변경 하기 위한 - 제어 흐름의 변경 보고서 생성.SYSO- 는 - 클래 is 。TestHTTP는, 「소스코드」, 「소스코드」에 demo★★★★★★★★★★★★★★★★★★.


디버거 사용:

1) 을 하고 있는 합니다.authserver하고, 「」를 합니다.Ctrl-C 막다를 authserver앱.

앱을 Import (2) 3개의 앱을 Import 합니다.authserver,resource , , , , 입니다.ui기존 메이븐 프로젝트로 일식이 됩니다.

authserver앱의 Eclipse Project Explorer를 클릭하여 폴더를 펼친 후 아래 그림에서 주황색으로 동그라미로 표시된 것처럼 폴더를 아래로 스크롤하여 클릭하여 항아리를 확장합니다.그런 다음 스크롤하여 검색하여 확장합니다.org.springframework.security.web.context then . 두 번 하면 런음음음 the the the the the가 열립니다.HttpSessionSecurityContextRepository아래 스크린샷에서 파란색으로 강조 표시된 클래스입니다.이 클래스의 모든 행에 중단점을 추가합니다.도 똑같이 이 좋을 것 같아요.SecurityContextPersistenceFilter같은 패키지의 클래스입니다.이러한 브레이크 포인트에 의해, 현재 다음의 값을 확인할 수 있습니다.null플로우가 에, , 「」, 「」, 「」, 「」, 「」, 「」에 매핑 할합니다.XSRF-TOKENOP.를하려면 , OP.를 참조해 주세요.

) ★★★★★★★★★★★★★★★★★★★★★★★.demo 「」 포인트 추가, 「」내에서의 브레이크 포인트 추가CustomOAuth2RequestFactory.java .그리고나서Debug As... Spring Boot App디버거를 시작합니다.

5. 다음으로 위의 6~8단계를 반복합니다.새로 시도하기 전에 브라우저의 캐시를 지울 수 있습니다.브라우저 개발자 도구의 네트워크 탭을 열어야 할 수도 있습니다.

세션이 null이 아닙니다.authserver 콜 시 " " " 。localhost :9999/uaa/oauth/token세션이 존재할 뿐만 아니라 사용자가 올바른 핀을 송신한 지점과 실패한 요구가 송신된 지점 사이의 제어 흐름에 존재하는 유효한 세션 값의 토큰이 일치합니다./oauth/token들어졌졌다다

는 이 두 가지가 입니다.JSESSIONID의 값 중 되어 2개의 값으로 이 입력됩니다./oauth/token이 하여 불량 하는 것으로 JSESSIONID을 사용하다

다음은 요약입니다.


HttpSessionListener한 것을 JSESSIONID

하기 위해 저는 '이행하다', '이행하다', '이행하다'의 .HttpSessionListener커스텀 실장으로부터 호출했습니다.HttpLListener , , , , , , , , , , , , 。

public class HttpSessionCollector implements HttpSessionListener, ServletContextListener {

    private static final Set<HttpSession> sessions = ConcurrentHashMap.newKeySet();

    public void sessionCreated(HttpSessionEvent event) {
        sessions.add(event.getSession());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        sessions.remove(event.getSession());
    }

    public static Set<HttpSession> getSessions() {
        return sessions;
    }

    public void contextCreated(ServletContextEvent event) {
        event.getServletContext().setAttribute("HttpSessionCollector.instance", this);
    }

    public static HttpSessionCollector getCurrentInstance(ServletContext context) {
        return (HttpSessionCollector) context.getAttribute("HttpSessionCollector.instance");
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
    }

}

위에 것을 .HttpSessionListener의 에서는,OncePerRequestFilterauthserver같은 보안 필터

@Component
public class DiagnoseSessionFilter extends OncePerRequestFilter implements ServletContextAware {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain fc) throws ServletException, IOException {

    System.out.println("...........///////////// START OF DiagnoseSessionFilter.doFilterInternal() ///////////...........");
    //start of request stuff
    System.out.println("\\\\\\\\\\ REQUEST ATTRIBUTES ARE: ");
    if(req.getAttribute("_csrf")!=null){
        System.out.println("_csrf is: " + req.getAttribute("_csrf").toString());
    }
    if(req.getAttribute("org.springframework.security.web.csrf.CsrfToken")!=null){
        CsrfToken ucsrf = (CsrfToken) req.getAttribute("org.springframework.security.web.csrf.CsrfToken");
        System.out.println("ucsrf.getToken() is: " + ucsrf.getToken());
    }
    String reqXSRF = req.getHeader("XSRF-TOKEN");
    System.out.println("request XSRF-TOKEN header is: " + reqXSRF);
    String reqCookie = req.getHeader("Cookie");
    System.out.println("request Cookie header is: " + reqCookie);
    String reqSetCookie = req.getHeader("Set-Cookie");
    System.out.println("request Set-Cookie header is: " + reqSetCookie);
    String reqReferrer = req.getHeader("referrer");
    System.out.println("request referrer header is: " + reqReferrer);
    HttpSession rsess = req.getSession(false);
    System.out.println("request.getSession(false) is: " + rsess);
    if(rsess!=null){
        String sessid = rsess.getId();
        System.out.println("session.getId() is: "+sessid);
    }
    System.out.println("/////////// END OF REQUEST ATTRIBUTES ");

    //end of request stuff
    ServletContext servletContext = req.getServletContext();
    System.out.println("\\\\\\\\\\ START OF SESSION COLLECTOR STUFF ");

    HttpSessionCollector collector = HttpSessionCollector.getCurrentInstance(servletContext);
    Set<HttpSession> sessions = collector.getSessions();

    System.out.println("sessions.size() is: " + sessions.size());
    for(HttpSession sess : sessions){
        System.out.println("sess is: " + sess);
        System.out.println("sess.getId() is: " + sess.getId());
        CsrfToken sessCsrf = (CsrfToken) sess.getAttribute("org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN");
        System.out.println("csrf is: " + sessCsrf);
        if(sessCsrf!=null){
            if(sessCsrf.getToken()!=null){
                System.out.println("sessCsrf.getToken() is: " + sessCsrf.getToken());
            } else { System.out.println("sessCsrf.getToken() is: null "); }
        } else { System.out.println("sessCsrf is: null "); }

        System.out.println("sess.getAttribute(SPRING_SECURITY_SAVED_REQUEST) is: " + sess.getAttribute("SPRING_SECURITY_SAVED_REQUEST") );
        if(sess.getAttribute("SPRING_SECURITY_SAVED_REQUEST") instanceof DefaultSavedRequest){
            System.out.println("_____ START PRINTING SAVED REQUEST");
            DefaultSavedRequest savedReq = (DefaultSavedRequest) sess.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
            List<Cookie> savedCookies = savedReq.getCookies();
            for(Cookie cook : savedCookies){
                String name = cook.getName();String value = cook.getValue();
                System.out.println("cookie name, value are: " + name + " , " + value);
            }
            Collection<String> savedHeaderNames = savedReq.getHeaderNames();
            for(String headerName : savedHeaderNames){
                System.out.println("headerName is: " + headerName);
            }
            List<Locale> savedLocales = savedReq.getLocales();
            for(Locale loc : savedLocales){
                System.out.println("loc.getLanguage() is: " + loc.getLanguage());
            }
            String savedMethod = savedReq.getMethod();
            System.out.println("savedMethod is: " + savedMethod);
            Map<String, String[]> savedParamMap = savedReq.getParameterMap();
            Iterator<Entry<String, String[]>> it = savedParamMap.entrySet().iterator();
            while (it.hasNext()) {
                Entry<String, String[]> pair = it.next();
                System.out.println("savedParamMap: " + pair.getKey() + " = " + pair.getValue());
                it.remove(); // avoids a ConcurrentModificationException
            }
            Collection<String> savedParamNames = savedReq.getParameterNames();
            for(String savedParamName : savedParamNames){
                System.out.println("savedParamName: " + savedParamNames);
            }
            System.out.println("_____ DONE PRINTING SAVED REQUEST");

        }

//      System.out.println("sess.getAttribute(SPRING_SECURITY_CONTEXT) is: " + sess.getAttribute("SPRING_SECURITY_CONTEXT") );
        if(sess.getAttribute("SPRING_SECURITY_CONTEXT") instanceof SecurityContextImpl){
            SecurityContext ctxt = (SecurityContext) sess.getAttribute("SPRING_SECURITY_CONTEXT");
            Authentication auth = ctxt.getAuthentication();

            if(auth.getDetails() instanceof WebAuthenticationDetails){
                WebAuthenticationDetails dets = (WebAuthenticationDetails) auth.getDetails();
                System.out.println( "dets.getSessionId() is: " + dets.getSessionId() );
            }
            System.out.println("auth.getAuthorities() is: " + auth.getAuthorities() );
            System.out.println("auth.isAuthenticated() is: " + auth.isAuthenticated() );
        }
    }

    SecurityContext context = SecurityContextHolder.getContext();
    System.out.println("...........///////////// END OF DiagnoseSessionFilter.doFilterInternal() ///////////...........");
    fc.doFilter(req, res);

    }
}


문제 코드 분리:

다음은 의 진단 데이터를 조합하여 요약한 것입니다.HttpSessionListener 핀 하는 스텝과 웹 브라우저의 /oauth/token엔드 포인트

보시다시피 두 가지 값이 떠돌고 있습니다. 값 중 하나는 올바르고 다른 하나는 올바르지 않습니다.잘못된 값이 요청으로 전달됩니다./oauth/token당해도 이 거절당해도 마찬가지입니다.csrf그렇기 에 대한 은 아래 단계하여 나쁜 것을 배치하지 하는 것입니다.JSESSIONID좋은 것을 대신해서:

1.) POST http://localhost:9999/uaa/secure/two_factor_authentication
    request headers:
        Referer: 9999/uaa/secure/two_factor_authentication
        Cookie: 
            JSESSIONID: ....95CB77     
                        ....918636
            XSRF-TOKEN: ....862a73
    filter chain:
        DiagnoseSessionFilter:
            request stuff:
                Cookie header:
                    JSESSIONID: ....95CB77
                                ....918636
                    XSRF-TOKEN: ....862a73
                request.getSession(false).getId(): ....95CB77
            session collector stuff:
                JSESSIONID: ....95CB77
                csrf: ....862a73
                SPRING_SECURITY_SAVED_REQUEST is null
            user details (from Authentication object with user/request
                JSESSIONID: ....ED927C
                Authenticated = true, with roles
        Complete the filter chain
        DiagnoseSessionFilter (again)
            request stuff:
                csrf attribute: ....862a73
                Cookie header: 
                    JSESSIONID: ....95CB77 
                                ....918636
                    XSRF-TOKEN: ....862a73
                request.getSession(false).getId(): 95CB77
            session collector stuff:
                JSESSIONID: ....95CB77
                csrf is: 862a73
                SPRING_SECURITY_SAVED_REQUEST is null
            user details (Authentication for user/session/request)
                JSESSIONID: ....ED927C
                Authenticated = true, with authorities
        POST/secure/two_factor_authenticationControllerMethod
            do some stuff
    response:
        Location: 9999/uaa/oauth/authorize?....
        XSRF-TOKEN: ....862a73

2.) GET http://localhost:9999/uaa/oauth/authorize?...
    request headers:
        Host: localhost:9999
        Referer: 9999/uaa/secure/two_factor_authentication
        Cookie: 
            JSESSIONID: ....95CB77    
                        ....918636
            XSRF-TOKEN: ....862a73
    FilterChain
        DiagnoseSessionFilter
            request stuff:
                Cookie header is: JSESSIONID: ....95CB77
                                              ....918636
                                  XSRF-TOKEN: ....862a73
                request.getSession(false).getId(): 95CB77
            session collector stuff: 
                JSESSIONID: ....95CB77
                csrf is: ....862a73
                SPRING_SECURITY_SAVED_REQUEST is: null
            user details (Authentication object with user/session/req)
                JSESSIONID: ....ED927C
                Authenticated = true with ALL roles.
        rest of filter chain
        TwoFactorAuthenticationFilter
            request stuff:
                csrf request attribute is: ....862a73
                cookie header:
                    JSESSIONID: ....95CB77
                                ....918636
                    XSRF-TOKEN: ....862a73
                request.getSession(false).getId() is: ....95CB77
                updateCsrf is: ....862a73
            response stuff:
                XSRF-TOKEN header (after manual update): ....862a73
        DiagnoseSessionFilter:
            request stuff:
                _csrf request attribute: ....862a73
                Cookie header:
                    JSESSIONID: ....95CB77
                                ....918636
                    XSRF-TOKEN: ....862a73
                    request.getSession(false).getId() is: ....95CB77
            session collector stuff: 
                JSESSIONID: ....95CB77
                csrf is: ....862a73
                SPRING_SECURITY_SAVED_REQUEST is: null
            user details (Authentication for user/session/request) 
                JSESSIONID: ....ED927C
                Authenticated is true, with ALL roles.
        CustomOAuth2RequestFactory
            request stuff:  
                _csrf request parameter is: ....862a73
                Cookie header: 
                    JSESSIONID: ....95CB77
                                ....918636
                    XSRF-TOKEN: ....862a73
                request.getSession(false).getId() is: ....95CB77
                updateCsrf: ....862a73
            response stuff:
                XSRF-TOKEN header: ....862a73
            session attribute printout
                csrf: ....862a73
                SPRING_SECURITY_CONTEXT (not printed, so don't know values)
    response:
        Location: 8080/login?code=myNwd7&state=f6b3Km
        XSRF-TOKEN: ....862a73

3.) GET http://localhost:8080/login?code=myNwd7&state=f6b3Km
    request headers:
        Host: localhost:8080
        Referer: 9999/uaa/secure/two_factor_authentication
        Cookie:  
            JSESSIONID: ....918636
            XSRF-TOKEN: ....862a73
    UiAppFilterChain:
        HttpSessionSecurityContextRepository
            creates new SPRING_SECURITY_CONTEXT to replace null one
        OAuth2ClientAuthenticationProcessingFilter (position 8 of 14)
            AuthorizationCodeAccessTokenProvider
                Retrieving token from 9999/uaa/oauth/token
    AuthServerFilterChain:
        DiagnoseSessionFilter
            request stuff:
                XSRF-TOKEN header is: null
                Cookie header is: null
                Set-Cookie header is: null
                referrer header is: null
                request.getSession(false) is: null
            session collector stuff:
                JSESSIONID: ....95CB77
                sessCsrf.getToken() is: 862a73
                SPRING_SECURITY_SAVED_REQUEST is: null
                Authenticated is true but with ONLY these roles: 
                    ROLE_HOBBIT, ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED
            SecurityContextPersistenceFilter
                reports no HttpSession and no SPRING_SECURITY_CONTEXT
            CsrfFilter
                rejects request to /oauth/token due to no session % csrf

    response headers:
        Set-Cookie: 
            XSRF-TOKEN: ....527fbe
            X-Frame-Options: DENY

제안하신 포인트 수를 고려하여 좀 더 시간을 들여 솔루션을 분리해 보겠습니다.그러나 위의 내용은 문제를 상당히 좁힐 것이다.

당신의 보상 기간이 곧 만료되기 때문에 완성되기 전에 글을 올립니다.

당신의 문제는 해결되었습니까?spring-security-oauth2와 함께 2FA 풀샘플을 찾고 있습니다.컨셉과 출처를 모두 게재해 주셔서 감사합니다.

패키지를 시험해 봤는데, Authserver Application에서 코드 한 줄만 바꾸면 문제를 간단히 해결할 수 있습니다.자바

@Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .formLogin().loginPage("/login").permitAll()
        .and()
                .requestMatchers().antMatchers("/login", "/oauth/authorize", "/secure/two_factor_authentication", "/pincode")
        .and()
                .authorizeRequests().anyRequest().authenticated();
        // @formatter:on
    }

에 의해 원래 설정이 스프링보안 인증 체인을 통과하여 인증의 늘오브젝트가 반환되었습니다.

커스텀의 Bean 작성도 변경할 것을 권장합니다.체인의 모든 OAuth2RequestFactory를 덮어쓰는 다음 OAuth2RequestFactory에 대한 OAuth2RequestFactory

@Bean
    public OAuth2RequestFactory customOAuth2RequestFactory(){
        return new CustomOAuth2RequestFactory(clientDetailsService);
    }

CSRF를 처리하기 위해 추가한 코드의 경우 2FA 컨트롤러와 같은 코드를 삭제하기만 하면 됩니다.

@Controller
@RequestMapping(TwoFactorAuthenticationController.PATH)
public class TwoFactorAuthenticationController {
    private static final Logger LOG = LoggerFactory.getLogger(TwoFactorAuthenticationController.class);
    public static final String PATH = "/secure/two_factor_authentication";
    public static final String AUTHORIZE_PATH = "/oauth/authorize";
    public static final String ROLE_TWO_FACTOR_AUTHENTICATED = "ROLE_TWO_FACTOR_AUTHENTICATED";

    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @RequestMapping(method = RequestMethod.GET)
    public String auth(HttpServletRequest request, HttpSession session, HttpServletResponse resp/*, ....*/) {
        System.out.println("-------- inside GET /secure/two_factor_authentication --------------");
        if (AuthenticationUtil.isAuthenticatedWithAuthority(ROLE_TWO_FACTOR_AUTHENTICATED)) {
            LOG.info("User {} already has {} authority - no need to enter code again", ROLE_TWO_FACTOR_AUTHENTICATED);
//            throw ....;
        }
        else if (session.getAttribute(CustomOAuth2RequestFactory.SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME) == null) {
//            LOG.warn("Error while entering 2FA code - attribute {} not found in session.", CustomOAuth2RequestFactory.SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME);
//          throw ....;
        }
        return "pinCode";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String auth(FormData formData, HttpServletRequest req, HttpServletResponse resp,
                                            SessionStatus sessionStatus, Principal principal, Model model)
        throws IOException{

        if (formData.getPinVal()!=null) {
            if(formData.getPinVal().equals("5309")){
                AuthenticationUtil.addAuthority(ROLE_TWO_FACTOR_AUTHENTICATED);
                return "redirect:"+AUTHORIZE_PATH;
            };
        };

        return "pinCode";
    }
}

청소 후 완전한 소스 코드를 원하시면 알려주세요.

언급URL : https://stackoverflow.com/questions/37534880/httpsession-null-after-replacing-authorizationrequest