一、Cas介绍:

1.1 单点登录介绍:

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

image.png

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 最基本的协议过程:
image.png
SSO单点登录访问流程主要有以下步骤:

  1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
  2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。
  3. 用户认证:用户身份认证。
  4. 发放票据:SSO服务器会产生一个随机的Service Ticket。
  5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
  6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

    1.3 CAS官方架构图:

    image.png

    1.3.1 理解架构图:

    在 CAS 的整个登录过程中,有三个重要的概念,这里我先来和大家捋一捋。

  7. TGT:TGT 全称叫做 Ticket Granting Ticket,这个相当于我们平时所见到的 HttpSession 的作用,用户登录成功后,用户的基本信息,如用户名、登录有效期等信息,都将存储在此。

  8. TGC:TGC 全称叫做 Ticket Granting Cookie,TGC 以 Cookie 的形式保存在浏览器中,根据 TGC 可以帮助用户找到对应的 TGT,所以这个 TGC 有点类似与会话 ID。
  9. 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时序图
    640.png
    这张图其实画的比较清楚了,我再用文字和大家解释下:
    术语:应用1、应用2 分别表示被保护的应用。
    1. 用户通过浏览器访问应用1,应用1 发现用户没有登录,于是返回 302,并且携带上一个 service 参数,让用户去 CAS Server 上登录。
    2. 浏览器自动重定向到 CAS Server 上,CAS Server 获取用户 Cookie 中携带的 TGC,去校验用户是否已经登录,如果已经登录,则完成身份校验(此时 CAS Server 可以根据用户的 TGC 找到 TGT,进而获取用户的信息);如果未登录,则重定向到 CAS Server 的登录页面,用户输入用户名/密码,CAS Server 会生成 TGT,并且根据 TGT 签发一个 ST,再将 TGC 放在用户的 Cookie 中,完成身份校验。
    3. CAS Server 完成身份校验之后,会将 ST 拼接在 service 中,返回 302,浏览器将首先将 TGC 存在 Cookie 中,然后根据 302 的指示,携带上 ST 重定向到应用1。
    4. 应用1 收到浏览器传来的 ST 之后,拿去 CAS Server 上校验,去判断用户的登录状态,如果用户登录合法,CAS Server 就会返回用户信息给 应用1。
    5. 浏览器再去访问应用2,应用2 发现用户未登录,重定向到 CAS Server。
    6. CAS Server 发现此时用户实际上已经登录了,于是又重定向回应用2,同时携带上 ST。
    7. 应用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
image.png

2.2 配置并生成cas-server的war包:

2.2.1 执行命令:build.cmd run

说明:此时才有:
image.png
注意:上面的不需要执行命令,只需要将项目在右侧的maven视图中导入(就是引入pom.xml文件)就会有overlays这个文件夹!

2.2.2 创建src目录及src/main/java和src/resources

