JOSSO Agent설정하기
파트너 웹 어플리케이션이 운영되는 웹로직 웹컨테이너는 SSO Gateway에 도달하는 방법을 알아야 한다. 이것을 위해 josso-agent-config.xml 설정 파일은 컨테이너의 특정 디렉토리인 $DOMAIN_HOME에 위치 해야 한다.
아래 josso-agent.xml 환경파일을 먼저 살펴보자.
<agent>
<class>org.josso.wls92.agent.WLSSSOAgent</class>
<gatewayLoginUrl>http://localhost:7001/josso/signon/login.do</gatewayLoginUrl>
<gatewayLogoutUrl>http://localhost:7001/josso/signon/logout.do</gatewayLogoutUrl>
<service-locator>
<class>org.josso.gateway.WebserviceGatewayServiceLocator</class>
<endpoint>localhost:7001</endpoint>
</service-locator>
<partner-apps>
<partner-app>
<context>/partnerapp</context>
</partner-app>
<partner-app>
<context>/otherPartnerapp</context>
</partner-app>
</partner-apps>
</agent>
localhost:7001 은 SSO Gateway가 있는 호스트이름과 포트로 교체 해야 한다.
gatewayLoginUrl 과 gatewayLogoutUrl 의 정확한 호스트 이름과 포트를 사용하는것이 중요하다. 이것은 사용자가 로그인과 로그아웃을 시도할때 접속하는 URL로 설정 되어야 한다.
$DOMAIN_HOME/josso-config.xml 안에 josso-agent-config.xml 관한 설정 정보를 추가하여야 한다.
만약 Gateway와 Agent가 같은 서버에 위치한다면 josso-config.xml 파일은 아래와 같이 설정되어야 한다.
<configuration>
<xml fileName="josso-agent-config.xml"/>
</configuration>
보안 제약 설정하기
웹 어플리케이션 보안 제약
보안이 필요로 하는 웹 어플리케이션은 웹 리소스에 접속하기 위해 사용자에게 로그인을 요구한다. 사용자의 자격이 보안 영역에서 검증되고 한번 인증되면 사용자는 웹 어플리케이션 내에 있는 특정 리소스들의 접속 권한을 가질것이다.
웹 어플리케이션에서 보안은 세가지 엘리먼트를 사용하여 설정된다.
<login-config> 엘리먼트는 사용자가 어떻게 로그인 되는지 그리고 보안 영역의 위치를 명시한다. 만약 이 엘리먼트가 채워진다면 사용자는 <security-constraint> 에 의해 제약받는 모든 리소스에 접근하기 위해 인증되어야 한다.
<security-constraint>는 리소스 집합에 대한 접근 자격을 규정하는데 사용된다.
<security-role> 엘리먼트는 영역에서 그룹 혹은 상위자를 표현하기 위해 사용된다.이 엘리먼트는 <security-constraint> 엘리먼트 안에서 사용되며 <security-role-ref> 엘리먼트를 거쳐 서블릿코드에서 사용되는 alternative Role 이름에 연결될수 있다.
파트너 웹 어플리케이션의 완전한 web.xml은 아래와같다.
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>JOSSO Partner Application</display-name>
<welcome-file-list id="WelcomeFileList">
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<!-- Sample Security Constraint -->
<web-resource-collection>
<web-resource-name>protected-resources</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>HEAD</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>role1</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/wls-login-redirect.jsp</form-login-page>
<form-error-page>/wls-login-redirect.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role >
<description>The Role1</description>
<role-name>role1</role-name>
</security-role>
<security-role >
<description>The Role2</description>
<role-name>role2</role-name>
</security-role>
</web-app>
위 web.xml파일은 role1과 관련된 사용자만이 파트너 어플리케이션에 접속할 수 있다는 것을 보여준다.
인증받지 않은 사용자가 파트너 어플리케이션의 접속을 요구할 때 '/partnerapp/login-redirect.jsp' 페이지로 이동될것이다. 이 jsp 페이지는 사용자를 JOSSO 로긴 폼으로 이동할 것이다.
주의 해야 할것은 <role-name>에 명기된 이름은 josso-gateway-config.xml 파일에 명기된 SQL Select 문을 사용하여 SSO Gateway에 의해 조회될 'ROLE' 데이터베이스 테이블 입력값이어야 한다.
지금 우리는 어플리케이션 Role들을 규정된 원칙과 맵핑하기 위해 새로운 디스크립터를 추가해야한다. 아래 예는 원칙(principal 엘리먼트)들이 Role과 같은 이름을 가지고 있음을 알수있다.
<weblogic-web-app
xmlns="http://www.bea.com/ns/weblogic/90"
xmlns:j2ee="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/90
http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
<security-role-assignment>
<role-name>role1</role-name>
<principal-name>role1</principal-name>
</security-role-assignment>
<security-role-assignment>
<role-name>role2</role-name>
<principal-name>role2</principal-name>
</security-role-assignment>
</weblogic-web-app>
Redirect 페이지 생성
서블릿 컨테이너가 사용자가 보호되는 리소스에 접근함을 인지했을때 서블릿 컨테이너는 /partnerapp/wls-login-redirect.jsp 페이지로 재 전송 할 것 이다.
파트너 어플리케이션에 추가할 login-redirect.jsp 는 아래와 같다.
<!--
Redirects the user to the propper login page. Configured as the login url the web.xml for this application.
-->
<%
response.sendRedirect(request.getContextPath() + "/josso-wls/josso_login.jsp");
%>
웹 어플리케이션에 3개의 jsp페이지를 카피하거나 만들어야 한다.
위 페이지들은 아무짓도 안하며 결고 실행되지 않으며 404 NOT FOUND HTTP 코드를 리턴한다. JOSSO Agent는 특정 리소스에 대한 요구를 가로채서 적절하게 행동한다. 이 파일들은 wls-login-redirect.jsp 로 부터 리다이텍트될 때
웹로직이 리소스를 요구하기 때문에 단지 필요하다. 이 파일들은 JOSSO 배포 모듈에서 제공된다. 아래는 배포 모듈에 포함된 파일과 같은 소스들이다.
josso_login.jsp
파트너 어플리케이션은 사용자 로그아웃을 허용해야만 한다. 사용자로 하여금 다음 방식으로 리다이렉트 함으로써 이액션은 SSO Gateway로 전달 되어야만 한다.
session="true" %>
...
</html>
파트너 어플리케이션 빌드하기
파트너 어플리케이션은 여느때처럼 WEB-INF/web.xml 과 WEB-INF/weblogic.xml 을 포함하여 빌드한다.
파트너 어플리케이션 디폴로이
개발모드로 웹로직을 사용하는 경우에는 $DOMAIN_HOME/autodeploy/ 에 WAR 혹은 EAR 파일을 두어야 한다.
테스트 하기
웹 브라우져를 사용하여 다음 URI : *http://localhost:7001/partnerapp/* . 로 접속한다.
partnerapp대신에 웹 어플리케이션의 웹 컨텍스트 이름을 사용한다.
JOSSO Gateway 에 위치한 Geateway SSO logon 폼을 http://localhost:7001/josso/signon/login.do. 로 리다이렉트 되어야 한다.
인증
로그온 폼이 보여졌을때 사용자 테이블에 사전에 입력된 user/password 중 하난를 사용하여 로그온한다. role1 과 연관되어 있는 user1이라는 사용자로 로그온한다. 이 롤은 파트너 웹 어플리케이션을 접속하기 위해 권한을 부여하는것으로 web.xml파일에 설정된다.
인증 시 사용자는 파트너 어플리케이션으로 리다이렉트 될것이다.
파트너 어플리케이션 접속
파트너 어플리케이션에서 로그인된 사용자 정보를 얻기위해 표준 Servlet Security API를 사용하여 가능할것이다.
아래 예는 어떻게 이것이 행해지는지 보여주는 예이다.
<%@ page contentType="text/html; charset=iso-8859-1" language="java" %> <!doctype html public "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Sample Partner Application - JOSSO</title> </head> <body> <p>This is a very simple JOSSO partner application</p> <p>Your username is : <b><%=request.getRemoteUser()%></b> <font color="red">(Retrieved from request.getRemoteUser())</font></p> </body> </html>
위 소스의 실행결과는 아래와 같을것이다.
위 예는 JSP 파트너 웹 어플리케이션을 사용한 예이고 모든 자바 웹 어플리케이션(Servlet, Struts, etc.)Sample Partner Application - JOSSOThis is a very simple JOSSO partner application Your username is : user1 (Retrieved from request.getRemoteUser())
을 보호할 수 있으며 롤들은 표준 Java Security API를 사용하여 활용될수 있다.
Custom User Properties 사용하기
이전 샘플 환결 파일 에서 본것처럼 <userPropertiesQueryString> 엘리먼트를 이용하여 SSO Gateway가 커스텀 프로퍼티들을 principal 에 포함 가능하게 만든다. 그러한 principal 은 표준 서블릿 Security API 를 사용하여 파트너 웹 어플리케이션에서 사용될 수 있다. Servlet Security API는 파트너 어플리케이션에게 부가적인 사용자 프로퍼티들을 접속하게 해준다.
이러한 프로퍼티들은 org.josso.gateway.SSONameValuePair 클래스 인스턴스의 배열로 org.josso.gateway.identity.SSOUser 클래스 인스턴스에 저장된다.
그러한 프로퍼티들에 접속하기 위해 아래 방법처럼 HttpServletRequest 와 연관되는 사용자 Principal를
캐스트(형 변환) 해야할것이다.
... <% // Check if we have a principal ... if (request.getUserPrincipal() != null) { %> <p>Your username is : <b><%=request.getRemoteUser()%></b> <font color="red">(Retrieved from request.getRemoteUser())</font></p> <% // Cast the principal to a josso specific user, //and iterate over its properties. org.josso.gateway.identity.SSOUser ssoUser = (org.josso.gateway.identity.SSOUser) request.getUserPrincipal(); for (int i = 0 ; i < ssoUser.getProperties().length ; i++) { %> <p><%=ssoUser.getProperties()[i].getName()%> : <%=ssoUser.getProperties()[i].getValue()%> </p> <% } %> <% }
보다 자세한 내용은 JOSSO 배포판의 src/webapp/samples/partnerapp/josso 디렉토리에 위치한 샘플을
검토하면 된다. 혹은 here

