Authentication 관련 문의
Submitted by ek44.kang on 화, 03/31/2009 - 09:28
안녕하세요.
Anyframe에서 제공되고 있는 Authentication를 이용하여 사용자 인증 처리 이후
사용자 정보를 application단에서 이용하고자 합니다.
subject객체를 request(또는 session)없이 가져올 수 있는 방법이 있을까요?
[참고]http://dev.anyframejava.org/anyframe/doc/web/3.0.1/webfw/struts/extensions/authentication_authorization.html


문의하신 방법의 경우 session 을 사용합니다.
안녕하세요? ek44.kang 님.
[참고] 의 링크는 Anyframe Web 영역 중 Struts 1.X 확장의 예입니다. 예로 드신 struts 기반의 인증/권한 처리 관련 확장 영역은 사용자 인증 정보를 subject 객체로 작성하여 session 에 보관토록 하고 있습니다. struts 기반의 .do 액션에 대한 RequestProcessor 의 processRoles() 에서 session 에 저장된 subject 객체를 검사하여 해당 액션에 대한 접근 여부를 struts-config.xml 의 해당 action 정의에 대한 roles 속성에 따라 처리하게 됩니다.
session 에의 접근은 presentation layer 에 해당하는 jsp 나 Action 클래스에서만 가능하므로 만약 business layer 영역에서 관련 인증 정보를 사용하고자 하는 경우 파라메터로 전달하는 형식으로 많이 사용하게 됩니다.
ThreadLocal 을 사용하면 동일한 thread (다른 layer 라 하더라도) 에 정보를 유지할 수 있으므로 subject 객체를 매번 ThreadLocal 에 저장해주는 공통처리에 대해서는 고민해 볼 여지가 있을것 같습니다.
참고로, 위의 Struts 인증/권한처리를 대체하여 Spring Security 를 사용하는 경우에는 request/session 과 같이 웹단에 종속적인 영역에 인증 정보를 저장하는 것이 아니라 ThreadLocal(현재 thread에 필요한 상태정보를 저장 가능) 에 SecurityContext 를 저장하기 때문에 presentation-business-data access 어플리케이션 전 영역에서 동일한 api 를 사용하여(SecurityContextHolder) 접근이 가능합니다. 또한 매 request 마다 thread 가 달라지는데 Spring Security 의 SessionIntegrationFilter 를 통해 session 영역에 SecurityContext 를 동기화 하여 유지해 주기 때문에 사용자는 어려움없이 쉽게 사용자 인증/권한 정보를 사용할 수 있게 됩니다.
struts 기반의 웹단을 구성한 경우에도 Spring Security 의 적용은 가능합니다. 어플리케이션 전체 영역에서 사용자 인증 정보의 접근이 반드시 필요한 경우에는 Spring Security를 적용하여 권한/인증 처리를 하는 것이 유리합니다. Spring Security 에서는 struts 인증 처리의 한계인 .do 에 해당하는 action path(struts 의 ActionServlet 으로 request 를 받는 경우만 해당)에 대한 권한 처리만에 비해 filter 기반으로 모든 url 호출(.do + html, image 등 모든 web resource)에 대한 권한 처리 및 aop 기반의 비즈니스 메서드 및 객체단위의 권한 처리 등 강력한 보안 기능을 제공합니다.
Spring Security 적용 시 사용자 정보의 참조와 관련 하여 http://www.anyframejava.org/node/756#comment-324 도 참고하세요.
Spring Security의 config 설정 내용
안녕하세요
위의 자세한 답변 감사드립니다.
답변 내용을 토대로 Anyframe - spring 기반으로 Spring Security를 이용하고자 합니다만
Anyframe내의 Spring Security를 사용하기 위한 config 설정 시 오류가 발생하여 추가 질문을 드립니다.
일단 발생 오류는 Configuration problem: Duplicate element detected 으로
프로젝트 내에 를 사용하는 것은 Spring Security의 config에서 밖에 없습니다.
이에, 혹시 anyframe내에서 Spring Security관련 config 따로 설정된 것이 있는지
아니라면, Spring Security관련 config설정에 대해서 가이드를 얻을 수 있을까요?
다음은 저희가 사용한 config 일부 내용입니다.
(게시판의 태그 적용으로 인하여 < > 사용에 있어 띄어쓰기를 해두었습니다.)
--------------------------------------------------------------------
< http >
< intercept-url pattern="/**" access="ROLE_USER"/ >
< form-login login-page="/TempLogin.jsp"
login-processing-url="/j_spring_security_check"
authentication-failure-url="/LogOut.plm?errorType=TempLogin_Error"
default-target-url="/" / >
< logout logout-success-url="/LogOut.plm"/ >
< anonymous / >
< http-basic / >
< remember-me / >
< /http >
< b:bean id="userDetailsServiceWrapper"
class="org.springframework.security.userdetails.hierarchicalroles.UserDetailsServiceWrapper" >
< /b:bean >
< authentication-provider user-service-ref="userDetailsServiceWrapper"/ >
< jdbc-user-service id="jdbcUserService" data-source-ref="dataSource"
users-by-username-query="select USR_ID username, '' password, 1
from VW_USERINFO
where USR_ID=?"/ >
예로 보여주신 설정에서 remember-me 관련 오류 가능성이 있을듯 합니다.
제 로컬의 테스트 환경에서는 http 태그 내에 http-basic 태그 와 remember-me 태그를 사용하지 않고 있는데,
remember-me 태그를 사용하게 되면 userDetailsService 가 여러개 등록되어 있다고 ID 를 지정하라는 에러가 났습니다.
일반적인 웹 어플리케이션의 경우 basic 인증과 remember-me 를 사용하는 경우는 많지 않은 것 같습니다만.. 꼭 필요하시다면
저의 경우 <remember-me user-service-ref="userDetailsServiceWrapper"/> 와 같이 user-service-ref 옵션을 추가로 지정하였더니 이 부분이 해결되었습니다. 참고하세요.
해당 태그를 제거하여도 동일한 에러 발생합니다.
안녕하세요.
위에서 말씀하신 것과 관련하여
http-basic태그와 remember-me태그를 모두 삭제하여도 동일한 로그가 발생합니다.
혹시 버전문제인지...
참고로 저희쪽에서 사용하는 anyframe 버전은 3.1이며
web-inf/lib에서 확인한 결과 spring security는 2.0.3 버전을 사용하고 있습니다.
byunghun.woo님 테스트 환경의 버전이 어떻게 되시나요?
특별히 버전 문제가 아니라면 config문제 일듯하여 문의드립니다.
감사합니다.
테스트환경은 동일합니다.
제 로컬의 테스트 프로젝트도 anyframe 3.1.0 기반으로 되어 있습니다. (spring security는 2.0.3 jar 포함)
log4j.xml 에 다음의 Spring 관련 로그를 전부 debug 레벨로 설정 추가하시고
<logger name="org.springframework">
<level value="DEBUG"/">
<appender-ref ref="console"/">
</logger">
WAS 기동시 console 로그를 확인해주세요.
보안상 특별한 이슈가 없다면 위와 같이 처리한 로그 내역과 Spring Security 관련 설정 파일, web.xml 파일을 woos41@samsung.com 으로 보내주시면 한번 보도록 하겠습니다.