Index: build.gradle
===================================================================
diff -u -r16176 -r16468
--- build.gradle (.../build.gradle) (revision 16176)
+++ build.gradle (.../build.gradle) (revision 16468)
@@ -685,6 +685,8 @@
compile (project(":forgon-core"))
compile (project(":ssts-diposablegoods"))
compile (project(":ssts-tousse"))
+ // 引入CAS client,用户单点登录的身份验证
+ compile group: 'org.jasig.cas.client', name: 'cas-client-core', version: '3.4.1'
}
}
@@ -836,6 +838,10 @@
}
else if (projectName == 'zd5y'){
compile (project(":ssts-zd5y-misc"))
+ // 引入CAS client,用户单点登录的身份验证
+ compile group: 'org.jasig.cas.client', name: 'cas-client-core', version: '3.4.1'
+ // 引入Spring Security CAS的jar包
+ compile 'org.springframework.security:spring-security-cas:' + springSecurityVersion
}
else if (projectName == 'gdsy'){
compile (project(":ssts-gdsy-misc"))
Index: ssts-web/src/main/resources/spring/projects/zd5y/applicationContext-acegi-security.xml
===================================================================
diff -u
--- ssts-web/src/main/resources/spring/projects/zd5y/applicationContext-acegi-security.xml (revision 0)
+++ ssts-web/src/main/resources/spring/projects/zd5y/applicationContext-acegi-security.xml (revision 16468)
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: ssts-web/src/main/webapp/WEB-INF/web-zd5y.xml
===================================================================
diff -u
--- ssts-web/src/main/webapp/WEB-INF/web-zd5y.xml (revision 0)
+++ ssts-web/src/main/webapp/WEB-INF/web-zd5y.xml (revision 16468)
@@ -0,0 +1,390 @@
+
+
+
+ SterileSupplySystem
+
+
+ reload_interval_in_minutes
+ 30
+
+
+
+ contextConfigLocation
+ classpath*:spring/applicationContext-blank.xml
+
+
+
+ locatorFactorySelector
+ classpath*:beanRefContext.xml
+
+
+
+ parentContextKey
+ com.forgon.portal
+
+
+
+
+
+ springSecurityFilterChain
+ org.springframework.web.filter.DelegatingFilterProxy
+
+
+
+ springSecurityFilterChain
+ /*
+
+
+
+ CAS Single Sign Out Filter
+ org.jasig.cas.client.session.SingleSignOutFilter
+
+ casServerUrlPrefix
+ https://casserver:8443
+
+
+
+
+ CAS Single Sign Out Filter
+ /*
+
+
+
+ EncodingFilter
+ org.springframework.web.filter.CharacterEncodingFilter
+
+ encoding
+ UTF-8
+
+
+
+
+ resetPasswordFilter
+ com.forgon.security.filter.ResetPasswordFilter
+
+ toUrl
+ /logon.jsp
+
+
+
+
+
+
+ versionManagerFilter
+ com.forgon.register.filter.VersionManagerFilter
+
+ noFilterUrl
+ /debug/;/disinfectsystem/config/;/disinfectsystem/common/;/disinfectSystem/fileUploadServlet;/CodeImageServlet;/fckeditor/;/UserUpLoadFiles/;/openSystemMainPage.jsp;/logon.jsp;/favicon.ico;/js/;/common/taglibs.jsp;/jquery/;/ext/;/dwr/;/images/;/styles/;/scripts/;/wap/index.jsp;/themes/;/services/;/ikey/;/mobileClient/;/disinfectSystem/sterilization/sterilizationRecordAction!uploadSterilizationRecordPic.do
+
+
+
+
+ struts2
+ org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
+
+
+
+ hibernateFilter
+ org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
+
+
+
+ EncodingFilter
+ /*
+
+
+
+ hibernateFilter
+ /*
+
+
+
+
+
+ versionManagerFilter
+ /*
+
+
+
+ struts2
+ *.do
+
+
+
+
+
+
+ com.forgon.servlet.ForgonServletContextListener
+
+
+
+
+ org.springframework.web.context.ContextLoaderListener
+
+
+
+
+ com.forgon.tools.listener.SingletonSpringApplicationContextListener
+
+
+
+
+
+
+ org.jasig.cas.client.session.SingleSignOutHttpSessionListener
+
+
+
+ org.springframework.security.web.session.HttpSessionEventPublisher
+
+
+ com.forgon.oa.onlineusers.listener.SessionInvalidationListener
+
+
+
+ dwr-invoker
+ org.directwebremoting.servlet.DwrServlet
+
+ debug
+ true
+
+
+ classes
+ java.lang.Object
+
+
+ activeReverseAjaxEnabled
+ true
+
+
+ maxWaitAfterWrite
+ 500
+
+
+ crossDomainSessionSecurity
+ false
+
+
+ scriptCompressed
+ true
+
+
+ compressionLevel
+ 47
+
+
+
+
+ spring-mvc
+ org.springframework.web.servlet.DispatcherServlet
+
+ contextConfigLocation
+ /WEB-INF/spring-mvc-servlet.xml
+
+ 1
+
+
+
+ fileDownLoad
+ com.forgon.filedownload.servlet.FileDownLoadServlet
+
+
+
+ CodeImageServlet
+ com.forgon.security.servlet.CodeImageServlet
+
+
+
+ CodeImageServlet
+ /CodeImageServlet
+
+
+
+
+ JRHTMLServlet
+ org.xinyunfei.web.JRHTMLServlet
+
+
+ JRHTMLServlet
+ /JRHTMLServlet
+
+
+
+
+ ImageServlet
+ net.sf.jasperreports.j2ee.servlets.ImageServlet
+
+
+
+ ImageServlet
+ /servlets/image
+
+
+
+ DisplayChart
+ org.jfree.chart.servlet.DisplayChart
+
+
+
+ DisplayChart
+ /DisplayChart
+
+
+
+
+
+
+
+ Connector
+ com.fredck.FCKeditor.connector.ConnectorServlet
+
+ baseDir
+ /UserUpLoadFiles/
+
+
+ debug
+ false
+
+ 1
+
+
+
+ SimpleUploader
+ com.fredck.FCKeditor.uploader.SimpleUploaderServlet
+
+ baseDir
+ /UserUpLoadFiles/
+
+
+ debug
+ false
+
+
+ enabled
+ true
+
+
+ AllowedExtensionsFile
+
+
+
+ DeniedExtensionsFile
+ php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi
+
+
+ AllowedExtensionsImage
+ jpg|gif|jpeg|png|bmp
+
+
+ DeniedExtensionsImage
+
+
+
+ AllowedExtensionsFlash
+ swf|fla
+
+
+ DeniedExtensionsFlash
+
+
+ 1
+
+
+
+ cxf
+ cxf
+ Apache CXF Endpoint
+ org.apache.cxf.transport.servlet.CXFServlet
+ 1
+
+
+ uploadImageServlet
+ com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.servlet.UploadServlet
+
+
+ uploadImageServlet
+ /disinfectSystem/fileUploadServlet
+
+
+ Connector
+ /fckeditor/editor/filemanager/browser/default/connectors/jsp/connector
+
+
+
+ SimpleUploader
+ /fckeditor/editor/filemanager/upload/simpleuploader
+
+
+
+
+ dwr-invoker
+ /dwr/*
+
+
+
+ fileDownLoad
+ /attachfiles/fileDownLoad
+
+
+
+ spring-mvc
+ *.mhtml
+
+
+
+ cxf
+ /services/*
+
+
+
+ http://www.springmodules.org/tags/commons-validator
+ /WEB-INF/tlds/spring-commons-validator.tld
+
+
+
+ http://www.forgon.com/interceptString
+ /WEB-INF/tlds/interceptStringTag.tld
+
+
+
+ http://www.forgon.com/tags-operation
+ /WEB-INF/tlds/operation.tld
+
+
+
+ http://www.forgon.com/tags-bean
+ /WEB-INF/tlds/attachfile.tld
+
+
+
+
+ javax.servlet.jsp.jstl.fmt.localizationContext
+ resources/oa
+
+
+
+ openSystemMainPage.jsp
+
+
+
+ 480
+
+
+
+ 403
+ /casfailed.jsp
+
+
\ No newline at end of file
Index: ssts-web/src/main/webapp/casfailed.jsp
===================================================================
diff -u
--- ssts-web/src/main/webapp/casfailed.jsp (revision 0)
+++ ssts-web/src/main/webapp/casfailed.jsp (revision 16468)
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8"%>
+<%@ include file="/common/taglibs.jsp" %>
+<%@ page import="com.forgon.security.userdetails.*,com.forgon.security.service.*,com.forgon.directory.vo.LoginUserData,com.forgon.tools.SpringBeanManger,com.forgon.security.service.OperationManager"%>
+<%@page import="com.forgon.systemsetting.service.HttpOptionManager,com.forgon.disinfectsystem.common.*"%>
+<%@page import="com.forgon.disinfectsystem.basedatamanager.ipandorgunitmapping.service.IpAndOrgUnitMappingManager"%>
+<%@page import="com.forgon.log.model.Log" %>
+<%@page import="org.springframework.security.core.userdetails.*,org.springframework.security.authentication.*,org.springframework.security.core.*,org.springframework.security.core.context.*" %>
+<%@ page language="java" import="org.jasig.cas.client.authentication.AttributePrincipal" %>
+
+<%@page import="java.util.List"%>
+
+
+
+
+系统信息
+
+
+您好,在追溯系统数据中没找到您的注册信息,请与系统管理员联系!
+
+
\ No newline at end of file
Index: ssts-zd5y-misc/src/main/java/com/forgon/disinfectsystem/sso/cas/client/filter/UsernamePasswordAuthenticationForCasFilter.java
===================================================================
diff -u
--- ssts-zd5y-misc/src/main/java/com/forgon/disinfectsystem/sso/cas/client/filter/UsernamePasswordAuthenticationForCasFilter.java (revision 0)
+++ ssts-zd5y-misc/src/main/java/com/forgon/disinfectsystem/sso/cas/client/filter/UsernamePasswordAuthenticationForCasFilter.java (revision 16468)
@@ -0,0 +1,127 @@
+package com.forgon.disinfectsystem.sso.cas.client.filter;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jasig.cas.client.authentication.AttributePrincipalImpl;
+import org.jasig.cas.client.util.AbstractCasFilter;
+import org.jasig.cas.client.validation.Assertion;
+import org.jasig.cas.client.validation.AssertionImpl;
+import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
+
+/**
+ * @author Terry
+ * @Date 2016-12-27 21:43:10
+ * 为CAS服务的身份验证Filter
+ * 验证用户名和密码通过后,在Http Session中放置一个Assertion对象,让casAuthenticationFilter认为身份验证通过了
+ * Assertion对象包含了通过身份验证的用户名principle,以及通过验证的时间
+ */
+public class UsernamePasswordAuthenticationForCasFilter extends AbstractAuthenticationProcessingFilter {
+
+ private static final String DEFAULT_FILTER_PROCESSES_URL = "/j_spring_security_check";
+ private static final String POST = "POST";
+
+ public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "j_username";
+ public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "j_password";
+
+ private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY;
+ private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY;
+ private boolean postOnly = true;
+
+ public UsernamePasswordAuthenticationForCasFilter() {
+ super(DEFAULT_FILTER_PROCESSES_URL);
+ }
+
+ @Override
+ public Authentication attemptAuthentication(HttpServletRequest request,
+ HttpServletResponse response) throws AuthenticationException,
+ IOException, ServletException {
+
+ // You'll need to fill in the gaps here. See the source of
+ // UsernamePasswordAuthenticationFilter for a working implementation
+ // you can leverage.
+ if (postOnly && !request.getMethod().equals("POST")) {
+ throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
+ }
+
+ String username = obtainUsername(request);
+ String password = obtainPassword(request);
+
+ if (username == null) {
+ username = "";
+ }
+
+ if (password == null) {
+ password = "";
+ }
+
+ username = username.trim();
+
+ UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
+
+ // Allow subclasses to set the "details" property
+ setDetails(request, authRequest);
+
+ Authentication authenticate = this.getAuthenticationManager().authenticate(authRequest);
+
+ return authenticate;
+
+ //return null;
+ }
+
+ protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
+ authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
+ }
+
+ @Override
+ public void doFilter(ServletRequest req, ServletResponse res,
+ FilterChain chain) throws IOException, ServletException {
+ final HttpServletRequest request = (HttpServletRequest) req;
+ final HttpServletResponse response = (HttpServletResponse) res;
+ if (request.getMethod().equals(POST)) {
+ // If the incoming request is a POST, then we send it up
+ // to the AbstractAuthenticationProcessingFilter.
+ super.doFilter(request, response, chain);
+
+ final Assertion assertion;
+ final Map attributes = new HashMap();
+
+ String principal = obtainUsername(request);
+ assertion = new AssertionImpl(new AttributePrincipalImpl(principal,
+ attributes));
+
+ request.getSession().setAttribute(AbstractCasFilter.CONST_CAS_ASSERTION, assertion);
+
+ System.out.println("test");
+
+ } else {
+ // If it's a GET, we ignore this request and send it
+ // to the next filter in the chain. In this case, that
+ // pretty much means the request will hit the /login
+ // controller which will process the request to show the
+ // login page.
+ chain.doFilter(request, response);
+ }
+ }
+
+ protected String obtainUsername(HttpServletRequest request) {
+ return request.getParameter(usernameParameter);
+ }
+
+ protected String obtainPassword(HttpServletRequest request) {
+ return request.getParameter(passwordParameter);
+ }
+
+}
Index: ssts-web/src/main/webapp/casLogon.jsp
===================================================================
diff -u
--- ssts-web/src/main/webapp/casLogon.jsp (revision 0)
+++ ssts-web/src/main/webapp/casLogon.jsp (revision 16468)
@@ -0,0 +1,52 @@
+<%@ page contentType="text/html; charset=UTF-8"%>
+<%@ include file="/common/taglibs.jsp" %>
+<%@ page import="com.forgon.security.userdetails.*,com.forgon.security.service.*,com.forgon.directory.vo.LoginUserData,com.forgon.tools.SpringBeanManger,com.forgon.security.service.OperationManager"%>
+<%@page import="com.forgon.systemsetting.service.HttpOptionManager,com.forgon.disinfectsystem.common.*"%>
+<%@page import="com.forgon.disinfectsystem.basedatamanager.ipandorgunitmapping.service.IpAndOrgUnitMappingManager"%>
+<%@page import="com.forgon.log.model.Log" %>
+<%@page import="org.springframework.security.core.userdetails.*,org.springframework.security.authentication.*,org.springframework.security.core.*,org.springframework.security.core.context.*" %>
+
+<%@page import="java.util.List"%>
+<%
+ String username = request.getRemoteUser();
+
+ System.out.println("RemoteUser = " + request.getRemoteUser());
+
+ UserDetailsService daoUserDetail = (UserDetailsService) SpringBeanManger
+ .getBean("daoUserDetail");
+
+ UserContainsSessionUser user = (UserContainsSessionUser) daoUserDetail
+ .loadUserByUsername(username);
+
+ // 验证不通过
+ if (user == null) {
+ // 跳转到登陆页
+ // ...
+ response.sendRedirect("logon.jsp");
+ }
+ // 验证通过后的处理
+ else {
+
+ Authentication authRequest = new UsernamePasswordAuthenticationToken(
+ user, "1", user.getAuthorities());
+
+ SecurityContextHolder.getContext().setAuthentication(
+ authRequest);
+
+ response.sendRedirect("openSystemMainPage.jsp");
+
+ // 跳转到欢迎页面
+ // ...
+
+ }
+%>
+
+
+
+
+
+
+casLogon.jsp
+1111
+
+
Index: ssts-web/src/main/webapp/cas-logout.jsp
===================================================================
diff -u
--- ssts-web/src/main/webapp/cas-logout.jsp (revision 0)
+++ ssts-web/src/main/webapp/cas-logout.jsp (revision 16468)
@@ -0,0 +1,27 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8"%>
+<%@ page import="com.forgon.security.userdetails.*,com.forgon.security.service.*,com.forgon.directory.vo.LoginUserData,com.forgon.tools.SpringBeanManger,com.forgon.security.service.OperationManager"%>
+<%@page import="com.forgon.systemsetting.service.HttpOptionManager,com.forgon.disinfectsystem.common.*"%>
+<%@page import="com.forgon.disinfectsystem.basedatamanager.ipandorgunitmapping.service.IpAndOrgUnitMappingManager"%>
+<%@page import="com.forgon.log.model.Log" %>
+<%@page import="org.springframework.security.core.userdetails.*,org.springframework.security.authentication.*,org.springframework.security.core.*,org.springframework.security.core.context.*" %>
+
+<%@page import="java.util.List"%>
+
+
+
+
+
+CAS Logout
+
+
+您已经退出了消毒供应追溯系统!
+
+关闭本窗口
+
+本地重新登录
+
+
+
\ No newline at end of file