image.png
说明:
此时要复制overlays/WEB-INF/classes/application.properties这个文件到当前的resources目录下并修改。
application.properties文件:

  1. ##
  2. # CAS Server Context Configuration
  3. #
  4. server.context-path=/cas
  5. server.port=8080
  6. #取消支持https
  7. #server.ssl.key-store=file:/etc/cas/thekeystore
  8. #server.ssl.key-store-password=changeit
  9. #server.ssl.key-password=changeit
  10. server.max-http-header-size=2097152
  11. server.use-forward-headers=true
  12. server.connection-timeout=20000
  13. server.error.include-stacktrace=ALWAYS
  14. server.compression.enabled=true
  15. server.compression.mime-types=application/javascript,application/json,application/xml,text/html,text/xml,text/plain
  16. server.tomcat.max-http-post-size=2097152
  17. server.tomcat.basedir=build/tomcat
  18. server.tomcat.accesslog.enabled=true
  19. server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
  20. server.tomcat.accesslog.suffix=.log
  21. server.tomcat.min-spare-threads=10
  22. server.tomcat.max-threads=200
  23. server.tomcat.port-header=X-Forwarded-Port
  24. server.tomcat.protocol-header=X-Forwarded-Proto
  25. server.tomcat.protocol-header-https-value=https
  26. server.tomcat.remote-ip-header=X-FORWARDED-FOR
  27. server.tomcat.uri-encoding=UTF-8
  28. spring.http.encoding.charset=UTF-8
  29. spring.http.encoding.enabled=true
  30. spring.http.encoding.force=true
  31. ##
  32. # CAS Cloud Bus Configuration
  33. #
  34. spring.cloud.bus.enabled=false
  35. # Indicates that systemPropertiesOverride can be used.
  36. # Set to false to prevent users from changing the default accidentally. Default true.
  37. spring.cloud.config.allow-override=true
  38. # External properties should override system properties.
  39. spring.cloud.config.override-system-properties=false
  40. # When allowOverride is true, external properties should take lowest priority, and not override any
  41. # existing property sources (including local config files).
  42. spring.cloud.config.override-none=false
  43. # spring.cloud.bus.refresh.enabled=true
  44. # spring.cloud.bus.env.enabled=true
  45. # spring.cloud.bus.destination=CasCloudBus
  46. # spring.cloud.bus.ack.enabled=true
  47. endpoints.enabled=false
  48. endpoints.sensitive=true
  49. endpoints.restart.enabled=false
  50. endpoints.shutdown.enabled=false
  51. # Control the security of the management/actuator endpoints
  52. # The 'enabled' flag below here controls the rendering of details for the health endpoint amongst other things.
  53. management.security.enabled=true
  54. management.security.roles=ACTUATOR,ADMIN
  55. management.security.sessions=if_required
  56. management.context-path=/status
  57. management.add-application-context-header=false
  58. # Define a CAS-specific "WARN" status code and its order
  59. management.health.status.order=WARN, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
  60. # Control the security of the management/actuator endpoints
  61. # With basic authentication, assuming Spring Security and/or relevant modules are on the classpath.
  62. security.basic.authorize-mode=role
  63. security.basic.path=/cas/status/**
  64. # security.basic.enabled=true
  65. # security.user.name=casuser
  66. # security.user.password=
  67. ##
  68. # CAS Web Application Session Configuration
  69. #
  70. server.session.timeout=300
  71. server.session.cookie.http-only=true
  72. server.session.tracking-modes=COOKIE
  73. ##
  74. # CAS Thymeleaf View Configuration
  75. #
  76. spring.thymeleaf.encoding=UTF-8
  77. spring.thymeleaf.cache=true
  78. spring.thymeleaf.mode=HTML
  79. spring.thymeleaf.template-resolver-order=100
  80. ##
  81. # CAS Log4j Configuration
  82. #
  83. # logging.config=file:/etc/cas/log4j2.xml
  84. server.context-parameters.isLog4jAutoInitializationDisabled=true
  85. ##
  86. # CAS AspectJ Configuration
  87. #
  88. spring.aop.auto=true
  89. spring.aop.proxy-target-class=true
  90. ##
  91. # CAS Authentication Credentials
  92. #
  93. #cas.authn.accept.users=casuser::Mellon
  94. cas.authn.accept.users=hbxfwf::123
  95. #去掉安全加密机制
  96. cas.tgc.secure=false
  97. cas.serviceRegistry.initFromJson=true
  98. #配置加密策略(使用的是bcrypassendcoder 加密)
  99. cas.authn.jdbc.query[0].passwordEncoder.type=org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
  100. cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
  101. #cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
  102. #下面支持从数据库查询用户,验证用户名及密码
  103. cas.authn.jdbc.query[0].url=jdbc:mysql://192.168.56.10:3306/zeyigoudb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
  104. cas.authn.jdbc.query[0].user=root
  105. cas.authn.jdbc.query[0].password=123
  106. cas.authn.jdbc.query[0].sql=select * from tb_user where username=?
  107. cas.authn.jdbc.query[0].fieldPassword=password
  108. cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver

2.2.3 修改overlays/WEB-INF/classes/service/HTTPSandIMAPS-10000001.json文件

  1. {
  2. "@class" : "org.apereo.cas.services.RegexRegisteredService",
  3. "serviceId" : "^(https|http|imaps)://.*",
  4. "name" : "HTTPS and IMAPS",
  5. "id" : 10000001,
  6. "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
  7. "evaluationOrder" : 10000
  8. }

说明: 添加了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中添加域名映射:

image.png

2.2.7 最终服务端运行效果如下:

image.png
image.png
image.png

第二部分:[客户端配置与使用]

::客户端配置前的准备工作::

2.1 需要在cas-server配置http协议(tomcat/webapps/cas/WEB-INF/classes/services目录)

编辑HTTPSandIMAPS-10000001.json

  1. {
  2. "@class" : "org.apereo.cas.services.RegexRegisteredService",
  3. "serviceId" : "^(https|http|imaps)://.*",
  4. "name" : "HTTPS and IMAPS",
  5. "id" : 10000001,
  6. "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
  7. "evaluationOrder" : 10000
  8. }

说明: 在serviceId字段添加http协议支持。

如果不配置,就出现下图提示:
image.png
::客户端创建并配置::

2.2 创建cas-client1与cas-client2两个工程:

2.2.1 添加依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-security</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.security</groupId>
  12. <artifactId>spring-security-cas</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-devtools</artifactId>
  17. <scope>runtime</scope>
  18. <optional>true</optional>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.projectlombok</groupId>
  22. <artifactId>lombok</artifactId>
  23. <optional>true</optional>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.security</groupId>
  32. <artifactId>spring-security-test</artifactId>
  33. <scope>test</scope>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  38. </dependency>
  39. </dependencies>
  40. <build>
  41. <plugins>
  42. <plugin>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-maven-plugin</artifactId>
  45. <configuration>
  46. <excludes>
  47. <exclude>
  48. <groupId>org.projectlombok</groupId>
  49. <artifactId>lombok</artifactId>
  50. </exclude>
  51. </excludes>
  52. </configuration>
  53. </plugin>
  54. </plugins>
  55. </build>

2.2.2 在application.properties文件中添加:

  1. server.port=8081
  2. #cas服务端配置
  3. cas.server.prefix=http://cas.zeyigou.com:8080/cas
  4. cas.server.login=${cas.server.prefix}/login
  5. cas.server.logout=${cas.server.prefix}/logout
  6. #cas客户端配置
  7. cas.client.prefix=http://client1.cas.zeyigou.com:8081
  8. cas.client.login=${cas.client.prefix}/login/cas
  9. cas.client.logoutRelative=/logout/cas
  10. cas.client.logout=${cas.client.prefix}${cas.client.logoutRelative}
  11. #取消模板的缓存
  12. spring.thymeleaf.cache=false

2.2.3 在config包下添加一系列的配置文件:

  1. /**
  2. * 功能: cas与springsecurity整合的配置类
  3. * 参数:
  4. * 返回值:
  5. * 时间: 2021/8/11 16:53
  6. */
  7. @Configuration
  8. public class CasSecurityConfig {
  9. @Autowired
  10. CASClientProperties casClientProperties;
  11. @Autowired
  12. CASServerProperties casServerProperties;
  13. @Autowired
  14. UserDetailsService userDetailService;
  15. /**
  16. * 功能: 配置客户端登录成功后的跳转页面
  17. * 参数:
  18. * 返回值: org.springframework.security.cas.ServiceProperties
  19. * 时间: 2021/8/11 17:00
  20. */
  21. @Bean
  22. ServiceProperties serviceProperties() {
  23. ServiceProperties serviceProperties = new ServiceProperties();
  24. serviceProperties.setService(casClientProperties.getLogin());
  25. return serviceProperties;
  26. }
  27. /**
  28. * 功能: 配置验证(cas-server进行验证)的入口
  29. * 参数:
  30. * 返回值: org.springframework.security.web.AuthenticationEntryPoint
  31. * 时间: 2021/8/11 16:59
  32. */
  33. @Bean
  34. @Primary
  35. AuthenticationEntryPoint authenticationEntryPoint() {
  36. CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
  37. entryPoint.setLoginUrl(casServerProperties.getLogin());
  38. entryPoint.setServiceProperties(serviceProperties());
  39. return entryPoint;
  40. }
  41. /**
  42. * 功能: 让cas-server来校验票据
  43. * 参数:
  44. * 返回值: org.jasig.cas.client.validation.TicketValidator
  45. * 时间: 2021/8/11 17:02
  46. */
  47. @Bean
  48. TicketValidator ticketValidator() {
  49. return new Cas20ProxyTicketValidator(casServerProperties.getPrefix());
  50. }
  51. /**
  52. * 功能: 设置cas认证提供者
  53. * 参数:
  54. * 返回值: org.springframework.security.cas.authentication.CasAuthenticationProvider
  55. * 时间: 2021/8/11 17:04
  56. */
  57. @Bean
  58. CasAuthenticationProvider casAuthenticationProvider() {
  59. CasAuthenticationProvider provider = new CasAuthenticationProvider();
  60. provider.setServiceProperties(serviceProperties());
  61. provider.setTicketValidator(ticketValidator());
  62. provider.setUserDetailsService(userDetailService);
  63. provider.setKey("hbxfwf");
  64. return provider;
  65. }
  66. /**
  67. * 功能: cas认证过滤器:
  68. * 作用:将请求过滤,拦截后交由CasAuthenticationProvider处理
  69. * 参数:
  70. * 返回值: org.springframework.security.cas.web.CasAuthenticationFilter
  71. * 时间: 2021/8/11 17:04
  72. */
  73. @Bean
  74. CasAuthenticationFilter casAuthenticationFilter(AuthenticationProvider authenticationProvider) {
  75. CasAuthenticationFilter filter = new CasAuthenticationFilter();
  76. filter.setServiceProperties(serviceProperties());
  77. filter.setAuthenticationManager(new ProviderManager(authenticationProvider));
  78. return filter;
  79. }
  80. /**
  81. * 功能: 通知服务器发出注销请求
  82. * 参数:
  83. * 返回值: org.jasig.cas.client.session.SingleSignOutFilter
  84. * 时间: 2021/8/11 17:06
  85. */
  86. @Bean
  87. SingleSignOutFilter singleSignOutFilter() {
  88. SingleSignOutFilter sign = new SingleSignOutFilter();
  89. sign.setIgnoreInitConfiguration(true);
  90. return sign;
  91. }
  92. /**
  93. * 功能: 将注销请求求转发到服务端
  94. * 参数:
  95. * 返回值: org.springframework.security.web.authentication.logout.LogoutFilter
  96. * 时间: 2021/8/11 17:07
  97. */
  98. @Bean
  99. LogoutFilter logoutFilter() {
  100. LogoutFilter filter = new LogoutFilter(casServerProperties.getLogout(), new SecurityContextLogoutHandler());
  101. filter.setFilterProcessesUrl(casClientProperties.getLogoutRelative());
  102. return filter;
  103. }
  104. }
  1. /**
  2. * 功能: 配置springSecurity
  3. * 参数:
  4. * 返回值:
  5. * 时间: 2021/8/11 17:07
  6. */
  7. @Configuration
  8. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  9. @Autowired
  10. AuthenticationEntryPoint authenticationEntryPoint;
  11. @Autowired
  12. AuthenticationProvider authenticationProvider;
  13. @Autowired
  14. SingleSignOutFilter singleSignOutFilter;
  15. @Autowired
  16. LogoutFilter logoutFilter;
  17. @Autowired
  18. CasAuthenticationFilter casAuthenticationFilter;
  19. /**
  20. * 功能: 配置认证提供者
  21. * 参数:
  22. * 返回值: void
  23. * 时间: 2021/8/11 17:08
  24. */
  25. @Override
  26. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  27. auth.authenticationProvider(authenticationProvider);
  28. }
  29. @Override
  30. protected void configure(HttpSecurity http) throws Exception {
  31. http.authorizeRequests().antMatchers("/user/**")
  32. .hasRole("user")
  33. .antMatchers("/login/cas").permitAll()
  34. .anyRequest().authenticated()
  35. .and()
  36. .exceptionHandling()
  37. .authenticationEntryPoint(authenticationEntryPoint)
  38. .and()
  39. .addFilter(casAuthenticationFilter)
  40. .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
  41. .addFilterBefore(logoutFilter, LogoutFilter.class);
  42. }
  43. }
  1. @ConfigurationProperties(prefix = "cas.client")
  2. @Data
  3. public class CASClientProperties {
  4. private String prefix;
  5. private String login;
  6. private String logoutRelative;
  7. private String logout;
  8. }
  1. @ConfigurationProperties(prefix = "cas.server")
  2. @Data
  3. public class CASServerProperties {
  4. private String prefix;
  5. private String login;
  6. private String logout;
  7. }

