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