SSO实现单点登录

环境概述

  • apache-tomcat-8.5.6
  • cas-client-core-3.2.1.jar
  • cas-server-3*.jar
机器ip 端口 用途
192.168.0.71 8080 中央认证(cas server)
192.168.0.65 8089 接入

cas server部署

  1. 解压tomcat,并将cas-server.xx.war解压到tomcat的webapps下,如CasWeb
[root@test webapps]# pwd
/opt/software/apache-tomcat-8.5.6/webapps
[root@test webapps]# ls
CasWeb  docs  examples  host-manager  manager  ROOT
  1. 修改cas配置
[root@test WEB-INF]# cat cas.properties
cas.securityContext.serviceProperties.service=http://192.168.0.71:8080/CasWeb/services/j_acegi_cas_security_check
cas.securityContext.casProcessingFilterEntryPoint.loginUrl=http://192.168.0.71:8080/CasWeb/login
cas.securityContext.ticketValidator.casServerUrlPrefix=http://192.168.0.61:8080/CasWeb

cas.themeResolver.defaultThemeName=portal
cas.viewResolver.basename=portal_views

host.name=test

#database.hibernate.dialect=org.hibernate.dialect.OracleDialect
database.hibernate.dialect=org.hibernate.dialect.MySQLDialect
#database.hibernate.dialect=org.hibernate.dialect.HSQLDialect
  1. 数据库配置deployerConfigContext.xml
        <bean id="attributeRepository" class="com.avicit.cas.persondir.support.AvicitSingleRowJdbcPersonAttributeDao" >
        <constructor-arg index="0" ref="oarcleDataSource"/>
                <constructor-arg index="1" >
                        <list>
                                <value>username</value>
                        </list>
                     </constructor-arg>
        <!--  
        <constructor-arg index="2" value="select * from SYS_USER_SSO_MAP where USERINTERNALID=?"/>
        -->
        <constructor-arg index="2" value="select t.service_name_zh as WEB_NAME,um.user_name as WEB_USERNAME from sys_service t,sys_user_service_map um where t.id=um.sys_service_id and USERINTERNALID=?"/>

         <property name="columnsToAttributes">
                        <map>
                        <!--  
                            <entry key="username" value="username"/>
                            
                            <entry key="age" value="user_age"/>
                            -->
                        </map>
     </property>
     <!--  对应用户信息格式“系统代码$$登录用户代码@@系统代码$$登录用户代码.....” 例如:oa$$user001@@cms$$k001-->
      <property name="userInfo">
                        <value>appUserName</value>
                </property>

    </bean>
        <bean id="oarcleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                <property name="driverClassName" >
                        <value>oracle.jdbc.driver.OracleDriver</value>
                </property>
                <property name="url">
                        <value>jdbc:oracle:thin:@192.168.0.53:1521:orcl</value>
                </property>
                <property name="username">
                        <value>pt6</value>
                </property>
                <property name="password">
                        <value>cape</value>
                </property>
                <property name="maxActive" value="6" />
                <property name="maxIdle" value="4" />
                <property name="initialSize" value="1"/>
        </bean>
  1. 启动tomcat,并在浏览器中访问:http://192.168.0.71:8080/CasWeb
    在这里插入图片描述
    在这里插入图片描述

配置cas client

为了不影响业务系统单独访问,对CAS Client 进行了修改,只有在地址中带有【flag=capitalPortal】时,上面配置的web.xml的filter才会生效。

  1. 配置tomcat端口为8089(server.xml)
    <Connector port="8089" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  1. 在web.xml中加入拦截器
<listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
    <filter>
        <filter-name>CASSingle Sign OutFilter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CASSingle Sign OutFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>http://192.168.0.71:8080/CasWeb/login</param-value>
           // http://192.168.0.71:8080/CasWeb/login CAS登录地址
</init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://192.168.0.65:8089</param-value>
  // http://192.168.0.65:8089 客户端(即第三方应用统)的服务器+端口
