봄싹2011.06.22 14:07



개인적으론.. 윗녀석이 맘에 든다;;;
Posted by is윤군
TAG 봄싹
봄싹2009.10.28 15:55
1편에 이어 바로 완결편!!

이유는 .. 다른 해결 포인트를 찾아서 ...
lab 에서 바로 삭제되었음.

그래서 다음 글로 넘어감..
이름하여 .. Spring3.0 MVC 대충 이야기 & JSON VIEW에 대한 해결책!!

ㄱㄱㄱ
Posted by is윤군
봄싹2009.10.16 00:41
spring security 3.0 m2 기준 .

AbstractAuthenticationTargetUrlRequestHandler.java

66 line ~~

private String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { if (isAlwaysUseDefaultTargetUrl()) { return defaultTargetUrl; } // Check for the parameter and use that if available String targetUrl = request.getParameter(targetUrlParameter); if (StringUtils.hasText(targetUrl)) { try { targetUrl = URLDecoder.decode(targetUrl, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new IllegalStateException("UTF-8 not supported. Shouldn't be possible"); } logger.debug("Found targetUrlParameter in request: " + targetUrl); return targetUrl; } if (useReferer && !StringUtils.hasLength(targetUrl)) { targetUrl = request.getHeader("Referer"); logger.debug("Using Referer header: " + targetUrl); } if (!StringUtils.hasText(targetUrl)) { targetUrl = defaultTargetUrl; logger.debug("Using default Url: " + targetUrl); } return targetUrl; }


위에 놈은 최종적으로 로그인 프로세스를 탄후에 .. 리턴을 해주는 url을 구하는 부분입니다.
alwaysUseDefaultTargetUrl 이 우선적으로 false 이고 .. (기본값 false)
request.getParameter(targetUrlParameter); 이놈 즉..
파라미터에 targetUrlParameter 이름. 즉

public static String DEFAULT_TARGET_PARAMETER = "spring-security-redirect";
private String targetUrlParameter = DEFAULT_TARGET_PARAMETER;

이놈을 설정해주면 ..
로그인 후에 원하는 페이지로 보낼 수 있습니다..
안정한다면 기본으로 정한 default 페이지로 날라가구요 ..ㅎㅎ

머.. 그냥 기억용으로 남김.
Posted by is윤군
봄싹2009.09.29 01:58
현재 봄싹에선 스프링 시큐리티 3.0m2 버전을 사용중이다.
그런데 새로운 디자인에 ajax 로그인이 생기면서 문제가 좀 발생했다..

지금 사용 하는 유저 인증 관련 필터는..
UsernamePasswordAuthenticationProcessingFilter 이놈이 다..
UserDetailsService을 구현 해서 . DaoAuthenticationProvider 이놈을 통해서
유저 인증을 한다 .

문제는 인증이 문제가 아니다 ..

<form-login login-page="/login.do"
            authentication-failure-url="/login.do?login_error=t"
            default-target-url="/mypage/index.do" />

기존에 이런식으로 설정이 되어 있다 .
대충 결론 부터 이야기 하면... 로그인이 성공을 하면 .. /mypage/index.do 로 리다이렉트..
실패면 /login.do?login_error=t 이렇게 리다이렉트..

ajax에 리다이렉트라... 이게 웬말인가..
하지 말라는거야 머야 ? ㅡㅡ;;

그래서 좀 살펴 봤다..

UsernamePasswordAuthenticationProcessingFilter의 아버지를 보면 AbstractAuthenticationProcessingFilter 이놈인데..
이놈의 doFilter 를 살펴보면..

더보기


이러하다 .. 빨간곳에서.. (저놈은 UsernamePasswordAuthenticationProcessingFilter이 구현 했다.. ) 로그인 인증을 한다.
그리고 실패면 .. AuthenticationException  이놈을 throw 하고.. 아니면.. 일단 다음 진행 단계로 넘어간다.

1. 실패시..
unsuccessfulAuthentication 이놈을 살펴보면.. SimpleUrlAuthenticationFailureHandler 요놈을 핸들러로 .. 사용중인데..
forwardToDestination 이값을 변경하여
 if (forwardToDestination) {
                request.getRequestDispatcher(defaultFailureUrl).forward(request, response);
            } else {
                RedirectUtils.sendRedirect(request, response, defaultFailureUrl, useRelativeContext);
            }

포워드와 리다이렉트를 할 수 구별할수 잇다..

*** 여기서 리다이렉트가 왜 안되냐면 현재 봄싹에선 ajax 호출에 대해서 ..
header 에 정보를 담아서 보내는데.
결국 리다이렉트로 넘어가면 header 정보가 없어진다.. (웃긴 이야기지만 ..  ie6.0 / 크롬/ 에선 안사라짐..
ff 만 header 정보 사라짐.. )


2.성공시..
성공시가 successfulAuthentication 가장 골때리는데..
SavedRequestAwareAuthenticationSuccessHandler 결국 이놈이 처리 하긴 하는데..

  @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws ServletException, IOException {
        SavedRequest savedRequest = requestCache.getRequest(request, response);

        if (savedRequest == null) {
            super.onAuthenticationSuccess(request, response, authentication);

            return;
        }

        if (isAlwaysUseDefaultTargetUrl() || StringUtils.hasText(request.getParameter(getTargetUrlParameter()))) {
            requestCache.removeRequest(request, response);
            super.onAuthenticationSuccess(request, response, authentication);

            return;
        }

        // Use the SavedRequest URL
        String targetUrl = savedRequest.getFullRequestUrl();
        logger.debug("Redirecting to SavedRequest Url: " + targetUrl);
        RedirectUtils.sendRedirect(request, response, targetUrl, isUseRelativeContext());
    }


보시다 싶이.. 무조건 리다이렉트를 한다..

일단 문제 파악은.. 여기서 끝.. ;;

생각해본 해결 방안은 크게 3가지 정도가 있다..
1. 헨들러를 각각 구현을 해주던가..
2. 아니면...  UsernamePasswordAuthenticationProcessingFilter 이놈을 새로 거시기 하던가 .
3. 약간의 꽁수이긴 헌데.. xxx.do?spring-security-redirect=해당url 이런식으로 ajax 로그인과 비 ajax로그인의 url을 다르게 줘서 구현하던가.. fail에대해선.. forwardToDestination true로 주고 말이지..

일단.. 생각은..

xml에.
    <form-login login-page="/login.do"
            authentication-failure-url="/loginFailProcess.do"
            default-target-url="/loginSuccessProcess.do" />

이렇게 등록하고... 해당 컨트럴에서 .. 먼가 처리하려고 생각중.. 그러니 3번은 아닌거다..
1번 아니면 2번인데 정우형이 자꾸 필터를 하고 싶어한다..

구현은 내일로.. 벌써 2시다 ㅡㅡ;;
Posted by is윤군
봄싹2009.09.29 01:07
기본 스프링 3.0 시큐리티 필터 순서.

[0] SecurityContextPersistenceFilter (id=254)
[1] LogoutFilter (id=256)
[2] UsernamePasswordAuthenticationProcessingFilter (id=258)
[3] RequestCacheAwareFilter (id=267)
[4] SecurityContextHolderAwareRequestFilter (id=269)
[5] RememberMeProcessingFilter (id=271)
[6] AnonymousProcessingFilter (id=273)
[7] ExceptionTranslationFilter (id=275)
[8] SessionManagementFilter (id=277)
[9] FilterSecurityInterceptor (id=283)
Posted by is윤군
봄싹2009.09.18 12:48
봄싹에서 스프링 3.0 레퍼런스 번역에 도전한다..

http://springsprout.org/wiki/464.do

아직 개떡 같은 실력이지만.. 하다보면...
점차 낳아질꺼라는 생각에 일단 질러봄..

이미 시작하지 말자 ... 기선이형에게 한소리 듣는다...

" 너의 번역은 안습이야 !! "

ㄷㄷㄷ ;;

"제어의 역행이 머니 ㅡㅡ"

쪽팔린다... 하지만... 이게 현실이다..
쪽팔리기 싫으면 잘 하던가!!

아무래도 쪽팔리기 시러 열심히 해볼것 같다..

하는데까지 해바야지... 쪽도 팔다 보면... 더 팔것도 없겠지 ~~


아자@
Posted by is윤군
봄싹2009.09.17 16:13
좀전부터 모든 개발자들의 동의를 받고
개발 된 코드에 대해서 리뷰를 시작 했습니다.
리뷰라기 보다는 ... 개선 사항이나 지적사항 등등등~~

코드를 부시는거죠 ... 부시고 부시고 부셔서 ~~
이뿐 모습의 코드로 다듬는 과정을 거치는거죠 .
이 과정정에 자신의 코드가 부셔지는거 보고 맘아파하는 개발자도 아마 있을듯합니다..
속으론 말이죠 ..

하지만.. 수원이 형의 명언! "코드는 내것이 아니다" 라는 명언처럼.. 코드의 주인은 이제 봄싹꺼니까..
봄싹을 위해서 다듬는 일은 중요 하다고 생각하네요 ~~
또 여러 개발자 생각을 공유 함으로써 .. 발전해나가는거죠 ..

천재 개발자가 아닌이상은 ... 한번만에 짠코드가 고양이가 집어삼키지 않을정도로 이뿐 코드는 나오지 않을 것 같고 ..
개선 ~ 개선을 하면서 품질 좋은 코드가 된다고 봄!

무튼!!
한동안 구글 봄싹 그룹스가 뜨거워 질것 같군요 !!
Posted by is윤군
Etc2009.09.16 21:45
우선 이곳에서 필요한 플러그인을 찾아본다.

그리고 ..
다운을 받고 ..

{$REDMINE_ROOT}/vendor/plugins/  이곳에 폴더를 카피 해준다.


helols@dev:/var/redmine/vendor/plugins$ ls -al
total 88
drwxr-xr-x 22 www-data www-data 4096 2009-09-16 21:32 .
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 ..
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 actionwebservice
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 acts_as_activity_provider
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 acts_as_attachable
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 acts_as_customizable
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 acts_as_event
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 acts_as_list
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 acts_as_searchable
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 acts_as_tree
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 acts_as_versioned
drwxr-xr-x  3 www-data www-data 4096 2009-09-06 14:24 acts_as_watchable
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 classic_pagination
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 coderay-0.7.6.227
drwxr-xr-x  5 www-data www-data 4096 2009-09-06 14:24 engines
drwxr-xr-x  7 www-data www-data 4096 2009-09-06 14:24 gloc-1.1.0
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 gravatar
drwxr-xr-x  9 www-data www-data 4096 2009-09-06 14:22 redmine_hudson
drwxr-xr-x  8 www-data www-data 4096 2009-09-11 18:19 redmine_mylyn_connector
drwxr-xr-x  9 www-data www-data 4096 2009-09-16 21:28 redmine_wiki_extensions
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 rfpdf
drwxr-xr-x  4 www-data www-data 4096 2009-09-06 14:24 ruby-net-ldap-0.0.4

이렇게 .. 되도록..

카피 해주시고 ..

helols@dev:/var/redmine$ rake db:migrate_plugins RAILS_ENV=production

이런식으로 디비관련 설정을 하도록 명령 날려주시고 ~~

redmine 재부팅 해주면 끝!!!

참 쉽죠잉~~
Posted by is윤군
제2 외국어 영역2009.09.16 17:30
음.. 현재 봄싹에선 하이버네이트를 사용중에 있다..
물론 AJAX도 사용한다..

음 문제는 이러했다..
하이버네이트에서 사용되는 도메인 객체를 JSONObject로 변환해서 JSON형태의 스트링으로 뽑아 네다가
무한 하이라키 구조에 빠져 버린다던가..
아님 DATE 타입의 객체를 변환하다가 에러가 난다.

더보기


머 이리하여 .. 여차 여차.. 몇일동안 이러한 문제들을 해결하려고 코딩중이었는데..
이미 이러한 문제들을 해결해주는 lib 가 있었으니..
jackson 이라는 놈이다.

이놈을 알게된건.. 스프링 3.0 에 추가된 . MappingJacksonJsonView 이놈인데 . 기선이형이 이걸 한번 써보자고 해서 봤더니.
다른 lib를 쓰는걸 발견하고 TEST 를 해보니 .. 잘 나왔다..
그래서 바로 코딩중이던거 삭제하고 갈아타버렸다.. 흠..

아직 저놈을 제대로 안까봐서 모르겟지만 .. 분명 기본 JSON lib 처럼 하지는 않으니 좋았고..
한편으론.. 또 만들어진걸 써버리는구나.. 이런 기분..

맨날 만들어진것만 쓴다면 항상 그자리 일테니.. 물론 검증된걸 쓰는것도 좋치만.. 개발자라면 .. 한번쯤은 문제가 발생했을때.
자신이 멋찌게 코딩한 걸로 해결하는것 또한 필요할 것 같다는 생각도 들었음!!

무튼 결론은 하이버네이트와 관련된 도메인객체를 JSON으로 변환 하고 싶다면 jackson 을 쓰면 삽질을 덜 할듯싶다!!

코드는 봄싹 코드에서 구경하셔도 되요 ~ 별건 없지만.. ㄷㄷ
Posted by is윤군
Etc2009.08.24 11:14
일차 오픈 예정일은 8월 29일 입니다.
한달여동안 스터디 원들이 .. (시작은 5월에 시작했으니.. 본격적으로 개발은 8월.. )
열심히 바쁜 시간 쪼개가면서.. 만든 봄싹 사이트..

스터디 관리. 세미나 관리 . 위키 . 큰 메뉴가 존재 하고 .
스프링 3.0.0.M4, 스프링 시큐리티 . 3.0.0.M2 , 하이버네이트 3.2.6.ga ..
그리고 UI는 Jquery로 .. ㅋ

url은.. http://springsprout.org 이고 .. 닷com 으로 들어가면 .  메밀 국수 사이트로 갑니다.
조심..ㅋ

머 무튼 아직 구멍이 많이 보이지만.
꾸준한 업데이트로 .
멋진 사이트로 거듭 나길.. 바람. ㅎ
시급한건 .. Main page ..ㅋ


Posted by is윤군