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仍是不太了解,只能将其中一些心得和问题总结一下。

相关文章
相关标签/搜索