- 一、Cas介绍:
- 二、Cas使用:
- 第一部分:[服务器端配置与使用]
- 2.1 下载官方提供的Cas-Server模板:
- 2.2 配置并生成cas-server的war包:
- 第二部分:[客户端配置与使用]
- 2.1 需要在cas-server配置http协议(tomcat/webapps/cas/WEB-INF/classes/services目录)
- 2.2 创建cas-client1与cas-client2两个工程:
- 2.3 客户端的配置同上,只是将关于客户端2的端口改为8082
- 2.4 在面的两个客户端的resources/templates/添加hello.html文件:
- 2.5 运行效果如下:
- 第三部分:修改cas登录的界面:
- 3.1 修改登录界面的两种实现方式:
- 3.2 修改默认主题:
- 第四部分:将用户中心作为cas的客户端
- 4.1 在zyg-user-web中引入依赖:
- 4.2 在zyg-user-web中添加第二部分2.2.3中相关的配置:
- 4.3 添加application.properties文件,内容如下:
- 4.4 编写userController下的index处理器:
- 4.5 将项目资源/前台/home-index.html复制到templates下:
- 4.6 查看运行效果:
- 附录一:
- 附录二:
一、Cas介绍:
1.1 单点登录介绍:
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
1.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单点登录访问流程主要有以下步骤:
- 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
- 定向认证:SSO客户端会重定向用户请求到SSO服务器。
- 用户认证:用户身份认证。
- 发放票据:SSO服务器会产生一个随机的Service Ticket。
- 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
1.3 CAS官方架构图:
1.3.1 理解架构图:
在 CAS 的整个登录过程中,有三个重要的概念,这里我先来和大家捋一捋。
TGT:TGT 全称叫做 Ticket Granting Ticket,这个相当于我们平时所见到的 HttpSession 的作用,用户登录成功后,用户的基本信息,如用户名、登录有效期等信息,都将存储在此。
- TGC:TGC 全称叫做 Ticket Granting Cookie,TGC 以 Cookie 的形式保存在浏览器中,根据 TGC 可以帮助用户找到对应的 TGT,所以这个 TGC 有点类似与会话 ID。
- ST:ST 全称是 Service Ticket,这是 CAS Sever 通过 TGT 给用户发放的一张票据,用户在访问其他服务时,发现没有 Cookie 或者 ST ,那么就会 302 到 CAS Server 获取 ST,然后会携带着 ST 302 回来,CAS Client 则通过 ST 去 CAS Server 上获取用户的登录状态。
1.3.2 cas工作原理时序图:
CAS时序图
这张图其实画的比较清楚了,我再用文字和大家解释下:
术语:应用1、应用2 分别表示被保护的应用。- 用户通过浏览器访问应用1,应用1 发现用户没有登录,于是返回 302,并且携带上一个 service 参数,让用户去 CAS Server 上登录。
- 浏览器自动重定向到 CAS Server 上,CAS Server 获取用户 Cookie 中携带的 TGC,去校验用户是否已经登录,如果已经登录,则完成身份校验(此时 CAS Server 可以根据用户的 TGC 找到 TGT,进而获取用户的信息);如果未登录,则重定向到 CAS Server 的登录页面,用户输入用户名/密码,CAS Server 会生成 TGT,并且根据 TGT 签发一个 ST,再将 TGC 放在用户的 Cookie 中,完成身份校验。
- CAS Server 完成身份校验之后,会将 ST 拼接在 service 中,返回 302,浏览器将首先将 TGC 存在 Cookie 中,然后根据 302 的指示,携带上 ST 重定向到应用1。
- 应用1 收到浏览器传来的 ST 之后,拿去 CAS Server 上校验,去判断用户的登录状态,如果用户登录合法,CAS Server 就会返回用户信息给 应用1。
- 浏览器再去访问应用2,应用2 发现用户未登录,重定向到 CAS Server。
- CAS Server 发现此时用户实际上已经登录了,于是又重定向回应用2,同时携带上 ST。
- 应用2 拿着 ST 去 CAS Server 上校验,获取用户的登录信息。
在整个登录过程中,浏览器分别和 CAS Server、应用1、应用2 建立了会话,其中,和 CAS Server 建立的会话称之为全局会话,和应用1、应用2 建立的会话称之为局部会话;一旦局部会话成功建立,以后用户再去访问应用1、应用2 就不会经过 CAS Server 了。
二、Cas使用:
第一部分:[服务器端配置与使用]
2.1 下载官方提供的Cas-Server模板:
地址:https://github.com/apereo/cas-overlay-template/tree/5.3
2.2 配置并生成cas-server的war包:
2.2.1 执行命令:build.cmd run
说明:此时才有:
注意:上面的不需要执行命令,只需要将项目在右侧的maven视图中导入(就是引入pom.xml文件)就会有overlays这个文件夹!
2.2.2 创建src目录及src/main/java和src/resources
说明:
此时要复制overlays/WEB-INF/classes/application.properties这个文件到当前的resources目录下并修改。
application.properties文件:
##
# CAS Server Context Configuration
#
server.context-path=/cas
server.port=8080
#取消支持https
#server.ssl.key-store=file:/etc/cas/thekeystore
#server.ssl.key-store-password=changeit
#server.ssl.key-password=changeit
server.max-http-header-size=2097152
server.use-forward-headers=true
server.connection-timeout=20000
server.error.include-stacktrace=ALWAYS
server.compression.enabled=true
server.compression.mime-types=application/javascript,application/json,application/xml,text/html,text/xml,text/plain
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.min-spare-threads=10
server.tomcat.max-threads=200
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
# Indicates that systemPropertiesOverride can be used.
# Set to false to prevent users from changing the default accidentally. Default true.
spring.cloud.config.allow-override=true
# External properties should override system properties.
spring.cloud.config.override-system-properties=false
# When allowOverride is true, external properties should take lowest priority, and not override any
# existing property sources (including local config files).
spring.cloud.config.override-none=false
# spring.cloud.bus.refresh.enabled=true
# spring.cloud.bus.env.enabled=true
# spring.cloud.bus.destination=CasCloudBus
# spring.cloud.bus.ack.enabled=true
endpoints.enabled=false
endpoints.sensitive=true
endpoints.restart.enabled=false
endpoints.shutdown.enabled=false
# Control the security of the management/actuator endpoints
# The 'enabled' flag below here controls the rendering of details for the health endpoint amongst other things.
management.security.enabled=true
management.security.roles=ACTUATOR,ADMIN
management.security.sessions=if_required
management.context-path=/status
management.add-application-context-header=false
# Define a CAS-specific "WARN" status code and its order
management.health.status.order=WARN, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
# Control the security of the management/actuator endpoints
# With basic authentication, assuming Spring Security and/or relevant modules are on the classpath.
security.basic.authorize-mode=role
security.basic.path=/cas/status/**
# security.basic.enabled=true
# security.user.name=casuser
# security.user.password=
##
# 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
spring.thymeleaf.template-resolver-order=100
##
# 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
cas.authn.accept.users=hbxfwf::123
#去掉安全加密机制
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
#配置加密策略(使用的是bcrypassendcoder 加密)
cas.authn.jdbc.query[0].passwordEncoder.type=org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
#cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
#下面支持从数据库查询用户,验证用户名及密码
cas.authn.jdbc.query[0].url=jdbc:mysql://192.168.56.10:3306/zeyigoudb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=123
cas.authn.jdbc.query[0].sql=select * from tb_user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver
2.2.3 修改overlays/WEB-INF/classes/service/HTTPSandIMAPS-10000001.json文件
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|http|imaps)://.*",
"name" : "HTTPS and IMAPS",
"id" : 10000001,
"description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
"evaluationOrder" : 10000
}
说明: 添加了http协议支持。”serviceId” : “^(https|http|imaps)://.*”,
2.2.3 找到我们的cas-overlay-template-5.3工程打包成war
2.2.4 将war复制到tomcat服务器的webapps目录下:
2.2.5 启动tomcat就可以访问cas-server了
2.2.6 复制四个springsecurity的jar包及mysql的jar包到tomcat的cas项目下的lib目录中。(在tomcat/webapps/cas/lib目录下一共有374个文件,129M大小,可以正常访问)
提示: 此时,可以在cas/WEB-INF/classes/application.properties文件中修改端口号为8080
2..2.6 在switchHost中添加域名映射:
2.2.7 最终服务端运行效果如下:
第二部分:[客户端配置与使用]
2.1 需要在cas-server配置http协议(tomcat/webapps/cas/WEB-INF/classes/services目录)
编辑HTTPSandIMAPS-10000001.json
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|http|imaps)://.*",
"name" : "HTTPS and IMAPS",
"id" : 10000001,
"description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
"evaluationOrder" : 10000
}
说明: 在serviceId字段添加http协议支持。
2.2 创建cas-client1与cas-client2两个工程:
2.2.1 添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
2.2.2 在application.properties文件中添加:
server.port=8081
#cas服务端配置
cas.server.prefix=http://cas.zeyigou.com:8080/cas
cas.server.login=${cas.server.prefix}/login
cas.server.logout=${cas.server.prefix}/logout
#cas客户端配置
cas.client.prefix=http://client1.cas.zeyigou.com:8081
cas.client.login=${cas.client.prefix}/login/cas
cas.client.logoutRelative=/logout/cas
cas.client.logout=${cas.client.prefix}${cas.client.logoutRelative}
#取消模板的缓存
spring.thymeleaf.cache=false
2.2.3 在config包下添加一系列的配置文件:
/**
* 功能: cas与springsecurity整合的配置类
* 参数:
* 返回值:
* 时间: 2021/8/11 16:53
*/
@Configuration
public class CasSecurityConfig {
@Autowired
CASClientProperties casClientProperties;
@Autowired
CASServerProperties casServerProperties;
@Autowired
UserDetailsService userDetailService;
/**
* 功能: 配置客户端登录成功后的跳转页面
* 参数:
* 返回值: org.springframework.security.cas.ServiceProperties
* 时间: 2021/8/11 17:00
*/
@Bean
ServiceProperties serviceProperties() {
ServiceProperties serviceProperties = new ServiceProperties();
serviceProperties.setService(casClientProperties.getLogin());
return serviceProperties;
}
/**
* 功能: 配置验证(cas-server进行验证)的入口
* 参数:
* 返回值: org.springframework.security.web.AuthenticationEntryPoint
* 时间: 2021/8/11 16:59
*/
@Bean
@Primary
AuthenticationEntryPoint authenticationEntryPoint() {
CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
entryPoint.setLoginUrl(casServerProperties.getLogin());
entryPoint.setServiceProperties(serviceProperties());
return entryPoint;
}
/**
* 功能: 让cas-server来校验票据
* 参数:
* 返回值: org.jasig.cas.client.validation.TicketValidator
* 时间: 2021/8/11 17:02
*/
@Bean
TicketValidator ticketValidator() {
return new Cas20ProxyTicketValidator(casServerProperties.getPrefix());
}
/**
* 功能: 设置cas认证提供者
* 参数:
* 返回值: org.springframework.security.cas.authentication.CasAuthenticationProvider
* 时间: 2021/8/11 17:04
*/
@Bean
CasAuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider provider = new CasAuthenticationProvider();
provider.setServiceProperties(serviceProperties());
provider.setTicketValidator(ticketValidator());
provider.setUserDetailsService(userDetailService);
provider.setKey("hbxfwf");
return provider;
}
/**
* 功能: cas认证过滤器:
* 作用:将请求过滤,拦截后交由CasAuthenticationProvider处理
* 参数:
* 返回值: org.springframework.security.cas.web.CasAuthenticationFilter
* 时间: 2021/8/11 17:04
*/
@Bean
CasAuthenticationFilter casAuthenticationFilter(AuthenticationProvider authenticationProvider) {
CasAuthenticationFilter filter = new CasAuthenticationFilter();
filter.setServiceProperties(serviceProperties());
filter.setAuthenticationManager(new ProviderManager(authenticationProvider));
return filter;
}
/**
* 功能: 通知服务器发出注销请求
* 参数:
* 返回值: org.jasig.cas.client.session.SingleSignOutFilter
* 时间: 2021/8/11 17:06
*/
@Bean
SingleSignOutFilter singleSignOutFilter() {
SingleSignOutFilter sign = new SingleSignOutFilter();
sign.setIgnoreInitConfiguration(true);
return sign;
}
/**
* 功能: 将注销请求求转发到服务端
* 参数:
* 返回值: org.springframework.security.web.authentication.logout.LogoutFilter
* 时间: 2021/8/11 17:07
*/
@Bean
LogoutFilter logoutFilter() {
LogoutFilter filter = new LogoutFilter(casServerProperties.getLogout(), new SecurityContextLogoutHandler());
filter.setFilterProcessesUrl(casClientProperties.getLogoutRelative());
return filter;
}
}
/**
* 功能: 配置springSecurity
* 参数:
* 返回值:
* 时间: 2021/8/11 17:07
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
AuthenticationEntryPoint authenticationEntryPoint;
@Autowired
AuthenticationProvider authenticationProvider;
@Autowired
SingleSignOutFilter singleSignOutFilter;
@Autowired
LogoutFilter logoutFilter;
@Autowired
CasAuthenticationFilter casAuthenticationFilter;
/**
* 功能: 配置认证提供者
* 参数:
* 返回值: void
* 时间: 2021/8/11 17:08
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/user/**")
.hasRole("user")
.antMatchers("/login/cas").permitAll()
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint)
.and()
.addFilter(casAuthenticationFilter)
.addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
.addFilterBefore(logoutFilter, LogoutFilter.class);
}
}
@ConfigurationProperties(prefix = "cas.client")
@Data
public class CASClientProperties {
private String prefix;
private String login;
private String logoutRelative;
private String logout;
}
@ConfigurationProperties(prefix = "cas.server")
@Data
public class CASServerProperties {
private String prefix;
private String login;
private String logout;
}
一、CasSecurityConfig 配置说明.txt 1、首先一进来注入三个对象,这三个中,有两个是我们前面写的配置类的实例,另外一个则是 UserDetailsService,
关于 UserDetailsService,我想我也不必多做解释,大家参考本系列前面的文章就知道 UserDetailsService
的作用(Spring Security 如何将用户数据存入数据库?),一会我会给出 UserDetailsService 的实现。
2、接下来配置 ServiceProperties,ServiceProperties 中主要配置一下 Client 的登录地址即可,这个地址
就是在 CAS Server 上登录成功后,重定向的地址。
3、CasAuthenticationEntryPoint 则是 CAS 验证的入口,这里首先设置 CAS Server 的登录地址,同时将前面
的 ServiceProperties 设置进去,这样当它登录成功后,就知道往哪里跳转了。
4、TicketValidator 这是配置 ticket 校验地址,CAS Client 拿到 ticket 要去 CAS Server 上校验,默认
校验地址是:https://cas.zeyigou.com:8080/cas/proxyValidate?ticket=xxx
5、CasAuthenticationProvider 主要用来处理 CAS 验证逻辑,关于 AuthenticationProvider
(SpringSecurity 自定义认证逻辑的两种方式(高级玩法)),想要自定义认证逻辑,如短信登录等,都可以通过扩展 AuthenticationProvider 来实现,这里的 CAS 登录当然也不例外,这里虽然设置了一userDetailService,
但是目的不是为了从数据库中查询数据做校验,因为登录是在 CAS Server 中进行的,
6、CasAuthenticationFilter 则是 CAS 认证的过滤器,过滤器将请求拦截下来之后,CasAuthenticationProvider来做具体处理。
7、SingleSignOutFilter 表示接受 CAS Server 发出的注销请求,所有的注销请求都将从 CAS Client 转发到 CAS Server,CAS Server 处理完后,会通知所有的 CAS Client 注销登录。
8、LogoutFilter 则是配置将注销请求转发到 CAS Server。二、SecurityConfig 配置说明 1、首先配置 authenticationProvider,这个 authenticationProvider 实际上就是一开始配置的
CasAuthenticationProvider。
2、接下来配置 /user/** 格式的路径需要有 user 角色才能访问,登录路径 /login/cas 可以直接访问,
剩余接口都是登录成功之后才能访问。
3、最后把 authenticationEntryPoint 配置进来,再把自定义的过滤器加进来三、UserDetailsServiceImpl 说明 既然是单点登录,也就是用户是在 CAS Server 上登录的,这里的 UserDetailsService 意义在哪里呢?
用户虽然在 CAS Server 上登录,但是,登录成功之后,CAS Client 还是要获取用户的基本信息、角色等,
以便做进一步的权限控制,所以,这里的 loadUserByUsername 方法中的参数,实际上就是你从 CAS Server
上登录成功后获取到的用户名,拿着这个用户名,去数据库中查询用户的相关信息并返回,方便 CAS Client 在后续的鉴权中做进一步的使用,这里我为了方便,就没有去数据库中查询了,而是直接创建了一个 User 对象返回。
2.2.4 在启动类中添加注解:
@SpringBootApplication
@ConfigurationPropertiesScan
public class CasClient1Application {
public static void main(String[] args) {
SpringApplication.run(CasClient1Application.class, args);
}
}
2.3 客户端的配置同上,只是将关于客户端2的端口改为8082
cas-client2客户端的application.properteis文件:
server.port=8082
cas.server.prefix=http://cas.zeyigou.com:8080/cas
cas.server.login=${cas.server.prefix}/login
cas.server.logout=${cas.server.prefix}/logout
cas.client.prefix=http://client2.cas.zeyigou.com:8082
cas.client.login=${cas.client.prefix}/login/cas
cas.client.logoutRelative=/logout/cas
cas.client.logout=${cas.client.prefix}${cas.client.logoutRelative}
spring.thymeleaf.cache=false
2.4 在面的两个客户端的resources/templates/添加hello.html文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<span th:text="${#request.remoteUser}"></span>
</body>
</html>
2.5 运行效果如下:
第三部分:修改cas登录的界面:
3.1 修改登录界面的两种实现方式:
方式 一:直接修改/cas/WEB-INF/classes/templates/casLoginView.html [ 不建议 ]
方式二:定义主题来修改登录页面
第一步:复制主题用到的资源:
① 在cas/WEB-INF/classes/static/themes/下创建userLogin文件夹(主题)
② 复制项目资料中的相关的css、js、img这些静态资源到此文件夹下。
第二步:创建模板文件
① 在cas/WEB-INF/classes/templates目录下新建目录userLogin
② 复制发放的项目资料下的shoplogin.html文件到userLogin目录下并改名为casLoginView.html
第三步:创建主题用到的变量
① 在cas\WEB-INF\classes目录下新建userLogin.properties文件
userLogin.css.style=/themes/userLogin/css/webbase.css
userLogin.css.ps=/themes/userLogin/css/pages-shoplogin.css
userLogin.js.jq=/themes/userLogin/js/plugins/jquery/jquery.min.js
userLogin.js.jems=/themes/userLogin/js/plugins/jquery.easing/jquery.easing.min.js
userLogin.js.sm=/themes/userLogin/js/plugins/sui/sui.min.js
userLogin.js.jp=/themes/userLogin/js/plugins/jquery-placeholder/jquery.placeholder.min.js
userLogin.js.sl=/themes/userLogin/js/pages/shoplogin.js
userLogin.img.qq=/themes/userLogin/img/qq.png
userLogin.img.sina=/themes/userLogin/img/sina.png
userLogin.img.ali=/themes/userLogin/img/ali.png
userLogin.img.weixin=/themes/userLogin/img/weixin.png
第四步:修改userLogin/casLoginView.html中的样式、js、img的引用,最终内容如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>泽易购,欢迎登录</title>
<link rel="icon" href="assets/img/favicon.ico">
<link rel="stylesheet" th:href="@{${#themes.code('userLogin.css.style')}}">
<link rel="stylesheet" type="text/css" th:href="@{${#themes.code('userLogin.css.ps')}}"/>
</head>
<body>
<div class="login-box">
<!--head-->
<div class="py-container logoArea">
<a href="" class="logo"></a>
</div>
<!--loginArea-->
<div class="loginArea">
<div class="login ">
<div class="py-container">
<div class="loginform">
<ul class="sui-nav nav-tabs tab-wraped">
<li>
<a href="#index" data-toggle="tab">
<h3>扫描登录</h3>
</a>
</li>
<li class="active">
<a href="#profile" data-toggle="tab">
<h3>账户登录</h3>
</a>
</li>
</ul>
<div class="tab-content tab-wraped">
<div id="index" class="tab-pane">
<p>二维码登录,暂为官网二维码</p>
<img src="/cas/themes/userLogin/img/wx_cz.jpg" />
</div>
<div id="profile" class="tab-pane active">
<form class="sui-form" method="post" th:object="${credential}">
<div class="input-prepend"><span class="add-on loginname"></span>
<input type="text" th:field="*{username}" th:accesskey="#{screen.welcome.label.netid.accesskey}" id="username" placeholder="邮箱/用户名/手机号" class="span2 input-xfat">
</div>
<div class="input-prepend"><span class="add-on loginpwd"></span>
<input type="password" id="password" th:accesskey="#{screen.welcome.label.password.accesskey}" th:field="*{password}" placeholder="请输入密码" class="span2 input-xfat">
</div>
<div class="setting">
<label class="checkbox inline">
<input name="m1" type="checkbox" value="2" checked="">自动登录</label>
<span class="forget">忘记密码?</span>
</div>
<div th:if="${#fields.hasErrors('*')}">
<span th:each="err : ${#fields.errors('*')}" th:utext="${err}"/>
</div>
<input type="hidden" name="execution" th:value="${flowExecutionKey}"/>
<input type="hidden" name="_eventId" value="submit"/>
<input type="hidden" name="geolocation"/>
<div class="logined">
<input type="submit" class="sui-btn btn-block btn-xlarge btn-danger" value="登录">
</div>
</form>
<div class="otherlogin">
<div class="types">
<ul>
<li><img th:src="@{${#themes.code('userLogin.img.qq')}}" width="35px" height="35px" /></li>
<li><img th:src="@{${#themes.code('userLogin.img.sina')}}"/></li>
<li><img th:src="@{${#themes.code('userLogin.img.ali')}}" /></li>
<li><img th:src="@{${#themes.code('userLogin.img.weixin')}}" /></li>
</ul>
</div>
<span class="register"><a href="register.html" target="_blank">立即注册</a></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--foot-->
<div class="py-container copyright">
<ul>
<li>关于我们</li>
<li>联系我们</li>
<li>联系客服</li>
<li>商家入驻</li>
<li>营销中心</li>
<li>手机泽易购</li>
<li>销售联盟</li>
<li>泽易购社区</li>
</ul>
<p>地址:深圳市大冲国际</p>
</div>
</div>
</div>
<!-- <script th:src="@{${#themes.code('userLogin.js.jq')}}"></script>
<script th:src="@{${#themes.code('userLogin.js.jems')}}"></script>
<script th:src="@{${#themes.code('userLogin.js.sm')}}"></script>
<script th:src="@{${#themes.code('userLogin.js.jp')}}"></script>
<script th:src="@{${#themes.code('userLogin.js.sl')}}"></script> -->
</body>
</html>
补充: ① 页面中的表单的内容的定义请参考cas\WEB-INF\classes\templates\fragments\loginform.html文件。
3.2 修改默认主题:
在cas/WEB-INF/classes目录下的application.properties文件中添加如下内容:
#修改全局主题
cas.theme.defaultThemeName=userLogin
第四部分:将用户中心作为cas的客户端
4.1 在zyg-user-web中引入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.zelin</groupId>
<artifactId>zyg-user-interface</artifactId>
<version>2.0</version>
</dependency>
<!--1.添加thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--2.添加devtools-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.zelin</groupId>
<artifactId>zyg-dao</artifactId>
<version>2.0</version>
</dependency>
<!--1. 引入cas单点登录的依赖【这里是本次引入的依赖】-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
</dependency>
</dependencies>
4.2 在zyg-user-web中添加第二部分2.2.3中相关的配置:
4.3 添加application.properties文件,内容如下:
server.port=9005
logging.level.com.zelin=debug
spring.thymeleaf.cache=false
spring.dubbo.registry.address=zookeeper://192.168.56.10:2181
spring.dubbo.base-package=com.zelin.user.web
spring.dubbo.application.name=zyg-user-web
cas.server.prefix=http://cas.zeyigou.com:8080/cas
cas.server.login=${cas.server.prefix}/login
cas.server.logout=${cas.server.prefix}/logout
cas.client.prefix=http://user.zeyigou.com
cas.client.login=${cas.client.prefix}/login/cas
cas.client.logoutRelative=/logout/cas
cas.client.logout=${cas.client.prefix}${cas.client.logoutRelative}
注意: cas.client.prefix=http://user.zeyigou.com,这里的配置要注意,因为此域名被nginx服务器使用,nginx服务器作用的是80端口,这里也只能使用80这个默认端口,不要使用9005端口,否则,不能访问资源。
4.4 编写userController下的index处理器:
//4. 到达用户中心主页
@GetMapping("/index")
public String index(Model model){
//4.1 取得用户名
String name = SecurityContextHolder.getContext().getAuthentication().getName();
//4.2 将用户名放到model中
model.addAttribute("name",name);
//4.3 返回视图
return "index";
}
4.5 将项目资源/前台/home-index.html复制到templates下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>我的订单</title>
<link rel="icon" href="/static/user/assets/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="/static/user/css/webbase.css" />
<link rel="stylesheet" type="text/css" href="/static/user/css/pages-seckillOrder.css" />
</head>
<body>
<!-- 头部栏位 -->
<!--页面顶部-->
<div id="nav-bottom">
<!--顶部-->
<div class="nav-top">
<div class="top">
<div class="py-container">
<div class="shortcut">
<ul class="fl">
<li class="f-item">泽易购欢迎您!</li>
<li class="f-item">请<a href="/static/user/login.html" target="_blank">登录</a> <span><a href="/static/user/register.html" target="_blank">免费注册</a></span></li>
</ul>
<ul class="fr">
<li class="f-item">我的订单</li>
<li class="f-item space"></li>
<li class="f-item"><a href="/static/user/home.html" target="_blank">我的泽易购</a></li>
<li class="f-item space"></li>
<li class="f-item">泽易购会员</li>
<li class="f-item space"></li>
<li class="f-item">企业采购</li>
<li class="f-item space"></li>
<li class="f-item">关注泽易购</li>
<li class="f-item space"></li>
<li class="f-item" id="service">
<span>客户服务</span>
<ul class="service">
<li><a href="/static/user/cooperation.html" target="_blank">合作招商</a></li>
<li><a href="/static/user/shoplogin.html" target="_blank">商家后台</a></li>
<li><a href="/static/user/cooperation.html" target="_blank">合作招商</a></li>
<li><a href="/static/user/#">商家后台</a></li>
</ul>
</li>
<li class="f-item space"></li>
<li class="f-item">网站导航</li>
</ul>
</div>
</div>
</div>
<!--头部-->
<div class="header">
<div class="py-container">
<div class="yui3-g Logo">
<div class="yui3-u Left logoArea">
<a class="logo-bd" title="泽易购" href="/static/user/JD-index.html" target="_blank"></a>
</div>
<div class="yui3-u Center searchArea">
<div class="search">
<form action="" class="sui-form form-inline">
<!--searchAutoComplete-->
<div class="input-append">
<input id="autocomplete" type="text" class="input-error input-xxlarge" />
<button class="sui-btn btn-xlarge btn-danger" type="button">搜索</button>
</div>
</form>
</div>
<div class="hotwords">
<ul>
<li class="f-item">泽易购首发</li>
<li class="f-item">亿元优惠</li>
<li class="f-item">9.9元团购</li>
<li class="f-item">每满99减30</li>
<li class="f-item">亿元优惠</li>
<li class="f-item">9.9元团购</li>
<li class="f-item">办公用品</li>
</ul>
</div>
</div>
<div class="yui3-u Right shopArea">
<div class="fr shopcar">
<div class="show-shopcar" id="shopcar">
<span class="car"></span>
<a class="sui-btn btn-default btn-xlarge" href="/static/user/cart.html" target="_blank">
<span>我的购物车</span>
<i class="shopnum">0</i>
</a>
<div class="clearfix shopcarlist" id="shopcarlist" style="display:none">
<p>"啊哦,你的购物车还没有商品哦!"</p>
<p>"啊哦,你的购物车还没有商品哦!"</p>
</div>
</div>
</div>
</div>
</div>
<div class="yui3-g NavList">
<div class="yui3-u Left all-sort">
<h4>全部商品分类</h4>
</div>
<div class="yui3-u Center navArea">
<ul class="nav">
<li class="f-item">服装城</li>
<li class="f-item">美妆馆</li>
<li class="f-item">品优超市</li>
<li class="f-item">全球购</li>
<li class="f-item">闪购</li>
<li class="f-item">团购</li>
<li class="f-item">有趣</li>
<li class="f-item"><a href="/static/user/seckill-index.html" target="_blank">秒杀</a></li>
</ul>
</div>
<div class="yui3-u Right"></div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/static/user/js/plugins/jquery/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#service").hover(function(){
$(".service").show();
},function(){
$(".service").hide();
});
$("#shopcar").hover(function(){
$("#shopcarlist").show();
},function(){
$("#shopcarlist").hide();
});
})
</script>
<script type="text/javascript" src="/static/user/js/plugins/jquery.easing/jquery.easing.min.js"></script>
<script type="text/javascript" src="/static/user/js/plugins/sui/sui.min.js"></script>
<script type="text/javascript" src="/static/user/js/plugins/jquery-placeholder/jquery.placeholder.min.js"></script>
<script type="text/javascript" src="/static/user/js/widget/nav.js"></script>
</body>
<!--header-->
<div id="account">
<div class="py-container">
<div class="yui3-g home">
<!--左侧列表-->
<div class="yui3-u-1-6 list">
<div class="person-info">
<div class="person-photo"><img src="/static/user/img/_/photo.png" alt=""></div>
<div class="person-account">
<span class="name">[[${name}]]</span>
<span class="safe"><a href="/static/user/#">退出登录 </a></span>
</div>
<div class="clearfix"></div>
</div>
<div class="list-items">
<dl>
<dt><i>·</i> 订单中心</dt>
<dd ><a href="/static/user/home-index.html" class="list-active" >我的订单</a></dd>
<dd><a href="/static/user/home-order-pay.html" >待付款</a></dd>
<dd><a href="/static/user/home-order-send.html" >待发货</a></dd>
<dd><a href="/static/user/home-order-receive.html" >待收货</a></dd>
<dd><a href="/static/user/home-order-evaluate.html" >待评价</a></dd>
</dl>
<dl>
<dt><i>·</i> 我的中心</dt>
<dd><a href="/static/user/home-person-collect.html">我的收藏</a></dd>
<dd><a href="/static/user/home-person-footmark.html">我的足迹</a></dd>
</dl>
<dl>
<dt><i>·</i> 物流消息</dt>
</dl>
<dl>
<dt><i>·</i> 设置</dt>
<dd><a href="/static/user/home-setting-info.html">个人信息</a></dd>
<dd><a href="/static/user/home-setting-address.html" >地址管理</a></dd>
<dd><a href="/static/user/home-setting-safe.html" >安全管理</a></dd>
</dl>
</div>
</div>
<!--右侧主内容-->
<div class="yui3-u-5-6 order-pay">
<div class="body">
<div class="table-title">
<table class="sui-table order-table">
<tr>
<thead>
<th width="35%">宝贝</th>
<th width="5%">单价</th>
<th width="5%">数量</th>
<th width="8%">商品操作</th>
<th width="10%">实付款</th>
<th width="10%">交易状态</th>
<th width="10%">交易操作</th>
</thead>
</tr>
</table>
</div>
<div class="order-detail">
<div class="orders">
<div class="choose-order">
<div class="sui-pagination pagination-large top-pages">
<ul>
<li class="prev disabled"><a href="/static/user/#">上一页</a></li>
<li class="next"><a href="/static/user/#">下一页</a></li>
</ul>
</div>
</div>
<!--order1-->
<div class="choose-title">
<label data-toggle="checkbox" class="checkbox-pretty ">
<input type="checkbox" checked="checked"><span>2017-02-11 11:59 订单编号:7867473872181848 店铺:哇哈哈 <a>和我联系</a></span>
</label>
<a class="sui-btn btn-info share-btn">分享</a>
</div>
<table class="sui-table table-bordered order-datatable">
<tbody>
<tr>
<td width="35%">
<div class="typographic"><img src="/static/user/img/goods.png" />
<a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
<span class="guige">规格:温泉喷雾150ml</span>
</div>
</td>
<td width="5%" class="center">
<ul class="unstyled">
<li class="o-price">¥599.00</li>
<li>¥299.00</li>
</ul>
</td>
<td width="5%" class="center">1</td>
<td width="8%" class="center">
</td>
<td width="10%" class="center" >
<ul class="unstyled">
<li>¥299.00</li>
<li>(含运费:¥0.00)</li>
</ul>
</td>
<td width="10%" class="center">
<ul class="unstyled">
<li>等待卖家付款</li>
<li><a href="/static/user/orderDetail.html" class="btn">订单详情 </a></li>
</ul>
</td>
<td width="10%" class="center">
<ul class="unstyled">
<li><a href="/static/user/#" class="sui-btn btn-info">立即付款</a></li>
<li>取消订单</li>
</ul>
</td>
</tr>
</tbody>
</table>
<!--order2-->
<div class="choose-title">
<label data-toggle="checkbox" class="checkbox-pretty ">
<input type="checkbox" checked="checked"><span>2017-02-11 11:59 订单编号:7867473872181848 店铺:哇哈哈 <a>和我联系</a></span>
</label>
<a class="sui-btn btn-info share-btn">分享</a>
</div>
<table class="sui-table table-bordered order-datatable">
<tbody>
<tr>
<td width="35%">
<div class="typographic"><img src="/static/user/img/goods.png" />
<a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
<span class="guige">规格:温泉喷雾150ml</span>
</div>
</td>
<td width="5%" class="center">
<ul class="unstyled">
<li class="o-price">¥599.00</li>
<li>¥299.00</li>
</ul>
</td>
<td width="5%" class="center">1</td>
<td width="8%" class="center">
<ul class="unstyled">
<li>已发货</li>
<li><a>退货/退款</a></li>
</ul>
</td>
<td width="10%" class="center" rowspan="2">
<ul class="unstyled">
<li>¥299.00</li>
<li>(含运费:¥0.00)</li>
</ul>
</td>
<td width="10%" class="center" rowspan="2">
<ul class="unstyled">
<li>部分发货</li>
<li><a href="/static/user/orderDetail.html" class="btn">订单详情 </a></li>
</ul>
</td>
<td width="10%" class="center" rowspan="2">
<ul class="unstyled">
<li>还剩4天23时</li>
<li><a href="/static/user/#" class="sui-btn btn-info">确认发货</a></li>
</ul>
</td>
</tr>
<tr>
<td width="35%">
<div class="typographic"><img src="/static/user/img/goods.png" />
<a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
<span class="guige">规格:温泉喷雾150ml</span>
</div>
</td>
<td width="5%" class="center">
<ul class="unstyled">
<li class="o-price">¥199.00</li>
<li>¥212.00</li>
</ul>
</td>
<td width="5%" class="center">1</td>
<td width="8%" class="center">
<ul class="unstyled">
<li>未发货</li>
<li><a>退货/退款</a></li>
</ul>
</td>
</tr>
</tbody>
</table>
<!--order3-->
<div class="choose-title">
<label data-toggle="checkbox" class="checkbox-pretty ">
<input type="checkbox" checked="checked"><span>2017-02-11 11:59 订单编号:7867473872181848 店铺:哇哈哈 <a>和我联系</a></span>
</label>
<a class="sui-btn btn-info share-btn">分享</a>
</div>
<table class="sui-table table-bordered order-datatable">
<tbody>
<tr>
<td width="35%">
<div class="typographic"><img src="/static/user/img/goods.png" />
<a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
<span class="guige">规格:温泉喷雾150ml</span>
</div>
</td>
<td width="5%" class="center">
<ul class="unstyled">
<li class="o-price">¥599.00</li>
<li>¥299.00</li>
</ul>
</td>
<td width="5%" class="center">1</td>
<td width="8%" class="center">
<ul class="unstyled">
<li><a>退货/退款</a></li>
</ul>
</td>
<td width="10%" class="center">
<ul class="unstyled">
<li>¥299.00</li>
<li>(含运费:¥0.00)</li>
</ul>
</td>
<td width="10%" class="center">
<ul class="unstyled">
<li>买家已付款</li>
<li><a href="/static/user/orderDetail.html" class="btn">订单详情 </a></li>
</ul>
</td>
<td width="10%" class="center">
<ul class="unstyled">
<li><a href="/static/user/#" class="sui-btn btn-info">提醒发货</a></li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<div class="choose-order">
<div class="sui-pagination pagination-large top-pages">
<ul>
<li class="prev disabled"><a href="/static/user/#">«上一页</a></li>
<li class="active"><a href="/static/user/#">1</a></li>
<li><a href="/static/user/#">2</a></li>
<li><a href="/static/user/#">3</a></li>
<li class="dotted"><span>...</span></li>
<li class="next"><a href="/static/user/#">下一页»</a></li>
</ul>
<div><span>共10页 </span><span>
到
<input type="text" class="page-num"><button class="page-confirm" onclick="alert(1)">确定</button>
页</span></div>
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="like-title">
<div class="mt">
<span class="fl"><strong>热卖单品</strong></span>
</div>
</div>
<div class="like-list">
<ul class="yui3-g">
<li class="yui3-u-1-4">
<div class="list-wrap">
<div class="p-img">
<img src="/static/user/img/_/itemlike01.png" />
</div>
<div class="attr">
<em>DELL戴尔Ins 15MR-7528SS 15英寸 银色 笔记本</em>
</div>
<div class="price">
<strong>
<em>¥</em>
<i>3699.00</i>
</strong>
</div>
<div class="commit">
<i class="command">已有6人评价</i>
</div>
</div>
</li>
<li class="yui3-u-1-4">
<div class="list-wrap">
<div class="p-img">
<img src="/static/user/img/_/itemlike02.png" />
</div>
<div class="attr">
<em>Apple苹果iPhone 6s/6s Plus 16G 64G 128G</em>
</div>
<div class="price">
<strong>
<em>¥</em>
<i>4388.00</i>
</strong>
</div>
<div class="commit">
<i class="command">已有700人评价</i>
</div>
</div>
</li>
<li class="yui3-u-1-4">
<div class="list-wrap">
<div class="p-img">
<img src="/static/user/img/_/itemlike03.png" />
</div>
<div class="attr">
<em>DELL戴尔Ins 15MR-7528SS 15英寸 银色 笔记本</em>
</div>
<div class="price">
<strong>
<em>¥</em>
<i>4088.00</i>
</strong>
</div>
<div class="commit">
<i class="command">已有700人评价</i>
</div>
</div>
</li>
<li class="yui3-u-1-4">
<div class="list-wrap">
<div class="p-img">
<img src="/static/user/img/_/itemlike04.png" />
</div>
<div class="attr">
<em>DELL戴尔Ins 15MR-7528SS 15英寸 银色 笔记本</em>
</div>
<div class="price">
<strong>
<em>¥</em>
<i>4088.00</i>
</strong>
</div>
<div class="commit">
<i class="command">已有700人评价</i>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 底部栏位 -->
<!--页面底部-->
<div class="clearfix footer">
<div class="py-container">
<div class="footlink">
<div class="Mod-service">
<ul class="Mod-Service-list">
<li class="grid-service-item intro intro1">
<i class="serivce-item fl"></i>
<div class="service-text">
<h4>正品保障</h4>
<p>正品保障,提供发票</p>
</div>
</li>
<li class="grid-service-item intro intro2">
<i class="serivce-item fl"></i>
<div class="service-text">
<h4>正品保障</h4>
<p>正品保障,提供发票</p>
</div>
</li>
<li class="grid-service-item intro intro3">
<i class="serivce-item fl"></i>
<div class="service-text">
<h4>正品保障</h4>
<p>正品保障,提供发票</p>
</div>
</li>
<li class="grid-service-item intro intro4">
<i class="serivce-item fl"></i>
<div class="service-text">
<h4>正品保障</h4>
<p>正品保障,提供发票</p>
</div>
</li>
<li class="grid-service-item intro intro5">
<i class="serivce-item fl"></i>
<div class="service-text">
<h4>正品保障</h4>
<p>正品保障,提供发票</p>
</div>
</li>
</ul>
</div>
<div class="clearfix Mod-list">
<div class="yui3-g">
<div class="yui3-u-1-6">
<h4>购物指南</h4>
<ul class="unstyled">
<li>购物流程</li>
<li>会员介绍</li>
<li>生活旅行/团购</li>
<li>常见问题</li>
<li>购物指南</li>
</ul>
</div>
<div class="yui3-u-1-6">
<h4>配送方式</h4>
<ul class="unstyled">
<li>上门自提</li>
<li>211限时达</li>
<li>配送服务查询</li>
<li>配送费收取标准</li>
<li>海外配送</li>
</ul>
</div>
<div class="yui3-u-1-6">
<h4>支付方式</h4>
<ul class="unstyled">
<li>货到付款</li>
<li>在线支付</li>
<li>分期付款</li>
<li>邮局汇款</li>
<li>公司转账</li>
</ul>
</div>
<div class="yui3-u-1-6">
<h4>售后服务</h4>
<ul class="unstyled">
<li>售后政策</li>
<li>价格保护</li>
<li>退款说明</li>
<li>返修/退换货</li>
<li>取消订单</li>
</ul>
</div>
<div class="yui3-u-1-6">
<h4>特色服务</h4>
<ul class="unstyled">
<li>夺宝岛</li>
<li>DIY装机</li>
<li>延保服务</li>
<li>泽易购E卡</li>
<li>泽易购通信</li>
</ul>
</div>
<div class="yui3-u-1-6">
<h4>帮助中心</h4>
<img src="/static/user/img/wx_cz.jpg">
</div>
</div>
</div>
<div class="Mod-copyright">
<ul class="helpLink">
<li>关于我们<span class="space"></span></li>
<li>联系我们<span class="space"></span></li>
<li>关于我们<span class="space"></span></li>
<li>商家入驻<span class="space"></span></li>
<li>营销中心<span class="space"></span></li>
<li>友情链接<span class="space"></span></li>
<li>关于我们<span class="space"></span></li>
<li>营销中心<span class="space"></span></li>
<li>友情链接<span class="space"></span></li>
<li>关于我们</li>
</ul>
<p>地址:深圳市大冲国际</p>
</div>
</div>
</div>
</div>
<!--页面底部END-->
undefined
</html>
注意: 上述代码的156行的用户登录名的获取方式。
4.6 查看运行效果:
附录一:
Nginx服务器配置: /mydata/nginx/conf/conf.d/zeyigou.conf
#运营商管理后台
#server {
# listen 80;
# server_name manager.zeyigou.com;
# location / {
# proxy_pass http://192.168.56.1:8081/renren-fast/;
# proxy_set_header Host $host;
# }
# location /manager {
# proxy_pass http://192.168.56.1:9001/manager/;
# proxy_set_header Host $host;
# }
#}
#商家管理后台
#server {
# listen 80;
# server_name shop.zeyigou.com;
# location / {
# proxy_pass http://192.168.56.1:8082/renren-fast/;
# proxy_set_header Host $host;
# }
# location /shop {
# proxy_pass http://192.168.56.1:9002/shop/;
# proxy_set_header Host $host;
# }
#}
#门户首页
#server {
# listen 80;
# server_name portal.zeyigou.com;
# location / {
# proxy_pass http://192.168.56.1:9001;
# proxy_set_header Host $host;
# }
# location /static/ {
# root /usr/share/nginx/html;
# }
#
#}
#用户搜索
#server {
# listen 80;
# server_name search.zeyigou.com;
#
# location / {
# proxy_pass http://192.168.56.1:9003;
# proxy_set_header Host $host;
# }
# location /static/ {
# root /usr/share/nginx/html;
# }
#
#}
#用户管理
server {
listen 80;
server_name user.zeyigou.com;
location / {
proxy_pass http://192.168.56.1:9005;
proxy_set_header Host $host;
}
location /static/ {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name manager.zeyigou.com;
location / {
proxy_pass http://192.168.56.1:9001;
proxy_set_header Host $host;
}
location /static/ {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name *.zeyigou.com zeyigou.com;
location / {
proxy_pass http://192.168.56.1:88;
proxy_set_header Host $host;
}
location /static/ {
root /usr/share/nginx/html;
}
}
附录二:
1、添加依赖:
<!--1. 添加cas客户端的依赖-->
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.2.0-GA</version>
</dependency>
2、在application.properties文件中添加如下:
cas.server-url-prefix=http://cas.zeyigou.com:8080/cas
cas.server-login-url=http://cas.zeyigou.com:8080/cas/login
cas.client-host-url=http://manager.zeyigou.com/
cas-ignore-pattern=(/manager/brand/findAll)|(/file/*)
说明:
cas-ignore-pattern: 代表放行的地址
3、添加如下配置类:
@Configuration
@EnableCasClient
public class CasUrlPatternConfig {
@Value("${cas.server-login-url}")
private String casServerLoginUrl;
@Value("${cas.client-host-url}")
private String casClientHostUrl;
@Value("${cas-ignore-pattern}")
private String casIgnorePattern;
/**
* description:授权过滤器
* ignoreUrlPatternType 使用CAS现成的正则表达式过滤策略
*/
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new AuthenticationFilter());
registration.addUrlPatterns("/*");
Map<String,String> initParameters = new HashMap<String, String>();
initParameters.put("casServerLoginUrl", casServerLoginUrl);
initParameters.put("serverName", casClientHostUrl);
//配置文件中设置要过滤拦截的路径
initParameters.put("ignorePattern", casIgnorePattern);
initParameters.put("ignoreUrlPatternType", "org.jasig.cas.client.authentication.RegexUrlPatternMatcherStrategy");
registration.setInitParameters(initParameters);
registration.setOrder(1);
return registration;
}
}