一、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 在启动类中添加注解:

  1. @SpringBootApplication
  2. @ConfigurationPropertiesScan
  3. public class CasClient1Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(CasClient1Application.class, args);
  6. }
  7. }

2.3 客户端的配置同上,只是将关于客户端2的端口改为8082

cas-client2客户端的application.properteis文件:

  1. server.port=8082
  2. cas.server.prefix=http://cas.zeyigou.com:8080/cas
  3. cas.server.login=${cas.server.prefix}/login
  4. cas.server.logout=${cas.server.prefix}/logout
  5. cas.client.prefix=http://client2.cas.zeyigou.com:8082
  6. cas.client.login=${cas.client.prefix}/login/cas
  7. cas.client.logoutRelative=/logout/cas
  8. cas.client.logout=${cas.client.prefix}${cas.client.logoutRelative}
  9. spring.thymeleaf.cache=false

2.4 在面的两个客户端的resources/templates/添加hello.html文件:

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <span th:text="${#request.remoteUser}"></span>
  9. </body>
  10. </html>

2.5 运行效果如下:

image.png
image.png
image.png

第三部分:修改cas登录的界面:

3.1 修改登录界面的两种实现方式:

方式 一:直接修改/cas/WEB-INF/classes/templates/casLoginView.html [ 不建议 ]
image.png
方式二:定义主题来修改登录页面
第一步:复制主题用到的资源:
① 在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文件

  1. userLogin.css.style=/themes/userLogin/css/webbase.css
  2. userLogin.css.ps=/themes/userLogin/css/pages-shoplogin.css
  3. userLogin.js.jq=/themes/userLogin/js/plugins/jquery/jquery.min.js
  4. userLogin.js.jems=/themes/userLogin/js/plugins/jquery.easing/jquery.easing.min.js
  5. userLogin.js.sm=/themes/userLogin/js/plugins/sui/sui.min.js
  6. userLogin.js.jp=/themes/userLogin/js/plugins/jquery-placeholder/jquery.placeholder.min.js
  7. userLogin.js.sl=/themes/userLogin/js/pages/shoplogin.js
  8. userLogin.img.qq=/themes/userLogin/img/qq.png
  9. userLogin.img.sina=/themes/userLogin/img/sina.png
  10. userLogin.img.ali=/themes/userLogin/img/ali.png
  11. userLogin.img.weixin=/themes/userLogin/img/weixin.png

