ラベル CAS の投稿を表示しています。 すべての投稿を表示
ラベル CAS の投稿を表示しています。 すべての投稿を表示

2012年6月25日月曜日

Grails + CAS、CASクライアント編

Acegiプラグインを使ってCASでSSOします。

まず、Grails + CAS、CASサーバ編で作成したユーザ管理アプリをCASクライアントにしてみる。

ユーザ管理アプリのgrails-app/conf/SecurityConfig.groovyに以下の内容を追加する。

// CAS
useCAS = true // false
cas.casServer = 'localhost'
cas.casServerPort = '8080' // '443'
cas.casServerSecure = false // true
cas.localhostSecure = false // true
cas.failureURL = '/index.gsp' // '/denied.jsp'
cas.defaultTargetURL = '/'
cas.fullLoginURL = 'http://localhost:8080/cas/login' // 'https://localhost:443/cas/login'
cas.fullServiceURL = 'http://localhost:8080/cas' // 'https://localhost:443/cas'
cas.authenticationProviderKey = 'cas_key_changeme'
cas.userDetailsService = 'userDetailsService'
cas.sendRenew = false
cas.proxyReceptorUrl = '/' // '/secure/receptor'
cas.filterProcessesUrl = '/j_spring_cas_security_check'

コメントアウトはDefaultSecurityConfig.groovyの設定。
cas.failureURLはdenied.jspを用意するのが面倒なので。
cas.proxyReceptorUrlはCASサーバがリクエストしてくるので'/'に変更。'/secure/receptor'のままだとCASサーバ側でエラーが発生してしまい、Single Sign OutができなくなったSpring SourceのCASサンプルが'/secure/receptor'に設定してるから?

あとはweb.xmlにSingleSignOutフィルタを書く。

grails install-templates

<filter>
   <filter-name>CAS Single Sign Out Filter</filter-name>
   <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>

<filter-mapping>
   <filter-name>CAS Single Sign Out Filter</filter-name>
   <url-pattern>/j_spring_cas_security_check</url-pattern>
</filter-mapping>

<listener>
   <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

これでOK。
認証が必要なページに遷移するとCASのログイン画面が表示される。ログインすると、Spring Security的にもログインする。ログアウトはCASのログアウトリクエストを送る必要がある。そうしないと、Cookieに情報が残ったままになるので

CASの仕組みについてはcas-server-coreの処理を読めばだいたい分かるのでそちらを見てください。ちなみによく見たクラスは以下。
  • CentralAuthenticationServiceImpl
  • TicketGrantingTicketImpl
  • ServiceTicketImpl


そろそろサンプルをどこかにおきたい。次回はCASサーバが接続するデータベースとCASクライアントのアプリが接続するデータベースが異なる場合についてまとめる。

2009年11月14日土曜日

Grails + CAS、CASサーバ編 2

CASクライアントについてまとめる予定だったけど、予定を変更してCASサーバの非SSL化を先にまとめる。証明書の発行が面倒だとかいう理由らしい。

前回の設定に加えて、2つファイルを編集する。
まず、casサーバのURLを変更する。cas-server-3.3.4/cas-server-webapp/src/main/webapp/WEB-INF/cas.propertiesのsecurityContextまわりをhttps://localhost:8443からhttp://localhost:8080に変更する。

cas.securityContext.serviceProperties.service=http://localhost:8080/cas/services/j_acegi_cas_security_check
cas.securityContext.casProcessingFilterEntryPoint.loginUrl=http://localhost:8080/cas/login
cas.securityContext.ticketValidator.casServerUrlPrefix=http://localhost:8080/cas

次に、CASが落とすCookieをSSL通信でなくても送信するように変更する。
cas-server-3.3.4/cas-server-webapp/src/main/webapp/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xmlのp:cookieSecure="true"p:cookieSecure="false"に変更する。

<bean id="ticketGrantingTicketCookieGenerator"
class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />

2009年11月7日土曜日

Grails + CAS、CASサーバ編

CASでSSOやることになったのでメモ。
ユーザ情報は既存のユーザ管理アプリのDBを使用する。

おっきく分けて3つ。
  1. Grails Spring Security Pluginでユーザ管理アプリを作る
  2. CASサーバの構築
  3. Grails Spring Security PluginでCASクライアント

3つめは次回。

ということで、まずは「Grails Spring Security Pluginでユーザ管理アプリを作る」は本題ではないのでちゃちゃっと作る。

grails create-app ums
cd ums
grails install-plugin acegi
grails create-auth-domains
grails generate-manager

データベースはpostgresql 8.3。
データベースユーザは"sa"でパスワードなし。
データベースはlocalohst:5432:umsdb
ユーザはPersonのまま(テーブル:person、カラムはusername、passwd、enabledなど)

次に、今回のメイン「CASサーバの構築」。やることは
  1. ダウンロード、展開
  2. ファイルを2つ編集
  3. ビルドして配備
まずはCAS ServerをJASIG Communityから落としてくる。
http://www.jasig.org/cas/download

今回使うのはCAS Server 3.3.4 Final。
cas-server-3.3.4-release.zipを落として展開する。

で、cas-server-3.3.4/cas-server-webapp/pom.xmlを編集、61行目のldapをjdbcにして、ついでにJDBCドライバとデータソース用のライブラリも追加しておく。

<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>8.3-603.jdbc3</version>
</dependency>
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.2</version>
</dependency>

cas-server-3.3.4/cas-server-webapp/src/main/webapp/WEB-INF/deployerConfigContext.xmlを編集、データソースとユーザテーブルの情報を設定する。
データソースのbeanを定義して
92行目のSimpleTestUsernamePasswordAuthenticationHandlerをSearchModeSearchDatabaseAuthenticationHandlerに差し替える。ユーザテーブル、ユーザIDカラム、パスワードカラム、パスワードのエンコード、データソースを設定してあげる。

<bean class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">
    <property name="tableUsers"><value>person</value></property>
    <property name="fieldUser"><value>username</value></property>
    <property name="fieldPassword"><value>passwd</value></property>
    <property name="dataSource" ref="dataSource"/>
    <property name="passwordEncoder">
        <bean class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"> 
            <constructor-arg value="SHA1" />
        </bean>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName">
        <value>org.postgresql.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:postgresql:umsdb</value>
    </property>
    <property name="username"><value>sa</value></property>
    <property name="password"><value></value></property>
</bean>

maven2でビルドする。

cd cas-server-3.3.4/cas-server-webapp/
mvn package


最後にTomcatに配備してhttp://localhost:8080/cas/login/にアクセスして確認しておk。

これでCASサーバの準備ができたので、次回はCASクライアント編。
JDBCTicketRegistryについても調査済みなので次々回あたりでまとめる。

参考にしたページ:
JDBC - CAS User Manual - JA-SIG Wiki