CAS单点登录-配置中心

2,317 阅读5分钟

前言

上一篇:CAS单点登录-基础搭建

下一篇:CAS单点登录-https配置

配置中心

什么是配置中心

分布式配置中心,方便服务配置文件统一管理,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。

重点:

服务是以spring.application.name的配置属性来决定这个服务的id,也就是告诉配置中心,我是谁

spring.profiles.active这是要拿哪个配置文件,那么这样我们就可以区分多个维度或者说环境,这里可以是多个,可以逗号分隔

访问策略:

/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties

若配置为:

spring.application.name=sso spring.profiles.active=dev

会寻找配置文件名为:sso-dev.properties文件,当然也可以为sso-dev.yml或其他

搭建配置中心

初始化框架

采用spring initializr下载

主pom.xml添加sso-config模块

 <modules>
     <module>../sso-server</module>
     <module>../sso-config</module>
 </modules>

修改sso-config的pom.xml

  1. 把spring-cloud-starter-config调整成spring-cloud-config-server
  2. 添加国内仓库代理
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.cxy.auth</groupId>
	<artifactId>sso-config</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>sso-config</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Dalston.SR3</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<!--为了加快速度,修改成国内的代理-->
	<repositories>
		<repository>
			<releases>
				<enabled>true</enabled>
			</releases>
			<id>maven2-release</id>
			<url>http://uk.maven.org/maven2/</url>
		</repository>
		<repository>
			<snapshots>
				<enabled>true</enabled>
				<!--快照版本库两个小时检查更新一遍-->
				<updatePolicy>interval:120</updatePolicy>
			</snapshots>
			<id>oss-snapshots</id>
			<url>http://repository.jboss.org/nexus/content/groups/public/</url>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<releases>
				<enabled>true</enabled>
			</releases>
			<id>maven2-release</id>
			<url>http://uk.maven.org/maven2/</url>
		</pluginRepository>
	</pluginRepositories>
</project>

SsoConfigApplication.java

在程序的入口Application类加上@EnableConfigServer注解开启配置服务器的功能

package com.cxy.auth.ssoconfig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class SsoConfigApplication {

	public static void main(String[] args) {
		SpringApplication.run(SsoConfigApplication.class, args);
	}
}

application.yml

我这里将application.properties改成了application.yml,比较直观

#指定日志输出文件
logging:
  file: "logs/sso-config.log"
info:
  name : "配置中心"

---
server:
  #服务端口
  port: 8888
  #访问路径
  context-path: /config
spring:
  profiles:
    #本地配置文件
    active:
      #配置文件本地化
      - native
  application:
    #指定应用名称
    name: sso-config

启动

mvn spring-boot:run

看到如下结果,配置成功

2018-12-11 11:46:17.895 INFO 10464 --- [ Thread-6] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 0 2018-12-11 11:46:17.904 INFO 10464 --- [ Thread-6] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown 2018-12-11 11:46:17.907 INFO 10464 --- [ Thread-6] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans

访问:http://localhost:8888/config

成功!

cas连接配置中心

  1. 上面我们提到配置是放置于配置中心,而不放在服务内
  2. 由于配置是放在与本地,那么spring的默认配置在目录为resources/config

创建sso-dev.properties

文件置于resources/config目录下

sso-dev.properties意味着cas的配置应该为:

spring.application.name=sso
spring.profiles.active=dev

修改sso-dev.properties配置

把sso-dev.properties文件修改成sso-server需要的配置(把application.properties内容拷贝过来即可)

##
# CAS Server Context Configuration
#
server.context-path=/cas
server.port=8443

 server.ssl.enabled=false

server.max-http-header-size=2097152
server.use-forward-headers=true
server.connection-timeout=20000
server.error.include-stacktrace=NEVER

server.tomcat.max-http-post-size=2097152
server.tomcat.basedir=build/tomcat
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
server.tomcat.accesslog.suffix=.log
server.tomcat.max-threads=10
server.tomcat.port-header=X-Forwarded-Port
server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.protocol-header-https-value=https
server.tomcat.remote-ip-header=X-FORWARDED-FOR
server.tomcat.uri-encoding=UTF-8

spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

##
# CAS Cloud Bus Configuration
#
spring.cloud.bus.enabled=false

endpoints.enabled=false
endpoints.sensitive=true

endpoints.restart.enabled=false
endpoints.shutdown.enabled=false

management.security.enabled=true
management.security.roles=ACTUATOR,ADMIN
management.security.sessions=if_required
management.context-path=/status
management.add-application-context-header=false