第四步:修改userLogin/casLoginView.html中的样式、js、img的引用,最终内容如下:

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE">
  6. <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
  7. <title>泽易购,欢迎登录</title>
  8. <link rel="icon" href="assets/img/favicon.ico">
  9. <link rel="stylesheet" th:href="@{${#themes.code('userLogin.css.style')}}">
  10. <link rel="stylesheet" type="text/css" th:href="@{${#themes.code('userLogin.css.ps')}}"/>
  11. </head>
  12. <body>
  13. <div class="login-box">
  14. <!--head-->
  15. <div class="py-container logoArea">
  16. <a href="" class="logo"></a>
  17. </div>
  18. <!--loginArea-->
  19. <div class="loginArea">
  20. <div class="login ">
  21. <div class="py-container">
  22. <div class="loginform">
  23. <ul class="sui-nav nav-tabs tab-wraped">
  24. <li>
  25. <a href="#index" data-toggle="tab">
  26. <h3>扫描登录</h3>
  27. </a>
  28. </li>
  29. <li class="active">
  30. <a href="#profile" data-toggle="tab">
  31. <h3>账户登录</h3>
  32. </a>
  33. </li>
  34. </ul>
  35. <div class="tab-content tab-wraped">
  36. <div id="index" class="tab-pane">
  37. <p>二维码登录,暂为官网二维码</p>
  38. <img src="/cas/themes/userLogin/img/wx_cz.jpg" />
  39. </div>
  40. <div id="profile" class="tab-pane active">
  41. <form class="sui-form" method="post" th:object="${credential}">
  42. <div class="input-prepend"><span class="add-on loginname"></span>
  43. <input type="text" th:field="*{username}" th:accesskey="#{screen.welcome.label.netid.accesskey}" id="username" placeholder="邮箱/用户名/手机号" class="span2 input-xfat">
  44. </div>
  45. <div class="input-prepend"><span class="add-on loginpwd"></span>
  46. <input type="password" id="password" th:accesskey="#{screen.welcome.label.password.accesskey}" th:field="*{password}" placeholder="请输入密码" class="span2 input-xfat">
  47. </div>
  48. <div class="setting">
  49. <label class="checkbox inline">
  50. <input name="m1" type="checkbox" value="2" checked="">自动登录</label>
  51. <span class="forget">忘记密码?</span>
  52. </div>
  53. <div th:if="${#fields.hasErrors('*')}">
  54. <span th:each="err : ${#fields.errors('*')}" th:utext="${err}"/>
  55. </div>
  56. <input type="hidden" name="execution" th:value="${flowExecutionKey}"/>
  57. <input type="hidden" name="_eventId" value="submit"/>
  58. <input type="hidden" name="geolocation"/>
  59. <div class="logined">
  60. <input type="submit" class="sui-btn btn-block btn-xlarge btn-danger" value="登录">
  61. </div>
  62. </form>
  63. <div class="otherlogin">
  64. <div class="types">
  65. <ul>
  66. <li><img th:src="@{${#themes.code('userLogin.img.qq')}}" width="35px" height="35px" /></li>
  67. <li><img th:src="@{${#themes.code('userLogin.img.sina')}}"/></li>
  68. <li><img th:src="@{${#themes.code('userLogin.img.ali')}}" /></li>
  69. <li><img th:src="@{${#themes.code('userLogin.img.weixin')}}" /></li>
  70. </ul>
  71. </div>
  72. <span class="register"><a href="register.html" target="_blank">立即注册</a></span>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. <!--foot-->
  81. <div class="py-container copyright">
  82. <ul>
  83. <li>关于我们</li>
  84. <li>联系我们</li>
  85. <li>联系客服</li>
  86. <li>商家入驻</li>
  87. <li>营销中心</li>
  88. <li>手机泽易购</li>
  89. <li>销售联盟</li>
  90. <li>泽易购社区</li>
  91. </ul>
  92. <p>地址:深圳市大冲国际</p>
  93. </div>
  94. </div>
  95. </div>
  96. <!-- <script th:src="@{${#themes.code('userLogin.js.jq')}}"></script>
  97. <script th:src="@{${#themes.code('userLogin.js.jems')}}"></script>
  98. <script th:src="@{${#themes.code('userLogin.js.sm')}}"></script>
  99. <script th:src="@{${#themes.code('userLogin.js.jp')}}"></script>
  100. <script th:src="@{${#themes.code('userLogin.js.sl')}}"></script> -->
  101. </body>
  102. </html>

补充: ① 页面中的表单的内容的定义请参考cas\WEB-INF\classes\templates\fragments\loginform.html文件。

3.2 修改默认主题:

在cas/WEB-INF/classes目录下的application.properties文件中添加如下内容:

  1. #修改全局主题
  2. cas.theme.defaultThemeName=userLogin

第四部分:将用户中心作为cas的客户端

4.1 在zyg-user-web中引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.zelin</groupId>
  8. <artifactId>zyg-user-interface</artifactId>
  9. <version>2.0</version>
  10. </dependency>
  11. <!--1.添加thymeleaf依赖-->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  15. </dependency>
  16. <!--2.添加devtools-->
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-devtools</artifactId>
  20. <optional>true</optional>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.zelin</groupId>
  24. <artifactId>zyg-dao</artifactId>
  25. <version>2.0</version>
  26. </dependency>
  27. <!--1. 引入cas单点登录的依赖【这里是本次引入的依赖】-->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-security</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.security</groupId>
  34. <artifactId>spring-security-cas</artifactId>
  35. </dependency>
  36. </dependencies>

4.2 在zyg-user-web中添加第二部分2.2.3中相关的配置:

4.3 添加application.properties文件,内容如下:

  1. server.port=9005
  2. logging.level.com.zelin=debug
  3. spring.thymeleaf.cache=false
  4. spring.dubbo.registry.address=zookeeper://192.168.56.10:2181
  5. spring.dubbo.base-package=com.zelin.user.web
  6. spring.dubbo.application.name=zyg-user-web
  7. cas.server.prefix=http://cas.zeyigou.com:8080/cas
  8. cas.server.login=${cas.server.prefix}/login
  9. cas.server.logout=${cas.server.prefix}/logout
  10. cas.client.prefix=http://user.zeyigou.com
  11. cas.client.login=${cas.client.prefix}/login/cas
  12. cas.client.logoutRelative=/logout/cas
  13. 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处理器:

  1. //4. 到达用户中心主页
  2. @GetMapping("/index")
  3. public String index(Model model){
  4. //4.1 取得用户名
  5. String name = SecurityContextHolder.getContext().getAuthentication().getName();
  6. //4.2 将用户名放到model中
  7. model.addAttribute("name",name);
  8. //4.3 返回视图
  9. return "index";
  10. }