</init-param>
    </filter>
    <filter-mapping>
        <filter-name>CASFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>CASValidationFilter</filter-name>
        <filter-class>
            org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
        </filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://192.168.0.71:8080/CasWeb</param-value>
           // http://10.64.15.83:10039/cas CAS登录地址
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://192.168.0.65:8089</param-value>
           // http://localhost:8080 客户端(即第三方应用系统)的服务器+端口
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CASValidationFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>CASHttpServletRequest WrapperFilter</filter-name>
        <filter-class>
            org.jasig.cas.client.util.HttpServletRequestWrapperFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CASHttpServletRequest WrapperFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>CASAssertion Thread LocalFilter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CASAssertion Thread LocalFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 引入cas-client-core-3.2.1.jar
  2. 增加login.jsp作为单点登录页面

通过cas client提供的方法获取,cas登录页面的用户名
随机生成登录密码,进行登录

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
user = principal.toString();
CTUserCheckSSO.createUserMap(user, true);
pass = CTUserCheckSSO.getUserRandPwd(user, false);
import java.util.Random;
import java.util.TreeMap;

public class CTUserCheckSSO {

    public static TreeMap<String, String> userList = new TreeMap<String, String>();

    public static String createUserMap(String uName, boolean add) {
        if (userList == null) {
            userList = new TreeMap<String, String>();
        }
        if (uName == null || "".equals(uName.trim())) {
            return "";
        }
        String pwd = "";
        while (true) {
            Random randrom = new Random();
            long p = System.currentTimeMillis() + randrom.nextLong();
            double ps = Math.abs(Math.sin(p));
            pwd = String.valueOf(ps);
            if (pwd != null && !"".equals(pwd)) {
                break;
            }
        }
        if (add) {
            userList.put(uName, pwd);
        }
        return pwd;
    }

    public static String getUserRandPwd(String uName, boolean remove) {
        if (userList == null) {
            userList = new TreeMap<String, String>();
        }
        if (uName == null || "".equals(uName.trim())) {
            return "";
        }
        if (!userList.containsKey(uName)) {
            return "";
        }
        String pwd = userList.get(uName);
        if (remove) {
            userList.remove(uName);
        }
        return pwd;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            System.out.println(CTUserCheckSSO.createUserMap("test", true));
        }
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="org.jasig.cas.client.authentication.*" %>
<%@ page import="java.util.*" %>
<%@ page import="com.clustertech.cloud.gui.utils.CTUserCheckSSO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="http://code.jquery.com/jquery-1.12.4.js"></script>
</head>
<!-- get "userName" and "password" from the request -->
<%
String user = "";
String pass = "";
String flag = (String) request.getParameter("flag");
if(flag == null || !flag.equals("capitalPortal")){
}else{
    AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
    user = principal.toString();
    CTUserCheckSSO.createUserMap(user, true);
    pass = CTUserCheckSSO.getUserRandPwd(user, false);
}
pageContext.setAttribute("userName", user);
pageContext.setAttribute("password", pass);
%>
<body>
</body>
<script type="text/javascript">
var user = '${userName}';
var pass = '${password}';
var accessType = localStorage.getItem('ccmp3AccessType');
var data = {
    userName: user,
    password: pass
};
if (user && pass && !accessType) {
    $.ajax({
        url:"/api/auth/login",
        contentType: "application/json;charset=UTF-8",
        type: 'POST',
                data: JSON.stringify(data),
        success: function (e) {
            localStorage.setItem('ctcloud3AccessToken', e.token);
            localStorage.setItem('ctcloud3AccessType', 'single');
            window.location.href = '/';
        }
    });
} else {
    localStorage.removeItem('ctcloud3AccessType');
    window.close();http://
}
</script>
</html>

启动tomcat。

登录测试

在浏览器中访问(使用单点登录):http://192.168.0.65:8089/login.jsp?flag=capitalPortal
页面跳转至:http://192.168.0.71:8080/CasWeb/login?service=http%3A%2F%2F192.168.0.65%3A8089%2Flogin.jsp%3Fflag%3DcapitalPortal
在这里插入图片描述
输入用户名,密码进行登录,登陆成功后页面跳转至web页面。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wz122330/article/details/85295432