security.basic.authorize-mode=role
security.basic.enabled=false
security.basic.path=/cas/status/**

##
# CAS Web Application Session Configuration
#
server.session.timeout=300
server.session.cookie.http-only=true
server.session.tracking-modes=COOKIE

##
# CAS Thymeleaf View Configuration
#
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=true
spring.thymeleaf.mode=HTML
##
# CAS Log4j Configuration
#
# logging.config=file:/etc/cas/log4j2.xml
server.context-parameters.isLog4jAutoInitializationDisabled=true

##
# CAS AspectJ Configuration
#
spring.aop.auto=true
spring.aop.proxy-target-class=true

##
# CAS Authentication Credentials
#
cas.authn.accept.users=casuser::Mellon

启动

重启sso-config

访问:http://localhost:8888/config/sso/dev

sso-server

  1. 清空application.properties
  2. 新增bootstrap.properties置目录/resources下
#指定日志文件
logging.file=logs/cas.log
info.name=单点登录系统

#定义application.name的id
spring.application.name=sso
#寻找配置中心为sso-dev.properties
spring.profiles.active=dev
#指定配置中心地址
spring.cloud.config.uri=http://localhost:8888/config
#开启配置中心
spring.cloud.config.enabled=true
#支持自动任务去配置中心刷新配置
spring.cloud.config.watch.enabled=true
#30秒刷新一次
spring.cloud.config.watch.initialDelay=30000
#请求配置中心超市
spring.cloud.config.watch.delay=1000
#检查配置健康
health.config.enabled=true
  1. 调整log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Specify the refresh internal in seconds. -->
<Configuration monitorInterval="5" packages="org.apereo.cas.logging">
    <Properties>
        <Property name="baseDir">logs</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %p [%c] - &lt;%m&gt;%n"/>
        </Console>

        <RollingFile name="file" fileName="${baseDir}/sso/cas.log" append="true"
                     filePattern="${baseDir}/cas-%d{yyyy-MM-dd-HH}-%i.log">
            <PatternLayout pattern="%highlight{%d %p [%c] - &lt;%m&gt;}%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB"/>
                <TimeBasedTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy max="5" compressionLevel="9">
                <Delete basePath="${baseDir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz" />
                    <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="auditlogfile" fileName="${baseDir}/cas_audit.log" append="true"
                     filePattern="${baseDir}/cas_audit-%d{yyyy-MM-dd-HH}-%i.log">
            <PatternLayout pattern="%d %p [%c] - %m%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB"/>
                <TimeBasedTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy max="5" compressionLevel="9">
                <Delete basePath="${baseDir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz" />
                    <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="perfFileAppender" fileName="${baseDir}/perfStats.log" append="true"
                     filePattern="${baseDir}/perfStats-%d{yyyy-MM-dd-HH}-%i.log">
            <PatternLayout pattern="%m%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB"/>
                <TimeBasedTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy max="5" compressionLevel="9">
                <Delete basePath="${baseDir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz" />
                    <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <CasAppender name="casAudit">
            <AppenderRef ref="auditlogfile" />
        </CasAppender>
        <CasAppender name="casFile">
            <AppenderRef ref="file" />
        </CasAppender>
        <CasAppender name="casConsole">
            <AppenderRef ref="console" />
        </CasAppender>
        <CasAppender name="casPerf">
            <AppenderRef ref="perfFileAppender" />
        </CasAppender>
    </Appenders>
    <Loggers>
        <AsyncLogger name="com.couchbase" level="warn" additivity="false" includeLocation="true">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo.cas.web.CasWebApplication" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.security" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.jdbc" level="debug" additivity="false">
            <AppenderRef ref="casConsole"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo.cas.logout" level="debug" additivity="false">
            <AppenderRef ref="casConsole"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.boot.autoconfigure.security" level="info" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.jasig.cas.client" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo.services.persondir" level="warn" additivity="false" includeLocation="true">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apache" level="error" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.cloud" level="info" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <!--配置信息debug模式输出控制台-->
        <AsyncLogger name="org.apereo.cas.config" level="debug" additivity="false">
            <AppenderRef ref="casConsole"/>
        </AsyncLogger>
        <!--多属性debug模式输出控制台-->
        <AsyncLogger name="org.apereo.services.persondir" level="debug" additivity="false">
            <AppenderRef ref="casConsole"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo.cas.authentication" level="debug" additivity="false">
            <AppenderRef ref="casConsole"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.cloud.context" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.boot" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.aop" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.boot.actuate.autoconfigure" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.webflow" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.session" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.amqp" level="off" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.integration" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.messaging" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.web" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.orm.jpa" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.scheduling" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.thymeleaf" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.pac4j" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.opensaml" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="net.sf.ehcache" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="com.ryantenney.metrics" level="warn" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file"/>
        </AsyncLogger>
        <AsyncLogger name="net.jradius" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.openid4java" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.ldaptive" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="com.hazelcast" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.context.annotation" level="off" additivity="false" />
        <AsyncLogger name="org.springframework.boot.devtools" level="off" additivity="false" />
        <AsyncLogger name="org.jasig.spring" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework.web.socket" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apache.cxf" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apache.http" level="warn" additivity="false">
            <AppenderRef ref="casConsole"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="perfStatsLogger" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="casPerf"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo.cas.web.flow" level="info" additivity="true" includeLocation="true">
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncLogger name="org.apereo.inspektr.audit.support" level="info" includeLocation="true">
            <AppenderRef ref="casAudit"/>
            <AppenderRef ref="casFile"/>
        </AsyncLogger>
        <AsyncRoot level="error">
            <AppenderRef ref="casConsole"/>
        </AsyncRoot>
    </Loggers>
</Configuration>

  1. 运行sso-server
build.cmd run

访问:http://localhost:8443/cas

用户名/密码:casuser/Mellon

本文参考他人博客学习整理,需要看原博客的或者查看后续文章的可以点击