4.5 将项目资源/前台/home-index.html复制到templates下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE">
  6. <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
  7. <title>我的订单</title>
  8. <link rel="icon" href="/static/user/assets/img/favicon.ico">
  9. <link rel="stylesheet" type="text/css" href="/static/user/css/webbase.css" />
  10. <link rel="stylesheet" type="text/css" href="/static/user/css/pages-seckillOrder.css" />
  11. </head>
  12. <body>
  13. <!-- 头部栏位 -->
  14. <!--页面顶部-->
  15. <div id="nav-bottom">
  16. <!--顶部-->
  17. <div class="nav-top">
  18. <div class="top">
  19. <div class="py-container">
  20. <div class="shortcut">
  21. <ul class="fl">
  22. <li class="f-item">泽易购欢迎您!</li>
  23. <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>
  24. </ul>
  25. <ul class="fr">
  26. <li class="f-item">我的订单</li>
  27. <li class="f-item space"></li>
  28. <li class="f-item"><a href="/static/user/home.html" target="_blank">我的泽易购</a></li>
  29. <li class="f-item space"></li>
  30. <li class="f-item">泽易购会员</li>
  31. <li class="f-item space"></li>
  32. <li class="f-item">企业采购</li>
  33. <li class="f-item space"></li>
  34. <li class="f-item">关注泽易购</li>
  35. <li class="f-item space"></li>
  36. <li class="f-item" id="service">
  37. <span>客户服务</span>
  38. <ul class="service">
  39. <li><a href="/static/user/cooperation.html" target="_blank">合作招商</a></li>
  40. <li><a href="/static/user/shoplogin.html" target="_blank">商家后台</a></li>
  41. <li><a href="/static/user/cooperation.html" target="_blank">合作招商</a></li>
  42. <li><a href="/static/user/#">商家后台</a></li>
  43. </ul>
  44. </li>
  45. <li class="f-item space"></li>
  46. <li class="f-item">网站导航</li>
  47. </ul>
  48. </div>
  49. </div>
  50. </div>
  51. <!--头部-->
  52. <div class="header">
  53. <div class="py-container">
  54. <div class="yui3-g Logo">
  55. <div class="yui3-u Left logoArea">
  56. <a class="logo-bd" title="泽易购" href="/static/user/JD-index.html" target="_blank"></a>
  57. </div>
  58. <div class="yui3-u Center searchArea">
  59. <div class="search">
  60. <form action="" class="sui-form form-inline">
  61. <!--searchAutoComplete-->
  62. <div class="input-append">
  63. <input id="autocomplete" type="text" class="input-error input-xxlarge" />
  64. <button class="sui-btn btn-xlarge btn-danger" type="button">搜索</button>
  65. </div>
  66. </form>
  67. </div>
  68. <div class="hotwords">
  69. <ul>
  70. <li class="f-item">泽易购首发</li>
  71. <li class="f-item">亿元优惠</li>
  72. <li class="f-item">9.9元团购</li>
  73. <li class="f-item">每满99减30</li>
  74. <li class="f-item">亿元优惠</li>
  75. <li class="f-item">9.9元团购</li>
  76. <li class="f-item">办公用品</li>
  77. </ul>
  78. </div>
  79. </div>
  80. <div class="yui3-u Right shopArea">
  81. <div class="fr shopcar">
  82. <div class="show-shopcar" id="shopcar">
  83. <span class="car"></span>
  84. <a class="sui-btn btn-default btn-xlarge" href="/static/user/cart.html" target="_blank">
  85. <span>我的购物车</span>
  86. <i class="shopnum">0</i>
  87. </a>
  88. <div class="clearfix shopcarlist" id="shopcarlist" style="display:none">
  89. <p>"啊哦,你的购物车还没有商品哦!"</p>
  90. <p>"啊哦,你的购物车还没有商品哦!"</p>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. <div class="yui3-g NavList">
  97. <div class="yui3-u Left all-sort">
  98. <h4>全部商品分类</h4>
  99. </div>
  100. <div class="yui3-u Center navArea">
  101. <ul class="nav">
  102. <li class="f-item">服装城</li>
  103. <li class="f-item">美妆馆</li>
  104. <li class="f-item">品优超市</li>
  105. <li class="f-item">全球购</li>
  106. <li class="f-item">闪购</li>
  107. <li class="f-item">团购</li>
  108. <li class="f-item">有趣</li>
  109. <li class="f-item"><a href="/static/user/seckill-index.html" target="_blank">秒杀</a></li>
  110. </ul>
  111. </div>
  112. <div class="yui3-u Right"></div>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. <script type="text/javascript" src="/static/user/js/plugins/jquery/jquery.min.js"></script>
  119. <script type="text/javascript">
  120. $(function(){
  121. $("#service").hover(function(){
  122. $(".service").show();
  123. },function(){
  124. $(".service").hide();
  125. });
  126. $("#shopcar").hover(function(){
  127. $("#shopcarlist").show();
  128. },function(){
  129. $("#shopcarlist").hide();
  130. });
  131. })
  132. </script>
  133. <script type="text/javascript" src="/static/user/js/plugins/jquery.easing/jquery.easing.min.js"></script>
  134. <script type="text/javascript" src="/static/user/js/plugins/sui/sui.min.js"></script>
  135. <script type="text/javascript" src="/static/user/js/plugins/jquery-placeholder/jquery.placeholder.min.js"></script>
  136. <script type="text/javascript" src="/static/user/js/widget/nav.js"></script>
  137. </body>
  138. <!--header-->
  139. <div id="account">
  140. <div class="py-container">
  141. <div class="yui3-g home">
  142. <!--左侧列表-->
  143. <div class="yui3-u-1-6 list">
  144. <div class="person-info">
  145. <div class="person-photo"><img src="/static/user/img/_/photo.png" alt=""></div>
  146. <div class="person-account">
  147. <span class="name">[[${name}]]</span>
  148. <span class="safe"><a href="/static/user/#">退出登录 </a></span>
  149. </div>
  150. <div class="clearfix"></div>
  151. </div>
  152. <div class="list-items">
  153. <dl>
  154. <dt><i>·</i> 订单中心</dt>
  155. <dd ><a href="/static/user/home-index.html" class="list-active" >我的订单</a></dd>
  156. <dd><a href="/static/user/home-order-pay.html" >待付款</a></dd>
  157. <dd><a href="/static/user/home-order-send.html" >待发货</a></dd>
  158. <dd><a href="/static/user/home-order-receive.html" >待收货</a></dd>
  159. <dd><a href="/static/user/home-order-evaluate.html" >待评价</a></dd>
  160. </dl>
  161. <dl>
  162. <dt><i>·</i> 我的中心</dt>
  163. <dd><a href="/static/user/home-person-collect.html">我的收藏</a></dd>
  164. <dd><a href="/static/user/home-person-footmark.html">我的足迹</a></dd>
  165. </dl>
  166. <dl>
  167. <dt><i>·</i> 物流消息</dt>
  168. </dl>
  169. <dl>
  170. <dt><i>·</i> 设置</dt>
  171. <dd><a href="/static/user/home-setting-info.html">个人信息</a></dd>
  172. <dd><a href="/static/user/home-setting-address.html" >地址管理</a></dd>
  173. <dd><a href="/static/user/home-setting-safe.html" >安全管理</a></dd>
  174. </dl>
  175. </div>
  176. </div>
  177. <!--右侧主内容-->
  178. <div class="yui3-u-5-6 order-pay">
  179. <div class="body">
  180. <div class="table-title">
  181. <table class="sui-table order-table">
  182. <tr>
  183. <thead>
  184. <th width="35%">宝贝</th>
  185. <th width="5%">单价</th>
  186. <th width="5%">数量</th>
  187. <th width="8%">商品操作</th>
  188. <th width="10%">实付款</th>
  189. <th width="10%">交易状态</th>
  190. <th width="10%">交易操作</th>
  191. </thead>
  192. </tr>
  193. </table>
  194. </div>
  195. <div class="order-detail">
  196. <div class="orders">
  197. <div class="choose-order">
  198. <div class="sui-pagination pagination-large top-pages">
  199. <ul>
  200. <li class="prev disabled"><a href="/static/user/#">上一页</a></li>
  201. <li class="next"><a href="/static/user/#">下一页</a></li>
  202. </ul>
  203. </div>
  204. </div>
  205. <!--order1-->
  206. <div class="choose-title">
  207. <label data-toggle="checkbox" class="checkbox-pretty ">
  208. <input type="checkbox" checked="checked"><span>2017-02-11 11:59 订单编号:7867473872181848 店铺:哇哈哈 <a>和我联系</a></span>
  209. </label>
  210. <a class="sui-btn btn-info share-btn">分享</a>
  211. </div>
  212. <table class="sui-table table-bordered order-datatable">
  213. <tbody>
  214. <tr>
  215. <td width="35%">
  216. <div class="typographic"><img src="/static/user/img/goods.png" />
  217. <a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
  218. <span class="guige">规格:温泉喷雾150ml</span>
  219. </div>
  220. </td>
  221. <td width="5%" class="center">
  222. <ul class="unstyled">
  223. <li class="o-price">¥599.00</li>
  224. <li>¥299.00</li>
  225. </ul>
  226. </td>
  227. <td width="5%" class="center">1</td>
  228. <td width="8%" class="center">
  229. </td>
  230. <td width="10%" class="center" >
  231. <ul class="unstyled">
  232. <li>¥299.00</li>
  233. <li>(含运费:¥0.00)</li>
  234. </ul>
  235. </td>
  236. <td width="10%" class="center">
  237. <ul class="unstyled">
  238. <li>等待卖家付款</li>
  239. <li><a href="/static/user/orderDetail.html" class="btn">订单详情 </a></li>
  240. </ul>
  241. </td>
  242. <td width="10%" class="center">
  243. <ul class="unstyled">
  244. <li><a href="/static/user/#" class="sui-btn btn-info">立即付款</a></li>
  245. <li>取消订单</li>
  246. </ul>
  247. </td>
  248. </tr>
  249. </tbody>
  250. </table>
  251. <!--order2-->
  252. <div class="choose-title">
  253. <label data-toggle="checkbox" class="checkbox-pretty ">
  254. <input type="checkbox" checked="checked"><span>2017-02-11 11:59 订单编号:7867473872181848 店铺:哇哈哈 <a>和我联系</a></span>
  255. </label>
  256. <a class="sui-btn btn-info share-btn">分享</a>
  257. </div>
  258. <table class="sui-table table-bordered order-datatable">
  259. <tbody>
  260. <tr>
  261. <td width="35%">
  262. <div class="typographic"><img src="/static/user/img/goods.png" />
  263. <a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
  264. <span class="guige">规格:温泉喷雾150ml</span>
  265. </div>
  266. </td>
  267. <td width="5%" class="center">
  268. <ul class="unstyled">
  269. <li class="o-price">¥599.00</li>
  270. <li>¥299.00</li>
  271. </ul>
  272. </td>
  273. <td width="5%" class="center">1</td>
  274. <td width="8%" class="center">
  275. <ul class="unstyled">
  276. <li>已发货</li>
  277. <li><a>退货/退款</a></li>
  278. </ul>
  279. </td>
  280. <td width="10%" class="center" rowspan="2">
  281. <ul class="unstyled">
  282. <li>¥299.00</li>
  283. <li>(含运费:¥0.00)</li>
  284. </ul>
  285. </td>
  286. <td width="10%" class="center" rowspan="2">
  287. <ul class="unstyled">
  288. <li>部分发货</li>
  289. <li><a href="/static/user/orderDetail.html" class="btn">订单详情 </a></li>
  290. </ul>
  291. </td>
  292. <td width="10%" class="center" rowspan="2">
  293. <ul class="unstyled">
  294. <li>还剩4天23时</li>
  295. <li><a href="/static/user/#" class="sui-btn btn-info">确认发货</a></li>
  296. </ul>
  297. </td>
  298. </tr>
  299. <tr>
  300. <td width="35%">
  301. <div class="typographic"><img src="/static/user/img/goods.png" />
  302. <a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
  303. <span class="guige">规格:温泉喷雾150ml</span>
  304. </div>
  305. </td>
  306. <td width="5%" class="center">
  307. <ul class="unstyled">
  308. <li class="o-price">¥199.00</li>
  309. <li>¥212.00</li>
  310. </ul>
  311. </td>
  312. <td width="5%" class="center">1</td>
  313. <td width="8%" class="center">
  314. <ul class="unstyled">
  315. <li>未发货</li>
  316. <li><a>退货/退款</a></li>
  317. </ul>
  318. </td>
  319. </tr>
  320. </tbody>
  321. </table>
  322. <!--order3-->
  323. <div class="choose-title">
  324. <label data-toggle="checkbox" class="checkbox-pretty ">
  325. <input type="checkbox" checked="checked"><span>2017-02-11 11:59 订单编号:7867473872181848 店铺:哇哈哈 <a>和我联系</a></span>
  326. </label>
  327. <a class="sui-btn btn-info share-btn">分享</a>
  328. </div>
  329. <table class="sui-table table-bordered order-datatable">
  330. <tbody>
  331. <tr>
  332. <td width="35%">
  333. <div class="typographic"><img src="/static/user/img/goods.png" />
  334. <a href="/static/user/#" class="block-text">包邮 正品玛姬儿压缩面膜无纺布纸膜100粒 送泡瓶面膜刷喷瓶 新款</a>
  335. <span class="guige">规格:温泉喷雾150ml</span>
  336. </div>
  337. </td>
  338. <td width="5%" class="center">
  339. <ul class="unstyled">
  340. <li class="o-price">¥599.00</li>
  341. <li>¥299.00</li>
  342. </ul>
  343. </td>
  344. <td width="5%" class="center">1</td>
  345. <td width="8%" class="center">
  346. <ul class="unstyled">
  347. <li><a>退货/退款</a></li>
  348. </ul>
  349. </td>
  350. <td width="10%" class="center">
  351. <ul class="unstyled">
  352. <li>¥299.00</li>
  353. <li>(含运费:¥0.00)</li>
  354. </ul>
  355. </td>
  356. <td width="10%" class="center">
  357. <ul class="unstyled">
  358. <li>买家已付款</li>
  359. <li><a href="/static/user/orderDetail.html" class="btn">订单详情 </a></li>
  360. </ul>
  361. </td>
  362. <td width="10%" class="center">
  363. <ul class="unstyled">
  364. <li><a href="/static/user/#" class="sui-btn btn-info">提醒发货</a></li>
  365. </ul>
  366. </td>
  367. </tr>
  368. </tbody>
  369. </table>
  370. </div>
  371. <div class="choose-order">
  372. <div class="sui-pagination pagination-large top-pages">
  373. <ul>
  374. <li class="prev disabled"><a href="/static/user/#">«上一页</a></li>
  375. <li class="active"><a href="/static/user/#">1</a></li>
  376. <li><a href="/static/user/#">2</a></li>
  377. <li><a href="/static/user/#">3</a></li>
  378. <li class="dotted"><span>...</span></li>
  379. <li class="next"><a href="/static/user/#">下一页»</a></li>
  380. </ul>
  381. <div><span>共10页&nbsp;</span><span>
  382. <input type="text" class="page-num"><button class="page-confirm" onclick="alert(1)">确定</button>
  383. </span></div>
  384. </div>
  385. </div>
  386. <div class="clearfix"></div>
  387. </div>
  388. <div class="like-title">
  389. <div class="mt">
  390. <span class="fl"><strong>热卖单品</strong></span>
  391. </div>
  392. </div>
  393. <div class="like-list">
  394. <ul class="yui3-g">
  395. <li class="yui3-u-1-4">
  396. <div class="list-wrap">
  397. <div class="p-img">
  398. <img src="/static/user/img/_/itemlike01.png" />
  399. </div>
  400. <div class="attr">
  401. <em>DELL戴尔Ins 15MR-7528SS 15英寸 银色 笔记本</em>
  402. </div>
  403. <div class="price">
  404. <strong>
  405. <em>¥</em>
  406. <i>3699.00</i>
  407. </strong>
  408. </div>
  409. <div class="commit">
  410. <i class="command">已有6人评价</i>
  411. </div>
  412. </div>
  413. </li>
  414. <li class="yui3-u-1-4">
  415. <div class="list-wrap">
  416. <div class="p-img">
  417. <img src="/static/user/img/_/itemlike02.png" />
  418. </div>
  419. <div class="attr">
  420. <em>Apple苹果iPhone 6s/6s Plus 16G 64G 128G</em>
  421. </div>
  422. <div class="price">
  423. <strong>
  424. <em>¥</em>
  425. <i>4388.00</i>
  426. </strong>
  427. </div>
  428. <div class="commit">
  429. <i class="command">已有700人评价</i>
  430. </div>
  431. </div>
  432. </li>
  433. <li class="yui3-u-1-4">
  434. <div class="list-wrap">
  435. <div class="p-img">
  436. <img src="/static/user/img/_/itemlike03.png" />
  437. </div>
  438. <div class="attr">
  439. <em>DELL戴尔Ins 15MR-7528SS 15英寸 银色 笔记本</em>
  440. </div>
  441. <div class="price">
  442. <strong>
  443. <em>¥</em>
  444. <i>4088.00</i>
  445. </strong>
  446. </div>
  447. <div class="commit">
  448. <i class="command">已有700人评价</i>
  449. </div>
  450. </div>
  451. </li>
  452. <li class="yui3-u-1-4">
  453. <div class="list-wrap">
  454. <div class="p-img">
  455. <img src="/static/user/img/_/itemlike04.png" />
  456. </div>
  457. <div class="attr">
  458. <em>DELL戴尔Ins 15MR-7528SS 15英寸 银色 笔记本</em>
  459. </div>
  460. <div class="price">
  461. <strong>
  462. <em>¥</em>
  463. <i>4088.00</i>
  464. </strong>
  465. </div>
  466. <div class="commit">
  467. <i class="command">已有700人评价</i>
  468. </div>
  469. </div>
  470. </li>
  471. </ul>
  472. </div>
  473. </div>
  474. </div>
  475. </div>
  476. </div>
  477. </div>
  478. <!-- 底部栏位 -->
  479. <!--页面底部-->
  480. <div class="clearfix footer">
  481. <div class="py-container">
  482. <div class="footlink">
  483. <div class="Mod-service">
  484. <ul class="Mod-Service-list">
  485. <li class="grid-service-item intro intro1">
  486. <i class="serivce-item fl"></i>
  487. <div class="service-text">
  488. <h4>正品保障</h4>
  489. <p>正品保障,提供发票</p>
  490. </div>
  491. </li>
  492. <li class="grid-service-item intro intro2">
  493. <i class="serivce-item fl"></i>
  494. <div class="service-text">
  495. <h4>正品保障</h4>
  496. <p>正品保障,提供发票</p>
  497. </div>
  498. </li>
  499. <li class="grid-service-item intro intro3">
  500. <i class="serivce-item fl"></i>
  501. <div class="service-text">
  502. <h4>正品保障</h4>
  503. <p>正品保障,提供发票</p>
  504. </div>
  505. </li>
  506. <li class="grid-service-item intro intro4">
  507. <i class="serivce-item fl"></i>
  508. <div class="service-text">
  509. <h4>正品保障</h4>
  510. <p>正品保障,提供发票</p>
  511. </div>
  512. </li>
  513. <li class="grid-service-item intro intro5">
  514. <i class="serivce-item fl"></i>
  515. <div class="service-text">
  516. <h4>正品保障</h4>
  517. <p>正品保障,提供发票</p>
  518. </div>
  519. </li>
  520. </ul>
  521. </div>
  522. <div class="clearfix Mod-list">
  523. <div class="yui3-g">
  524. <div class="yui3-u-1-6">
  525. <h4>购物指南</h4>
  526. <ul class="unstyled">
  527. <li>购物流程</li>
  528. <li>会员介绍</li>
  529. <li>生活旅行/团购</li>
  530. <li>常见问题</li>
  531. <li>购物指南</li>
  532. </ul>
  533. </div>
  534. <div class="yui3-u-1-6">
  535. <h4>配送方式</h4>
  536. <ul class="unstyled">
  537. <li>上门自提</li>
  538. <li>211限时达</li>
  539. <li>配送服务查询</li>
  540. <li>配送费收取标准</li>
  541. <li>海外配送</li>
  542. </ul>
  543. </div>
  544. <div class="yui3-u-1-6">
  545. <h4>支付方式</h4>
  546. <ul class="unstyled">
  547. <li>货到付款</li>
  548. <li>在线支付</li>
  549. <li>分期付款</li>
  550. <li>邮局汇款</li>
  551. <li>公司转账</li>
  552. </ul>
  553. </div>
  554. <div class="yui3-u-1-6">
  555. <h4>售后服务</h4>
  556. <ul class="unstyled">
  557. <li>售后政策</li>
  558. <li>价格保护</li>
  559. <li>退款说明</li>
  560. <li>返修/退换货</li>
  561. <li>取消订单</li>
  562. </ul>
  563. </div>
  564. <div class="yui3-u-1-6">
  565. <h4>特色服务</h4>
  566. <ul class="unstyled">
  567. <li>夺宝岛</li>
  568. <li>DIY装机</li>
  569. <li>延保服务</li>
  570. <li>泽易购E卡</li>
  571. <li>泽易购通信</li>
  572. </ul>
  573. </div>
  574. <div class="yui3-u-1-6">
  575. <h4>帮助中心</h4>
  576. <img src="/static/user/img/wx_cz.jpg">
  577. </div>
  578. </div>
  579. </div>
  580. <div class="Mod-copyright">
  581. <ul class="helpLink">
  582. <li>关于我们<span class="space"></span></li>
  583. <li>联系我们<span class="space"></span></li>
  584. <li>关于我们<span class="space"></span></li>
  585. <li>商家入驻<span class="space"></span></li>
  586. <li>营销中心<span class="space"></span></li>
  587. <li>友情链接<span class="space"></span></li>
  588. <li>关于我们<span class="space"></span></li>
  589. <li>营销中心<span class="space"></span></li>
  590. <li>友情链接<span class="space"></span></li>
  591. <li>关于我们</li>
  592. </ul>
  593. <p>地址:深圳市大冲国际</p>
  594. </div>
  595. </div>
  596. </div>
  597. </div>
  598. <!--页面底部END-->
  599. undefined
  600. </html>

