SSO單點登陸

應公司需求作單點登陸,以前都沒有聽過這是啥東東,不過還好有度娘。網上有許多關於單點登陸的文章,看了不少,感受如下幾篇文章相對較好。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加上樣式就必須使用

  1. cssClass用於指定表單元素CSS樣式名,至關於HTML元素的class屬性  
  2. cssStyle用於指定表單元素樣式,至關於HTML元素的style屬性
  3. cssErrorClass用於指定表單元素髮生錯誤時對應的樣式
  4. path屬性用於綁定表單對象的屬性值,它支持級聯屬性,好比path="user.userName"將調用表單對象getUser.getUserName()綁定表單對象的屬性值

  接下來就是將表單提交。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仍是不太瞭解,只能將其中一些心得和問題總結一下。

相關文章
相關標籤/搜索