應公司需求作單點登陸,以前都沒有聽過這是啥東東,不過還好有度娘。網上有許多關於單點登陸的文章,看了不少,感受如下幾篇文章相對較好。css
1.單點登陸原理與簡單實現:https://www.cnblogs.com/ywlaker/p/6113927.htmlhtml
2.SSO之CAS單點登陸詳細搭建教程:https://www.cnblogs.com/zhoubang521/p/5200407.htmlweb
3.單點登陸實踐:https://blog.csdn.net/jadyer/article/category/5645879spring
按照2中的步驟就能夠搭建sso的一個demo。express
下面我主要說一下單點登陸的自定義登陸(server端)eclipse
1.首先將cas-server的war包導入myeclipse或者eclipse中,使其能正常的訪問。jsp
2.接下來就是修改原始的登陸頁面。修改登陸就須要知道登陸的流程是怎樣的。post
cas的頁面顯示控制是集中在\WEB-INF\cas.properties中的cas.viewResolver.basename屬性的,它的值默認是default_views,接下來cas會去classpath中尋找default_views.properties,在default_views.properties中指定了登陸登出頁面等.
lua
其中casLoginView.url表示默認登陸頁,casLoginGenericSuccessView.url表示默認登陸成功頁。url
在原來的casLoginView.jsp頁面中,能夠看出其body是用spring-webflow實現的,所以自定義登陸頁面必須也這樣寫。
其中<form:input>標籤是指經過form來生成input,所以要給input加上樣式就必須使用
接下來就是將表單提交。cas中的提交方法是在authenticationViaFormAction類。而authenticationViaFormAction類的定義是在cas-servlet.xml
其登陸對應的web-flow是login-webflow.xml。而且casLoginView.jsp就是在這裏配置的。
<view-state id="viewLoginForm" view="casLoginView" model="credential"> <binder> <binding property="username" /> <binding property="password" /> </binder> <on-entry> <set name="viewScope.commandName" value="'credential'" /> </on-entry> <transition on="submit" bind="true" validate="true" to="realSubmit"> <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credential)" /> </transition> </view-state>
其中view表示的就是視圖(頁面),model指的是對應bean,其屬性有username和password。提交的方法是下面這個
<action-state id="realSubmit"> <evaluate expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credential, messageContext)" /> <transition on="warn" to="warn" /> <transition on="success" to="sendTicketGrantingTicket" /> <transition on="successWithWarnings" to="showMessages" /> <transition on="authenticationFailure" to="handleAuthenticationFailure" /> <transition on="error" to="generateLoginTicket" /> </action-state>
其中transition指的是提交後的各類結果。其中authenticationFailure是登陸校驗後會出現的幾種錯誤狀況。
<action-state id="handleAuthenticationFailure"> <evaluate expression="authenticationExceptionHandler.handle(currentEvent.attributes.error, messageContext)" /> <transition on="AccountLockedException" to="generateLoginTicket" /> <transition on="AccountDisabledException" to="generateLoginTicket" /> <transition on="InvalidLoginLocationException" to="generateLoginTicket" /> <transition on="AccountNotFoundException" to="generateLoginTicket" /> <transition on="FailedLoginException" to="generateLoginTicket" /> <transition on="CredentialExpiredException" to="casExpiredPassView" /> <transition on="InvalidLoginTimeException" to="casBadHoursView" /> <transition on="UNKNOWN" to="generateLoginTicket" /> </action-state>
其中on表示的是cas已經定義好的異常處理類。to表示的所要跳轉的頁面。可是generateLoginTicket是指在當前頁顯示錯誤信息。而這些錯誤信息是在messages.properties中定義的。
若是想要自定義異常則須要重寫異常類authenticationExceptionHandler類。authenticationExceptionHandler類在cas_servlet.xml中定義的。
能夠按照https://blog.csdn.net/c233728461/article/details/56831306這篇文章介紹的實現。(可是我嘗試了一下沒有成功)
我的以爲cas中已經自定義了一些異常,徹底能夠利用這些異常便可,不必再自定義。詳見https://blog.csdn.net/cl_andywin/article/details/53380117。
對於cas仍是不太瞭解,只能將其中一些心得和問題總結一下。