注意: 上述代码的156行的用户登录名的获取方式。

4.6 查看运行效果:

image.png

附录一:

Nginx服务器配置: /mydata/nginx/conf/conf.d/zeyigou.conf

  1. #运营商管理后台
  2. #server {
  3. # listen 80;
  4. # server_name manager.zeyigou.com;
  5. # location / {
  6. # proxy_pass http://192.168.56.1:8081/renren-fast/;
  7. # proxy_set_header Host $host;
  8. # }
  9. # location /manager {
  10. # proxy_pass http://192.168.56.1:9001/manager/;
  11. # proxy_set_header Host $host;
  12. # }
  13. #}
  14. #商家管理后台
  15. #server {
  16. # listen 80;
  17. # server_name shop.zeyigou.com;
  18. # location / {
  19. # proxy_pass http://192.168.56.1:8082/renren-fast/;
  20. # proxy_set_header Host $host;
  21. # }
  22. # location /shop {
  23. # proxy_pass http://192.168.56.1:9002/shop/;
  24. # proxy_set_header Host $host;
  25. # }
  26. #}
  27. #门户首页
  28. #server {
  29. # listen 80;
  30. # server_name portal.zeyigou.com;
  31. # location / {
  32. # proxy_pass http://192.168.56.1:9001;
  33. # proxy_set_header Host $host;
  34. # }
  35. # location /static/ {
  36. # root /usr/share/nginx/html;
  37. # }
  38. #
  39. #}
  40. #用户搜索
  41. #server {
  42. # listen 80;
  43. # server_name search.zeyigou.com;
  44. #
  45. # location / {
  46. # proxy_pass http://192.168.56.1:9003;
  47. # proxy_set_header Host $host;
  48. # }
  49. # location /static/ {
  50. # root /usr/share/nginx/html;
  51. # }
  52. #
  53. #}
  54. #用户管理
  55. server {
  56. listen 80;
  57. server_name user.zeyigou.com;
  58. location / {
  59. proxy_pass http://192.168.56.1:9005;
  60. proxy_set_header Host $host;
  61. }
  62. location /static/ {
  63. root /usr/share/nginx/html;
  64. }
  65. }
  66. server {
  67. listen 80;
  68. server_name manager.zeyigou.com;
  69. location / {
  70. proxy_pass http://192.168.56.1:9001;
  71. proxy_set_header Host $host;
  72. }
  73. location /static/ {
  74. root /usr/share/nginx/html;
  75. }
  76. }
  77. server {
  78. listen 80;
  79. server_name *.zeyigou.com zeyigou.com;
  80. location / {
  81. proxy_pass http://192.168.56.1:88;
  82. proxy_set_header Host $host;
  83. }
  84. location /static/ {
  85. root /usr/share/nginx/html;
  86. }
  87. }

