異常處理 panic 異常處理 如果出現了panic異常,那麼會停止當前函數的運行,然後會找recover()方法,如果沒有的話,就會報錯退出程式,如果有就會執行recover的方法體中的方法 我們可以使用defer延遲處理函數來捕獲panic異常,用recover()來從錯誤場景中恢復,必 ...
CAS登錄成功後會跳轉到service參數提供的url,目前系統中這個參數是沒有任何驗證的,service參數隨便賦一個網址就可以。為安全起見現在對這個service要作一下限制,比如只能是同源url才可以重定向。
下麵是基於CAS 3.5.2對系統的改造過程。
系統比較老舊,之前也作過CAS方面的改造,基本思路是從login-webflow.xml中找到切入點,查看源代碼,然後在配置文件中把相關的bean替換掉。具體分析過程這裡不再贅述。
在argumentExtractorsConfiguration.xml中有
<util:list id="argumentExtractors"> <ref bean="casArgumentExtractor" /> <ref bean="samlArgumentExtractor" /> </util:list>
把casArgumentExtractor替換成customArgumentExtractor。上面那個配置文件里再加上
<bean id="customArgumentExtractor" class="org.jasig.cas.web.support.CustomArgumentExtractor" p:httpClient-ref="noRedirectHttpClient" p:disableSingleSignOut="${slo.callbacks.disabled:false}" />
這個customArgumentExtractor就是要自己新寫的。代碼很簡單,裡面只有一個方法
public final class CustomArgumentExtractor extends AbstractSingleSignOutEnabledArgumentExtractor{ public WebApplicationService extractServiceInternal(HttpServletRequest request) { return CustomWebApplicationServiceImpl.createServiceFrom(request,getHttpClientIfSingleSignOutEnabled()); } }
CustomWebApplicationServiceImpl也是要自己寫的,基於cas-server-core-3.5.2.jar里的SimpleWebApplicationServiceImpl上修改。
在裡面的createServiceFrom方法加上驗證即可
public static CustomWebApplicationServiceImpl createServiceFrom( final HttpServletRequest request, final HttpClient httpClient) { final String targetService = request .getParameter(CONST_PARAM_TARGET_SERVICE); final String method = request.getParameter(CONST_PARAM_METHOD); final String serviceToUse = StringUtils.hasText(targetService) ? targetService : request.getParameter(CONST_PARAM_SERVICE); if (!StringUtils.hasText(serviceToUse)) { return null; } //新加的service同host驗證--------------- try { URI url = new URI(serviceToUse); if (!host.equals(url.getHost())){ return null; } } catch (URISyntaxException e) { return null; } //---------------驗證結束 final String id = cleanupUrl(serviceToUse); final String artifactId = request.getParameter(CONST_PARAM_TICKET); return new CustomWebApplicationServiceImpl(id, serviceToUse, artifactId, "POST".equals(method) ? Response.ResponseType.POST : Response.ResponseType.REDIRECT, httpClient); }
上面的host是配置文件里讀的當前系統的功能變數名稱。這裡可以加自己的其他驗證邏輯,比如二級子目錄、通配符功能變數名稱或者白名單列表。
最後還要修改一個地方,在uniqueIdGenerators.xml里
<util:map id="uniqueIdGeneratorsMap"> <entry key="org.jasig.cas.authentication.principal.SimpleWebApplicationServiceImpl" value-ref="serviceTicketUniqueIdGenerator" /> <entry key="org.jasig.cas.support.openid.authentication.principal.OpenIdService" value-ref="serviceTicketUniqueIdGenerator" />
......
把SimpleWebApplicationServiceImpl換成CustomWebApplicationServiceImpl。
這樣修改之後,當service參數的url跟你配置的功能變數名稱不一致時,等同於service為null,即未配置。在我的系統里會跳轉到一個只是簡單提示登錄成功的jsp頁面。