应公司需求作单点登陆,以前都没有听过这是啥东东,不过还好有度娘。网上有许多关于单点登陆的文章,看了不少,感受如下几篇文章相对较好。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仍是不太了解,只能将其中一些心得和问题总结一下。