单点登录

1.简介
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
在这里插入图片描述
2.什么是CAS
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
【1】开源的企业级单点登录解决方案。
【2】CAS Server 为需要独立部署的 Web 应用。
【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:
在这里插入图片描述
SSO单点登录访问流程主要有以下步骤:

  1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
  2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。
  3. 用户认证:用户身份认证。
  4. 发放票据:SSO服务器会产生一个随机的Service Ticket。
  5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
  6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
    3.CAS服务端部署
    CAS服务端其实就是一个war包。在资源\配套软件\cas\目录下cas.war 放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入http://localhost:8080/cas/login ,可看到登录页面。(配套资源在百度云盘可自取)。
链接:https://pan.baidu.com/s/1SqZvcYmSMv80NGMzdgxUwg 
提取码:t8b2 
复制这段内容后打开百度网盘手机App,操作更方便哦

4.修改用户名与密码
这里有个固定的用户名和密码 casuser /Mellon
如果需要修改,请编辑cas/WEB-INF/deployerConfigContext.xml

<bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
        <property name="users">
            <map>
            	<!--将其修改即可-->
                <entry key="casuser" value="Mellon"/>
            </map>
        </property>
    </bean>

5.修改tomcat端口号
(1)打开tomcat 目录 conf\server.xml 找到下面的配置
在这里插入图片描述
将端口8080,改为9100
(2)修改CAS配置文件
修改cas的WEB-INF/cas.properties
server.name=http://192.168.188.129:9100
6.去除https认证
CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买) 。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。
1.修改cas的WEB-INF/deployerConfigContext.xml
找到下面的配置

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"/>

这里需要增加参数p:requireSecure=“false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用
2. 修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
     p:cookieSecure="true"
     p:cookieMaxAge="-1"
     p:cookieName="CASTGC"
     p:cookiePath="/cas" />

参数p:cookieSecure=“true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
参数p:cookieMaxAge="-1",是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。
我们这里将cookieSecure改为false , cookieMaxAge 改为3600
3. 修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
找到下面配置

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />

我们这里将cookieSecure改为false , cookieMaxAge 改为3600
7.demo展示

  1. 引入依赖
<packaging>war</packaging>
   <properties>
   	<webVersion>3.0</webVersion>
   </properties>
   <dependencies>
   	<!-- cas -->
   	<dependency>
   		<groupId>org.jasig.cas.client</groupId>
   		<artifactId>cas-client-core</artifactId>
   		<version>3.3.3</version>
   	</dependency>
   	<dependency>
   		<groupId>javax.servlet</groupId>
   		<artifactId>servlet-api</artifactId>
   		<version>2.5</version>
   		<scope>provided</scope>
   	</dependency>
   </dependencies>
   <build>
   	<plugins>
   		<plugin>
   			<artifactId>maven-compiler-plugin</artifactId>
   			<configuration>
   				<source>1.8</source>
   				<target>1.8</target>
   			</configuration>
   		</plugin>
   		<plugin>
   			<groupId>org.apache.tomcat.maven</groupId>
   			<artifactId>tomcat7-maven-plugin</artifactId>
   			<configuration>
   				<!-- 指定端口 -->
   				<port>9001</port>
   				<!-- 请求路径 -->
   				<path>/</path>
   			</configuration>
   		</plugin>
   	</plugins>
   </build>
  1. 添加web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        version="2.5">
   <!--登录认证过滤器-->
   <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.188.146:9100/cas/login</param-value>
       </init-param>
       <init-param>
           <!--当前工程地址-->
           <param-name>serverName</param-name>
           <param-value>http://localhost:9001</param-value>
       </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.188.146:9100/cas</param-value>
       </init-param>
       <init-param>
           <!--当前工程地址-->
           <param-name>serverName</param-name>
           <param-value>http://localhost:9001</param-value>
       </init-param>
   </filter>
   <filter-mapping>
       <filter-name>casValidationFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

   <!-- 针对HttpservletRequest请求-->
   <filter>
       <filter-name>CasHttpRequestFilter</filter-name>
       <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>CasHttpRequestFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

   <!-- 获取登录用户名的过滤器-->
   <filter>
       <filter-name>casLocalFilter</filter-name>
       <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>casLocalFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

   <!-- 退出登录监听器过滤器-->
   <listener>        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
   </listener>
   <filter>
       <filter-name>casSingOutFilter</filter-name>
       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>casSingOutFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>
  1. 单点退出登录
    修改usr/local/tomcat/webapps/cas/WEB-INF下的配置文件cas-servlet.xml
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
       p:servicesManager-ref="servicesManager"
       p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

