sin개발자
234
2020-09-17 11:02:20 작성 2020-09-17 11:09:13 수정됨
2
278

OAuth2.0 로그인 spring security 처리 질문


기존 로그인방식에 카카오, 네이버 로그인을 추가중입니다.


그중 카카오를 먼저 하고있는데

카카오 로그인을 통해 필요한 사용자 정보는 모두 가져온 상태입니다.

그런데 spring security 권한설정 부분에서 막혀있습니다.

*왜냐하면 현재 pom.xml에 dependency를 추가해서

oauth관련 jar파일을 받을 수 없는 상황이거든요.


기존 로그인로직은 spring security를 통해 권한 설정 및

로그인 처리가 정상적으로 됩니다.


controller

 @RequestMapping(value="/hws/portal/main/AuthenticationLogin.do")
    public void getKakaoTokenUserInfo(String code, HttpServletRequest request, HttpServletResponse response, HttpSession session, HttpSecurity http) throws Exception {
    	String access_Token = loginService.getAccessToken(request, code);
    	HashMap<String, Object> userInfo = loginService.getUserInfo(access_Token);
    	EgovMap userInfoMap = new EgovMap();
    	
    	System.out.println("login Controller : " + userInfo);
    	
    	String esntlId = memberShipService.getNextEsntlId();
    	String kakaoID = (String) userInfo.get("kakaoID");
    	String nickName = (String) userInfo.get("nickName");
    	
    	// 카카오ID로 현재 DB에 일치하는 user정보가 있는지 확인
    	String kakaoUserID = loginService.getKakaoUserInfo(kakaoID);
    	userInfoMap.put("esntlId", esntlId);
    	userInfoMap.put("kakaoID", kakaoID);
    	userInfoMap.put("nickName", nickName);
    	userInfoMap.put("AUTHFLAG", "K");		//AUTH 구분자 컬럼 : K:카카오, N:네이버
    	
    	
    	if(kakaoUserID == null){
    		loginService.insertKakaoUserInfo(userInfoMap);
    		kakaoUserID = loginService.getKakaoUserInfo(kakaoID);
    	}
    	
//      클라이언트의 이메일이 존재할 때 세션에 해당 이메일과 토큰 등록
//        if (userInfo.get("email") != null) {
//            session.setAttribute("userId", userInfo.get("email"));
//            session.setAttribute("access_Token", access_Token);
//        }
        
        //아이피 가지고 오기
        String userIp = EgovClntInfo.getClntIP(request);
        
        LoginVO loginVO = new LoginVO(); 
        loginVO.setAuthUserID(kakaoUserID);
        
    	// 1. 일반 로그인 처리
        loginVO.setUserIp(userIp);
        
        LoginVO resultVO = loginService.actionOAuthLogin(loginVO);
        
        if (resultVO != null && resultVO.getAuthUserID() != null && !resultVO.getAuthUserID().equals("")) 
        {
			UsernamePasswordAuthenticationFilter springSecurity = null;
			
			ApplicationContext act = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
			@SuppressWarnings("rawtypes")
			Map beans = act.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter)beans.values().toArray()[0];
		    } else {
		    	throw new IllegalStateException("No AuthenticationProcessingFilter");
		    }
			springSecurity.setContinueChainBeforeSuccessfulAuthentication(false);	// false 이면 chain 처리 되지 않음.. (filter가 아닌 경우 false로...)
			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getAuthUserID(), resultVO.getEsntlId()), response, null);
        	
			Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
			
	     	if(isAuthenticated.booleanValue()) {
	     		//패스워드삽입 제외
	     		resultVO.setPassword(null);
	     		request.getSession().setAttribute("LoginVO", resultVO);
	     	}
    		
        }
        
        // 로그인 팝업창 닫기
        loginService.popUpCloseFunction(response);
        
//    	RequestDispatcher dispatcher = request.getRequestDispatcher("/hws/portal/main/loginUsrView.do");
//    	dispatcher.forward(request, response);
    }
    
    
    /**
	 * 스프링시큐리티 커스텀
	 */
    class RequestWrapperForSecurity extends HttpServletRequestWrapper {	
    	String username = null;
    	String password = null;
     
    	public RequestWrapperForSecurity(HttpServletRequest request, String username, String password) {
    		super(request);
     
    		this.username = username;
    		this.password = password;
    	}
     
    	@Override
    	public String getRequestURI() {
    		String returnUri = ((HttpServletRequest)super.getRequest()).getContextPath() + "/j_spring_security_check";
    		return returnUri;
    	}
     
    	@Override
    	public String getParameter(String name) {
            if (name.equals("j_username")) {
            	return username;
            }
     
            if (name.equals("j_password")) {
            	return password;
            }
     
            return super.getParameter(name);
        }
    }


context-security.xml

<http access-denied-page="/hws/com/cmm/accessDenied.do">
		<!-- <intercept-url pattern="\A/hws/portal/sch/.*\Z" access="ROLE_USER" />  regex-->
		<!-- <intercept-url pattern="/hws/portal/sch/**" access="ROLE_USER" /> ant-->
		<!-- <intercept-url pattern="/**" access="ROLE_ANONYMOUS" /> ant-->
		<form-login login-processing-url="/j_spring_security_check"
					authentication-failure-url="/hws/portal/main/loginUsrView.do?login_error=1"
					always-use-default-target="false"
					login-page="/hws/portal/main/loginUsrView.do"
					authentication-success-handler-ref="loginSuccessHandler"/>
		<anonymous/>
		
		<logout logout-url="/j_spring_security_logout" success-handler-ref="logoutSuccessHandler" />
		 
		<session-management>
			<concurrency-control max-sessions="1" expired-url="/hws/com/cmm/loginMaxError.do"/>
		</session-management>
 
		<!-- for sqlRolesAndUrl 적용 ,http에 직접 쓰는 intercept-url 적용안됨 -->
		<custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="filterSecurityInterceptor"/>
	</http>


spring security를 통해 로그인 처리를 하는 방법좀 알려주세요...


현재 context-security.xml은

기존 로그인 로직에 해당하는 설정 입니다.

만약 문제가 있다면 지적 부탁드립니다.

0
  • 답변 2

  • 제타건담
    7k
    2020-09-17 12:07:50

    외부에서 OAuth 라이브러리를 받을수 없는 거라면 외부에서 따로 받아다가 넣어서 작업할수도 있자너요..
    넥서스같은 maven repository를 사용중이시라면 관련 jar를 받아서 넣을수도 있을듯 한데요..

  • sin개발자
    234
    2020-09-17 14:10:43
    그것도 안되서 질문 올린거에요 ㅜ,ㅜ
  • 로그인을 하시면 답변을 등록할 수 있습니다.