应公司需求做单点登录,之前都没有听过这是啥东东,不过还好有度娘。网上有许多关于单点登录的文章,看了很多,感觉以下几篇文章相对较好。
1.单点登录原理与简单实现:https://www.cnblogs.com/ywlaker/p/6113927.html
2.SSO之CAS单点登录详细搭建教程:https://www.cnblogs.com/zhoubang521/p/5200407.html
3.单点登录实践:https://blog.csdn.net/jadyer/article/category/5645879
按照2中的步骤就可以搭建sso的一个demo。
下面我主要说一下单点登录的自定义登录(server端)
1.首先将cas-server的war包导入myeclipse或者eclipse中,使其能正常的访问。
2.接下来就是修改原始的登录页面。修改登录就需要知道登录的流程是怎样的。
cas的页面显示控制是集中在\WEB-INF\cas.properties中的cas.viewResolver.basename属性的,它的值默认是default_views,接下来cas会去classpath中寻找default_views.properties,在default_views.properties中指定了登录登出页面等.
其中casLoginView.url表示默认登录页,casLoginGenericSuccessView.url表示默认登录成功页。
在原来的casLoginView.jsp页面中,可以看出其body是用spring-webflow实现的,因此自定义登录页面必须也这样写。
其中<form:input>标签是指通过form来生成input,因此要给input加上样式就必须使用
- cssClass用于指定表单元素CSS样式名,相当于HTML元素的class属性
- cssStyle用于指定表单元素样式,相当于HTML元素的style属性
- cssErrorClass用于指定表单元素发生错误时对应的样式
- 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还是不太了解,只能将其中一些心得和问题总结一下。