改为true后,可以在退出时跳转页面到目标页面,修改index.jsp的退出链接

  1. 编写index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>casdemo01</title>
</head>
<body>
<h1>登录成功,111111111111111111111111欢迎来到办公系统!</h1>
<%=request.getRemoteUser()%>
<!--单点退出-->
<a href="http://192.168.188.146:9100/cas/logout?service=http://www.ujiuye.com">退出登录</a>
</body>
</html>

8.CAS服务端数据源设置
我们现在让用户名密码从我们数据库中的user表里做验证,修改cas服务端中cas/WEB-INF/deployerConfigContext.xml ,添加如下配置

<!--数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
			  p:driverClass="com.mysql.jdbc.Driver"  
			  p:jdbcUrl="jdbc:mysql://192.168.188.1:3306/dongyimaidb?characterEncoding=utf8"  
			  p:user="root"  
			  p:password="123" /> 
<!--加密认证-->
<bean id="passwordEncoder" 
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  
		c:encodingAlgorithm="MD5"  
		p:characterEncoding="UTF-8" />  
<!--数据查询-->
<bean id="dbAuthHandler"  
		  class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"  
		  p:dataSource-ref="dataSource"  
		  p:sql="select password from tb_user where username = ?"  
		  p:passwordEncoder-ref="passwordEncoder"/>  

然后在配置文件开始部分找到如下配置

 <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>               
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <!--将其注释掉,或者替换成key-ref=dbAuthHandler,其是数据查询-->
                <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
            </map>
        </constructor-arg>      
        <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
</bean>

将以下三个jar包放入webapps\cas\WEB-INF\lib下 (云盘自取)
在这里插入图片描述

链接:https://pan.baidu.com/s/1Ri_43HFohtalVEf-Ci7V_A 
提取码:pzz5 
复制这段内容后打开百度网盘手机App,操作更方便哦

开启远程调用

# 修改访问权限
UPDATE USER SET HOST = '%' WHERE USER = 'root';
FLUSH PRIVILEGES;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

用数据库中的用户名和密码进行测试

yum install mysql -y  #虚拟机安装数据库
mysql -u root -h 192.168.188.1 -p  # 登录

9.CAS服务端界面改造
我们现在动手将CAS默认的登录页更改为自己制作的登陆页,步骤如下:
(1)将东易买的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下
(2)将css js等文件夹拷贝到 cas根目录下
(3) 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp
编辑casLoginView.jsp 内容,置于顶部

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

修改form标签

<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
	<!--修改用户名框-->
	<form:input id="username" tabindex="1" accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" placeholder="邮箱/用户名/手机号" class="span2 input-xfat" />
	<!--修改密码-->
	<form:password  id="password" tabindex="2" path="password"   accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" placeholder="请输入密码" class="span2 input-xfat"   />
	<!--修改登录框-->
	<input type="hidden" name="lt" value="${loginTicket}" />
	<input type="hidden" name="execution value="${flowExecutionKey}" />
	<input type="hidden" name="_eventId" value="submit" />
	<input class="sui-btn btn-block btn-xlarge btn-danger" accesskey="l" value="登陆" type="submit" />
</form:form>

错误提示框,在表单内加入错误提示框

<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />

WEB-INF目录下,设置国际化为zn_CN ,修改cas-servlet.xml,

<bean id="localeResolver"class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />

WEB-INF\classes,messages_zh_CN.properties下,并改为中文提示(转码),添加

authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.
authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.

10.CAS客户端与SpringSecurity集成

  1. 引入jar依赖(spring依赖和spring secrity 相关依赖)
