最近项目需要将activiti-explorer设计器实现单点登录,手头只有activiti-explorer的war包,所以决定使用比较简单的方式实现伪单点登录。
cas服务端的配置不在这个文章范围,本文章只写cas的client与activiti-explorer结合。
1.在activiti-explorer的web.xml配置cas代码
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>singleSignOutFilter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>singleSignOutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CASAuthentication Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://192.168.1.110:8080/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://192.168.1.144:8080</param-value>
</init-param>
</filter>
<filter>
<filter-name>CASValidation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://192.168.1.110:8080/cas/</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://192.168.1.144:8080</param-value>
</init-param>
</filter>
<filter>
<filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter>
<filter-name>CASAssertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASAuthentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASValidation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASAssertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.加入cas的jar包,这一步完成后启动项目,就可以完成先过cas登录页权限了,但跳到activiti-explorer登录页面后还需要手动登录。
3.完成activiti-explorer自动登录,简单思路:activiti-explorer在后台代码中获取到cas的用户名,进行判断,如果正确进入系统,前提条件是得实现登录按钮自动点击。
4.activiti-explorer使用的是vaadin框架,所以它的登录页面并不是jsp,而是纯java代码拼接而成,也就是在服务器端实现了jsp页面。但是activiti-explorer只有war包,所以需要对war包的class进行反编译。
5.反编译之后在ExplorerLoginForm.java类中添加拼接的js语句。
在h后添加document.getElementById('auto').click();需要在登录按钮加一个id值auto。这一步实现自动点击。
6.获取cas用户名,用request.getRemoteUser();来获取cas的用户名。cas是将HttpServletRequest对象再包装一次,包装成HttpServletRequestWrapperFilter,使其支持getUserPrincipal,getRemoteUser方法来取得登录的用户信息。如果是新建Spring的request,并不能直接获取到cas的用户名,所以需要在原activiti的request中获取到后传到Spring的request中。
7.判断CasUser的值是否是数据库中有权限的用户,然后执行activiti-explorer登录代码。