2010. 9. 16. 15:21

JOSSO를 통한 SSO 구현하기

먼저 아래테이블을 보고 설치할 플랫폼을 알아보자.
Gateway는 Server 라고 생각하면 되고 Agent는 Client 라 생각하면 된다.
PlatformAgent (SP)Gateway (IdP)
JBoss 5.x
JBoss 4.2.x
JBoss 4.0.x
JBoss 3.2.6+
Tomcat 6.0
Tomcat 5.5
Tomcat 5.0
Weblogic 10.0
Weblogic 9.2
Websphere CE
Geronimo 2.1
Generic J2EE / JEE
Jetty 6.x
Apache 2.2 (php, perl, python, ...)  
PHP 4.x,5.x  
Microsoft IIS (ASP, .NET, ...)  
Liferay 5.2.x  
Alfresco 3.3  
phpBB  

먼저 나는 SSO Gateway 로는 Centos 5.5 리눅스에 Tomcat 5.5 를 YUM(rpm)으로 설치를 한 상태이다.
그래서 Tomcat 5.5 Gateway를 설치했다. Agent 는 PHP 를 사용할 것이다.
아 그리고 톰캣이 설치되있으니 jdk 역시 설치되어있다. jdk 역시 YUM(rpm)으로 설치가 되 있다.

아래에 나오는 모든 경로는 YUM으로 설치시 설정되는 경로이다. 소스로 설치를 하였다면 해당 경로로 변경해야 한다.

Tomcat 5.5를 다운받아서 서버에서 압축을 해제하고 디렉토레를 보면 /bin 디렉토리가 있는데
그곳에 리눅스용 실행파일이 있다. 필자의 경우에는 josso-gsh 라는 이름으로 쉘 파일이 존재하고 .bat 파일도 있는데 이것은 윈도우용이라 생각된다. 그리고 실행전 반드시 $JAVA_HOME 이 설정되어 있어야 한다. 

josso-gsh 를 실행하면 다시 josso> 라는 코맨드라인이 생기고 아래 명령을 실행해 Gateway를 설치하면 된다.

gateway install --target /usr/share/tomcat5 --platform tc55

여기서 --target에는 tomcat 설치 디렉토리를 --platform 에는 톰캣 버젼을 넣으면 된다.
YUM으로 설치시에 기본 디렉토리는 위와같이 /usr/share/tomcat5 이고 내용을 보면 대부분 다른 경로로 링크가 걸린 디렉토리 이다.(깔아보면 무슨말인지 알것임)
그리고 톰캣6.0을 사용한다면 --platform 에 값을 tc60으로 하면 된다.

그리고 Gateway는 기본적으로 MySql을 사용하므로 설치되어 있지 않다면 YUM으로 설치를 하자.
yum install mysql mysql-server mysql-devel

이제 josso에서 사용할 데이타베이스가 필요한데 데이타베이스를 생성하고 아래와 같이 테이블을 생성하자.
당연히 사용자도 추가해야함.
DROP TABLE IF EXISTS `josso_role`;
CREATE TABLE `josso_role` (
  `name` VARCHAR(16) NOT NULL,
  `description` VARCHAR(64) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=INNODB DEFAULT CHARSET=euckr;

DROP TABLE IF EXISTS `josso_user`;
CREATE TABLE `josso_user` (
  `login` VARCHAR(16) NOT NULL,
  `passwd` VARCHAR(20) NOT NULL,
  `name` VARCHAR(64) DEFAULT NULL,
  `description` VARCHAR(64) DEFAULT NULL,
  PRIMARY KEY (`login`)
) ENGINE=INNODB DEFAULT CHARSET=euckr;

DROP TABLE IF EXISTS `josso_user_property`;
CREATE TABLE `josso_user_property` (
  `login` VARCHAR(16) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `value` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`login`,`name`), 
  CONSTRAINT `josso_user_property_ibfk_1` 
    FOREIGN KEY (`login`) REFERENCES `josso_user` (`login`)
) ENGINE=INNODB DEFAULT CHARSET=euckr; 

DROP TABLE IF EXISTS `josso_user_role`;
CREATE TABLE `josso_user_role` (
  `login` VARCHAR(16) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`login`,`name`),
  KEY `name` (`name`),
  CONSTRAINT `josso_user_role_ibfk_2` 
    FOREIGN KEY (`login`) REFERENCES `josso_user` (`login`),
  CONSTRAINT `josso_user_role_ibfk_1` 
    FOREIGN KEY (`name`) REFERENCES `josso_role` (`name`)
) ENGINE=INNODB DEFAULT CHARSET=euckr;

그다음은 josso에서 사용할 JDBC 드라이버를 설치해보자.
MySQL JDBC Driver 다운로드 사이트 에가서 JDBC Driver for MySql 파일을 받고 서버에서 압축 풀어서
mysql-connect-java-???.jar 파일을 /usr/share/tomcat5/webapps/josso/WEB-INF/lib 경로에 복사를 하자.

그 다음은 사용자의 로그인 정보를 어느 방식으로 저장하고 사용할지를 설정해야 한다. 보통 MySql을 사용하지만 메모리를 사용할수도 있다.
/usr/share/tomcat5/common/classes/josso-gateway-config.xml 파일을 열어 아래 라인을 다음과 같이 고치도록 하자.
<!-- Identity, Session and Assertion Stores configuration -->
<s:import resource="josso-gateway-stores.xml" />
이부분을
<s:import resource="josso-gateway-db-stores.xml" />
이렇게 수정을 하면 기본적으로 메모리에 저장되도록 되있는 부분을 DB로 변경하게 된다.

그럼 위에 설정한 josso-gateway-db-stores.xml 파일에 MySql 계정 설정을 아래와 같이 하자.
<db-istore:jdbc-store
    id="josso-identity-store"
    driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost:3306/데이타베이스명"
    connectionName="아이디"
    connectionPassword="비번"
    userQueryString="SELECT LOGIN AS NAME FROM JOSSO_USER WHERE LOGIN = ?"
    rolesQueryString="SELECT NAME AS ROLE FROM JOSSO_USER_ROLE WHERE LOGIN = ?"
    credentialsQueryString="SELECT LOGIN AS USERNAME, PASSWD password FROM JOSSO_USER WHERE LOGIN = ?"
    userPropertiesQueryString="SELECT NAME, VALUE FROM JOSSO_USER_PROPERTY WHERE LOGIN = ?"
    resetCredentialDml="UPDATE JOSSO_USER SET PASSWD = ? WHERE LOGIN = ?"
    relayCredentialQueryString="SELECT LOGIN FROM JOSSO_USER WHERE #?# = ?"
    />

자 Gateway 마지막으로 josso-gateway-auth.xml 파일에서 기본인증정보를 수정한다.
hashAlgorithm, hashEncoding를 삭제하여 암호를 일반텍스트로 저장하도록 하자.
<basic-authscheme:basic-auth-scheme
           id="josso-basic-authentication"
           ignorePasswordCase="false"
           ignoreUserCase="false">

       <basic-authscheme:credentialStore>
           <s:ref bean="josso-identity-store"/>
       </basic-authscheme:credentialStore>

       <basic-authscheme:credentialStoreKeyAdapter>
           <s:ref bean="josso-simple-key-adapter"/>
       </basic-authscheme:credentialStoreKeyAdapter>

   </basic-authscheme:basic-auth-scheme>

오늘은 여기까지. 작업이 끝나면 이미지도 올리고 다시 정리를 할것임.