CAS 4.0サービス側の構成とカスタム拡張


cas単点登録はマルチシステム統合に広く用いられ,統一的な登録登録登録管理が行われ,ネット上の資料も比較的多く,ここではあまり説明しない.このブログを書く目的は主に後日の使用を便利にするために記録することです.
1.準備手順
cas 4.0ソースパッケージのダウンロード   公式サイトhttp://jasig.github.io/cas/4.0.0/index.html
       IDEのインポート
2.機能拡張 
1.まずもちろん認証方式を拡張し、casがデフォルトで与えた簡単なユーザー名がパスワードに等しい認証という実際のアプリケーションではもちろん使用できません.一般的にjdbcの認証方式を使います
deployerConfigContext.xmlでidが primaryAuthenticationHandlerのbean 次のように変更
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
                    <property name="dataSource" ref="dataSource" ></property>  
                    <property name="sql" value="select password from t_user where login_name=?" ></property>  
                    <property name="passwordEncoder" ref="MD5PasswordEncoder" ></property>  
</bean>
         もちろん、ここでは拡張認証をカスタマイズできます.継承するだけです. AbstractJdbcUsernamePasswordAuthenticationHandler  ここに直接コードを貼ります
           
         2.より多くのユーザー情報を返す
同様にdeployerConfigContext.xmlファイルで attributeRepository bean 
                      
<bean id= "attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" > 
        <constructor-arg index= "0" ref ="dataSource"/>  
         <constructor-arg index= "1" value ="SELECT * FROM T_BASE_USER WHERE {0} AND USER_STATUS IN (1,2)" />
        <property name= "queryAttributeMapping" >   
            <map>
                <entry key= "username" value ="USER_LOGIN_NAME" />
            </map>    
        </property>
        <property name="resultAttributeMapping" > 
            <map>               
                 <entry key="USER_ACTUAL_NAME" value ="userName"/>  
                 <entry key="SCHOOL_CODE" value="schoolCode" />
                 <entry key="USER_ID" value="userId" />
                 <entry key="USER_TYPE" value="userType"/>
            </map>  
        </property>  
    </bean >  
        認証成功ページを設定します 返される情報の追加
<cas:authenticationSuccess>
		<cas:user>${fn:escapeXml(assertion.primaryAuthentication.principal.id)}</cas:user>
		<%--           --%>
		<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
			<cas:attributes>
				<c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
					<cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
				</c:forEach>
			</cas:attributes>
		</c:if>
        
        <c:if test="${not empty pgtIou}">
        		<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
        </c:if>
       
		
       
        <c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
		  <cas:proxies>
            <c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
			     <cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
            </c:forEach>
		  </cas:proxies>
        </c:if>
	</cas:authenticationSuccess>