附录二:

简化配置cas客户端的步骤:

1、添加依赖:

  1. <!--1. 添加cas客户端的依赖-->
  2. <dependency>
  3. <groupId>net.unicon.cas</groupId>
  4. <artifactId>cas-client-autoconfig-support</artifactId>
  5. <version>2.2.0-GA</version>
  6. </dependency>

2、在application.properties文件中添加如下:

  1. cas.server-url-prefix=http://cas.zeyigou.com:8080/cas
  2. cas.server-login-url=http://cas.zeyigou.com:8080/cas/login
  3. cas.client-host-url=http://manager.zeyigou.com/
  4. cas-ignore-pattern=(/manager/brand/findAll)|(/file/*)

说明:

cas-ignore-pattern: 代表放行的地址

3、添加如下配置类:

  1. @Configuration
  2. @EnableCasClient
  3. public class CasUrlPatternConfig {
  4. @Value("${cas.server-login-url}")
  5. private String casServerLoginUrl;
  6. @Value("${cas.client-host-url}")
  7. private String casClientHostUrl;
  8. @Value("${cas-ignore-pattern}")
  9. private String casIgnorePattern;
  10. /**
  11. * description:授权过滤器
  12. * ignoreUrlPatternType 使用CAS现成的正则表达式过滤策略
  13. */
  14. @Bean
  15. public FilterRegistrationBean filterAuthenticationRegistration() {
  16. FilterRegistrationBean registration = new FilterRegistrationBean();
  17. registration.setFilter(new AuthenticationFilter());
  18. registration.addUrlPatterns("/*");
  19. Map<String,String> initParameters = new HashMap<String, String>();
  20. initParameters.put("casServerLoginUrl", casServerLoginUrl);
  21. initParameters.put("serverName", casClientHostUrl);
  22. //配置文件中设置要过滤拦截的路径
  23. initParameters.put("ignorePattern", casIgnorePattern);
  24. initParameters.put("ignoreUrlPatternType", "org.jasig.cas.client.authentication.RegexUrlPatternMatcherStrategy");
  25. registration.setInitParameters(initParameters);
  26. registration.setOrder(1);
  27. return registration;
  28. }
  29. }

4、修改nginx服务器配置如上图所示: