SSO单点登录

应公司需求做单点登录,之前都没有听过这是啥东东,不过还好有度娘。网上有许多关于单点登录的文章,看了很多,感觉以下几篇文章相对较好。

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-INFcas.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加上样式就必须使用

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

原文地址:https://www.cnblogs.com/smart-hwt/p/8889284.html