본문 바로가기
프로그래밍/스프링프레임워크

전자정부표준프레임워크 Spring Security 사용시 로그인한 사용자정보에 추가정보 넣기

by pentode 2018. 4. 20.

전자정부표준프레임워크에서 스프링 시큐리티가 적용되어 있을 때 로그인한 사용자의 정보를 얻기 위해서는 다음과 같이 사용합니다.


import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.com.cmm.LoginVO;
...
// 로그인 여부 확인
Boolean isLogin = EgovUserDetailsHelper.isAuthenticated();

// 로그인한 사용자 정보
LoginVO user = null;
if(isLogin) {
    user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
}


로그인 후 세션에 저장되어 있던 LoginVO를 얻었다면 필요한 곳에 사용할 수 있습니다. 이 세션에 저장되는 정보에 추가적으로 다른 정보를 넣을 필요가 있을 경우도 있습니다. 이때 어떻게 처리하는지 알아 보겠습니다.



1. LoginVO 가 추가 정보를 저장할 수 있도록 멤버 변수를 추가하고, getter/setter도 추가합니다.



2. 전자정부표준프레임워크 Spring Security 간소화 설정에서 로그인한 사용자의 정보를 가져오는 곳은 context-security.xml 파일에 있습니다.


<egov-security:config id="securityConfig"
    loginUrl="/uat/uia/actionSecurityLogin.do"
    logoutSuccessUrl="/uat/uia/actionMain.do"
    loginFailureUrl="/uat/uia/actionSecurityLogin.do?login_error=1"
    accessDeniedUrl="/sec/ram/accessDenied.do"

    dataSource="dataSource"
    jdbcUsersByUsernameQuery="SELECT USER_ID, ESNTL_ID AS PASSWORD, 1 ENABLED, USER_NM, USER_ZIP, USER_ADRES, USER_EMAIL, USER_SE,  '-' ORGNZT_ID, ESNTL_ID, '-' ORGNZT_NM FROM COMVNUSERMASTER WHERE CONCAT(USER_SE, USER_ID) = ?"
    jdbcAuthoritiesByUsernameQuery="SELECT A.SCRTY_DTRMN_TRGET_ID USER_ID, A.AUTHOR_CODE AUTHORITY FROM LETTNEMPLYRSCRTYESTBS A, COMVNUSERMASTER B WHERE A.SCRTY_DTRMN_TRGET_ID = B.ESNTL_ID AND B.USER_ID = ?"
    jdbcMapClass="egovframework.let.uat.uia.service.impl.EgovSessionMapping"

    requestMatcherType="regex"
    hash="plaintext"
/>


여기에서 jdbcUsersByUsernameQuery 속성에 있는 쿼리가 필요한 정보를 가져옵니다. 사용자 테이블 뷰로부터 정보를 가져오고 있습니다. 필요한 정보를 추가로 가져오도록 뷰와 쿼리를 수정하면 되겠습니다.


SELECT   USER_ID
       , ESNTL_ID AS PASSWORD
       , 1 ENABLED
       , USER_NM
       , USER_ZIP
       , USER_ADRES
       , USER_EMAIL
       , USER_SE
       ,  '-' ORGNZT_ID
       , ESNTL_ID
       , '-' ORGNZT_NM
  FROM COMVNUSERMASTER
 WHERE CONCAT(USER_SE, USER_ID) = ?


3. 다음은 쿼리에서 가져온 정보를 LoginVO의 멤버변수에 맵핑하는 부분을 수정합니다.


이 기능을 수행하는 곳은 jdbcMapClass 속성에 지정되어있는 egovframework.let.uat.uia.service.impl.EgovSessionMapping 클래스 입니다. 이 클래스의 mapRow() 메소드에 필요한 정보를 ResultSet 으로부터 추출해서 LoginVO 에 저장하는 코드를 추가합니다.


@Override
protected EgovUserDetails mapRow(ResultSet rs, int rownum) throws SQLException {
    String strUserId    = rs.getString("user_id");
    String strPassWord  = rs.getString("password");
    boolean strEnabled  = rs.getBoolean("enabled");
    ...
    String strUserNm    = rs.getString("user_nm");
    String strUserSe    = rs.getString("user_se");
    ...

    // 세션 항목 설정
    LoginVO loginVO = new LoginVO();
    loginVO.setId(strUserId);
    loginVO.setPassword(strPassWord);
    ...
    loginVO.setName(strUserNm);
    loginVO.setUserSe(strUserSe);
    ...

    return new EgovUserDetails(strUserId, strPassWord, strEnabled, loginVO);
}


이제 세션에 저장된 LoginVO로 부터 추가된 정보를 얻을 수 있습니다.



반응형