<properties>
 	<webVersion>3.0</webVersion> 
   <spring.version>4.2.4.RELEASE</spring.version>
   </properties>
   <dependencies>
   	<dependency>
   		<groupId>org.springframework</groupId>
   		<artifactId>spring-core</artifactId>
   		<version>${spring.version}</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework</groupId>
   		<artifactId>spring-web</artifactId>
   		<version>${spring.version}</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework</groupId>
   		<artifactId>spring-webmvc</artifactId>
   		<version>${spring.version}</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework</groupId>
   		<artifactId>spring-context-support</artifactId>
   		<version>${spring.version}</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework</groupId>
   		<artifactId>spring-test</artifactId>
   		<version>${spring.version}</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework</groupId>
   		<artifactId>spring-jdbc</artifactId>
   		<version>${spring.version}</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework.security</groupId>
   		<artifactId>spring-security-web</artifactId>
   		<version>4.1.0.RELEASE</version>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework.security</groupId>
   		<artifactId>spring-security-config</artifactId>
   		<version>4.1.0.RELEASE</version>
   	</dependency>
   	<dependency>
   		<groupId>javax.servlet</groupId>
   		<artifactId>servlet-api</artifactId>
   		<version>2.5</version>
   		<scope>provided</scope>
   	</dependency>
   </dependencies>
 <build>
   <plugins>
     <plugin>
       <artifactId>maven-compiler-plugin</artifactId>
       <configuration>
         <source>1.8</source>
         <target>1.8</target>
       </configuration>
     </plugin>
     <!-- 配置Tomcat插件 -->
   		<plugin>
   			<groupId>org.apache.tomcat.maven</groupId>
   			<artifactId>tomcat7-maven-plugin</artifactId>
   			<configuration>
   				<path>/</path>
   				<port>9003</port>
   			</configuration>
   		</plugin>
   </plugins>
 </build>
  1. 建立web.xml ,添加过滤器等配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">		
 	 <context-param>
   	<param-name>contextConfigLocation</param-name>
   	<param-value>classpath:spring-security.xml</param-value>
    </context-param>
    <listener>
   	<listener-class>
   		org.springframework.web.context.ContextLoaderListener
   	</listener-class>
    </listener>	
    <filter>  
   	<filter-name>springSecurityFilterChain</filter-name>  		 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
    </filter>  
    <filter-mapping>  
   	<filter-name>springSecurityFilterChain</filter-name>  
   	<url-pattern>/*</url-pattern>  
    </filter-mapping>	
</web-app>
  1. 创建配置文件spring-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
   xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   					http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<!-- 配置 favicon.ico不进行安全拦截-->
<http pattern="/favicon.ico" security="none"/>
   <!-- 页面拦截规则 -->
   <http use-expressions="false">
   	<intercept-url pattern="/**" access="ROLE_USER" />
   	<form-login/>	
   </http>

   <!-- 认证管理器 -->
   <authentication-manager>
   	<authentication-provider>
   		<user-service>
   			<user name="admin" password="123456" authorities="ROLE_USER"/>
   		</user-service>		
   	</authentication-provider>	
   </authentication-manager>
</beans:beans>	
  1. 编写认证类
package com.offcn.demo.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

/**
* 认证类
*/

public class UserDetailServiceImpl implements UserDetailsService {
   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
   	//构建角色集合
   	List<GrantedAuthority> authorities=new ArrayList();
   	authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
   	return new User(username, ""  , authorities);		
   }
}

  1. 获取登录名
    我们在处理后端逻辑需要获得登录名,那么如何获取单点登录的用户名呢? 其实和我们之前获得用户名的方式是完全相同的,我们下面来做个测试。
    (1)web.xml 添加springmvc
  <servlet>
 	<servlet-name>springmvc</servlet-name>
 	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 	<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
 	<init-param>
 		<param-name>contextConfigLocation</param-name>
 		<param-value>classpath:springmvc.xml</param-value>
 	</init-param>
 </servlet>
 
 <servlet-mapping>
 	<servlet-name>springmvc</servlet-name>
 	<url-pattern>*.do</url-pattern>
 </servlet-mapping>

(2)创建springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="com.offcn.demo" />
	<mvc:annotation-driven />	
</beans>

(3)创建UserController

@RestController
public class UserController {
	@RequestMapping("/findLoginUser")
	public void  findLoginUser(){
		String name = SecurityContextHolder.getContext().getAuthentication().getName();
		System.out.println(name);		
	}	
}

http://localhost:9003/findLoginUser.do 即可在控制台看到输出的登录名。
部分jar包

 <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <!-- dubbo相关 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--springSecurity-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
        </dependency>
        <!--cas-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-cas</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-core</artifactId>
            <version>3.3.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>log4j-over-slf4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值