练手项目1笔记 day15

目标

  • 搭建单点登录服务器,开发单点登录客户端
  • 实现CAS认证数据源设置
  • 更换CAS登录页面
  • 掌握CAS与springSecurity集成
  • 完成用户中心单点登录功能

1. 开源单点登录系统CAS入门

1. 什么是单点登录

单点登录(Single Sign On),简称SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义时在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

目前的品优购系统存在多个子系统,分别部署在不同的服务器中,使用传统方式的session是无法解决的,需要使用相关的单点登录技术解决。

在这里插入图片描述

2. 什么是CAS

CAS是耶鲁大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法。CAS在2004年成为JA-SIG的一个项目,具有以下特点:

  1. 开源的企业级单点登录解决方案
  2. CAS Server 为需要独立部署的web应用
  3. CAS Client支持非常多的客户端(指的是各web应用),包括java,PHP、Perl等

从结构上看,CAS包含两个部分:CAS Server和CAS Client。CAS Server需要独立部署,主要负责对用户的认证工作。CAS Client负责处理对客户端受保护资源的访问请求。需要登录时,重定向到CAS Server,下图为最基本的协议过程

在这里插入图片描述

SSO单点登录访问流程主要有以下步骤:

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

形象比喻:去游乐园玩,各种小的游乐设施也都要收费,可以买通票,但每个地方需要验证下。

3. CAS服务端部署

CAS服务端就是一个war包,过程类似solr,启动tomcat解压war包,浏览器输入http://localhost:8080/cas/login,用户名密码为casuser/Mellon,在项目的WEB-INF下的deployerConfigContext配置中添加用户名和密码都为admin,方便操作。

4. 服务端配置

1. 端口修改
  1. 修改tomcat端口,conf\server.xml找到port,将端口改为9100
  2. 修改CAS配置文件,修改WEB-INF/cas.properties的server.name,也改为9100
2. 去除HTTPS认证

默认使用HTTPS协议,需要安全证书,开发阶段,可使用http协议。如何修改?

  1. 修改cas的WEB-INF/deployerConfigContext.xml

找到如下配置

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

添加p:requireSecure="false"

  1. 修改cas的WEB-INF\spring-configuration的ticketGrantingTicketCookieGenerator.xml,找到如下配置
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
		p:cookieSecure="false"  // true改false
		p:cookieMaxAge="3600"  // -1修改为3600s
		p:cookieName="CASTGC"
		p:cookiePath="/cas" />
  1. 修改cas的WEB-INF\spring-configuration的warnCookieGenerator.xml,找到如下配置
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
		p:cookieSecure="false"  // true改为false
		p:cookieMaxAge="3600"  // -1修改为3600s
		p:cookieName="CASPRIVACY"
		p:cookiePath="/cas" />

5. CAS客户端入门demo

1. 客户端工程1搭建
  1. 搭建工程引入依赖

创建maven工程war包,casclient_demo1,引入cas客户端依赖并将tomcat端口改为9001

<dependencies>
  <!-- cas -->
  <dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.3.3</version>
  </dependency>

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <source>1.7</source>
        <target>1.7</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <configuration>
        <!-- 指定端口 -->
        <port>9001</port>
        <!-- 请求路径 -->
        <path>/</path>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. 添加web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">	

  <!-- ======================== 单点登录开始 ======================== -->  
  <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->  
  <listener>  
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
  </listener>  

  <!-- 该过滤器用于实现单点登出功能,可选配置。 -->  
  <filter>  
    <filter-name>CAS Single Sign Out Filter</filter-name>  
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
  </filter>  
  <filter-mapping>  
    <filter-name>CAS Single Sign Out Filter</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  

  <!-- 该过滤器负责用户的认证工作,必须启用它 -->  
  <filter>  
    <filter-name>CASFilter</filter-name>  
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>  
    <init-param>  
      <param-name>casServerLoginUrl</param-name>  
      <param-value>http://localhost:9100/cas/login</param-value>
      <!--这里的server是服务端的IP -->  
    </init-param>  
    <init-param>  
      <param-name>serverName</param-name>  
      <param-value>http://localhost:9001</param-value>
    </init-param>  
  </filter>  
  <filter-mapping>  
    <filter-name>CASFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  

  <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->  
  <filter>  
    <filter-name>CAS Validation Filter</filter-name>  
    <filter-class>  
      org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>  
    <init-param>  
      <param-name>casServerUrlPrefix</param-name>  
      <param-value>http://localhost:9100/cas</param-value>
    </init-param>  
    <init-param>  
      <param-name>serverName</param-name>  
      <param-value>http://localhost:9001</param-value>
    </init-param>  
  </filter>  
  <filter-mapping>  
    <filter-name>CAS Validation Filter</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  

  <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->  
  <filter>  
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
    <filter-class>  
      org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>  
  </filter>  
  <filter-mapping>  
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  

  <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->  
  <filter>  
    <filter-name>CAS Assertion Thread Local Filter</filter-name>  
    <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>  
  </filter>  
  <filter-mapping>  
    <filter-name>CAS Assertion Thread Local Filter</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  

  <!-- ======================== 单点登录结束 ======================== -->  


</web-app>
  1. 编写index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
welcome to pinyougou01 <%=request.getRemoteUser()%>

<a href="http://localhost:9100/cas/logout?service=http://www.baidu.com">退出登录</a>
</body>
</html>

request.getRemoteUser()为获取远程登录名

2. 客户端工程2的搭建

casclient_demo2,同上,tomcat改为9002,index为2

3. 测试

启动cas的tomcat以及客户端1和2

地址栏输入http://localhost:9001http://localhost:9002,均会跳到登录页

输入用户名密码,页面跳转到原来9001

4. 单点退出

地址栏http://localhost:9100/cas/logout,即可退出

也可以将该链接添加到index.jsp,见之前代码

如果想退出登录后自动跳转到某个页面,如何做?

修改cas系统的配置文件cas-servlet.xml

<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
      p:servicesManager-ref="servicesManager"
      p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/> //false改为true

再修改index.jsp的退出链接

2. CAS服务端数据源设置

1. 需求分析

让用户名密码从品优购的user表做验证

2. 配置数据源

  1. 修改cas服务端web-inf下deployerConfigContext.xml。添加配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
			  p:driverClass="com.mysql.jdbc.Driver"  
			  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8"  
			  p:user="root"  
			  p:password="root" /> 
<bean id="passwordEncoder" 
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  
		c:encodingAlgorithm="MD5"  
		p:characterEncoding="UTF-8" />  
<bean id="dbAuthHandler"  
		  class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"  
		  p:dataSource-ref="dataSource"  
		  p:sql="select password from tb_user where username = ?"  
		  p:passwordEncoder-ref="passwordEncoder"/>  

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

 <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>               
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
            </map>
        </constructor-arg>      
        <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
</bean>

其中,

<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />

使用固定的用户名密码,如果使用数据库认证用户名和密码。需要注释掉

添加配置

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
  1. 将三个相关jar包放到webapps\cas\WEB-INF\lib下

包括c3p0 cas-server-support-jdbc mysql-connector-java

用数据库的用户名密码测试

3. CAS服务端界面改造

1. 需求分析

将CAS默认的登录页面改造为品优购登录页

2. 改造

1. 拷贝资源
  1. 将品优购的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下
  2. 将css js等文件夹拷贝到 cas目录下
  3. 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp
2. 修改页面

编辑casLoginView.jsp内容

  1. 添加指令
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  1. 修改form标签
<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
......
</form:form>
  1. 修改用户名框
<form:input id="username" tabindex="1" 
	accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" 
	placeholder="邮箱/用户名/手机号" class="span2 input-xfat" />
  1. 修改密码框
<form:password  id="password" tabindex="2" path="password" 
      accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" 
	  placeholder="请输入密码" class="span2 input-xfat"   />
  1. 修改登录按钮
<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="sui-btn btn-block btn-xlarge btn-danger" accesskey="l" value="登陆" type="submit" />

3. 错误提示

在表单内加入错误提示框

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

修改cas-servlet.xml,设置国际化为zn_CN

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

在WEB-INF\classes目录下messages_zh_CN.properties拷贝信息

authenticationFailure.AccountNotFoundException=\u7528\u6237\u540d\u4e0d\u5b58\u5728.
authenticationFailure.FailedLoginException=\u5bc6\u7801\u9519\u8bef.

第一个是用户名不存在时的错误提示,第二个是密码错误的提示。

4. CAS客户端与SpringSecurity集成

1. SpringSecurity测试工程搭建

  1. 建立Maven项目casclient_demo3 ,引入spring依赖和spring secrity 相关依赖 ,tomcat端口设置为9003
  2. 建立web.xml ,添加过滤器等配置
  3. 创建配置文件spring-security.xml
  4. 添加html页面

以上步骤参照第4天的spring-security-demo

2. spring security与cas集成

  1. 引入依赖
<dependency>  
	   <groupId>org.springframework.security</groupId>  
	   <artifactId>spring-security-cas</artifactId>  
	   <version>4.1.0.RELEASE</version>  
</dependency>     
<dependency>  
        <groupId>org.jasig.cas.client</groupId>  
        <artifactId>cas-client-core</artifactId>  
        <version>3.3.3</version>  
        <exclusions>  
            <exclusion>  
                <groupId>org.slf4j</groupId>  
                <artifactId>log4j-over-slf4j</artifactId>  
            </exclusion>  
        </exclusions>  
</dependency> 
  1. 修改spring-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

  <!--   entry-point-ref  入口点引用 -->
  <http use-expressions="false" entry-point-ref="casProcessingFilterEntryPoint">  
    <intercept-url pattern="/**" access="ROLE_USER"/>   
    <csrf disabled="true"/>  
    <!-- custom-filter为过滤器, position 表示将过滤器放在指定的位置上,before表示放在指定位置之前  ,after表示放在指定的位置之后  -->           
    <custom-filter ref="casAuthenticationFilter"  position="CAS_FILTER" />      
    <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>  
    <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>  
  </http>

  <!-- CAS入口点 开始 -->
  <beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">  
    <!-- 单点登录服务器登录URL -->  
    <beans:property name="loginUrl" value="http://localhost:9100/cas/login"/>  
    <beans:property name="serviceProperties" ref="serviceProperties"/>  
  </beans:bean>      
  <beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">  
    <!--service 配置自身工程的根地址+/login/cas   -->  
    <beans:property name="service" value="http://localhost:9003/login/cas"/>
  </beans:bean>  
  <!-- CAS入口点 结束 -->


  <!-- 认证过滤器 开始 -->
  <beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">  
    <beans:property name="authenticationManager" ref="authenticationManager"/>  
  </beans:bean>  
  <!-- 认证管理器 -->
  <authentication-manager alias="authenticationManager">
    <authentication-provider  ref="casAuthenticationProvider">
    </authentication-provider>
  </authentication-manager>
  <!-- 认证提供者 -->
  <beans:bean id="casAuthenticationProvider"     class="org.springframework.security.cas.authentication.CasAuthenticationProvider">  
    <beans:property name="authenticationUserDetailsService">  
      <beans:bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">  
        <beans:constructor-arg ref="userDetailsService" />  
      </beans:bean>  
    </beans:property>  
    <beans:property name="serviceProperties" ref="serviceProperties"/>  
    <!-- ticketValidator 为票据验证器 -->
    <beans:property name="ticketValidator">  
      <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">  
        <beans:constructor-arg index="0" value="http://localhost:9100/cas"/>  
      </beans:bean>  
    </beans:property>  
    <beans:property name="key" value="an_id_for_this_auth_provider_only"/> 
  </beans:bean>        
  <!-- 认证类 -->
  <beans:bean id="userDetailsService" class="cn.itcast.demo.service.UserDetailServiceImpl"/>  

  <!-- 认证过滤器 结束 -->


  <!-- 单点登出  开始  -->     
  <beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>
  <!--经过此配置,当用户在地址栏输入本地工程 /logout/cas,相当于把9100xxxx映射为/logout/cas-->
  <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  
    <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://www.baidu.com"/>  
    <beans:constructor-arg>  
      <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  
    </beans:constructor-arg>  
    <beans:property name="filterProcessesUrl" value="/logout/cas"/>  
  </beans:bean>  
  <!-- 单点登出  结束 -->  

</beans:beans>
  1. 创建UserDetailsServiceImpl
public class UserDetailServiceImpl implements UserDetailsService {

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    System.out.println("pass through authority..."+username);
    ArrayList<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
    return new User(username,"",authorities);
  }
}

这个类主要作用是在登录后获得用户名,根据用户名查询角色或者执行一些逻辑。

3. 获取登录名

在处理后端逻辑时需要获得登陆名,如何获取?和之前方式一样。

  1. web.xml添加springmvc
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
</servlet>

<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
  1. 创建springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.spr<?xml version="1.0" encoding="UTF-8"?>
                                                                                                                         <beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
                                                                                                              xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
                                                                                                                   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
                                                         <context:component-scan base-package="cn.itcast.demo" />
	<mvc:annotation-driven />

</beans>ingframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                           http://code.alibabatech.com/schema/dubbo
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="cn.itcast.demo"/>
  <mvc:annotation-driven/>

</beans>
  1. 创建UserController
@RestController
public class UserController {

  @RequestMapping("/findLoginUser")
  public void findLoginUser(){
    // 当前登录名
    String name = SecurityContextHolder.getContext().getAuthentication().getName();
    System.out.println("loginName currently is: "+name);
  }
}

地址栏输入http://localhost:9003/findLoginUser.do, 即可在控制台看到输出的登录名。

4. 退出登录

修改spring-security.xml

<!-- 单点登出  开始  -->     
<beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>
<!--经过此配置,当用户在地址栏输入本地工程 /logout/cas,相当于把9100xxxx映射为/logout/cas-->
<beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  
  <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9003/index2.html"/>
  <beans:constructor-arg>  
    <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  
  </beans:constructor-arg>  
  <beans:property name="filterProcessesUrl" value="/logout/cas"/>  
</beans:bean>  
<!-- 单点登出  结束 -->  

在index.html页面添加链接

欢迎进入神奇的spring security世界~~~ <a href="logout/cas">退出</a>

创建index2.html,将index2.html设置为可匿名访问

<http pattern="/index2.html" security="none"/>

5. 品优购用户中心

1. 需求分析

用户中心实现单点登录

2. 代码实现

1. 用户中心实现单点登录
  1. 将用户中心相关的页面(home-开头)拷贝到user-web
  2. pom.xml 引入springSecurity、cas客户端和springSecurity Cas整合包依赖
  3. web.xml 添加spring-security过滤器(参照参照casclient_demo3)设置首页为home-index.html
<welcome-file-list>
  <welcome-file>home-index.html</welcome-file>
</welcome-file-list>
  1. 构建UserDetailsServiceImpl.java
  2. 添加spring-security.xml(参照casclient_demo3),并做以下修改

配置匿名访问资源

<!-- 匿名访问资源 -->
<http pattern="/css/**" security="none"></http>
<http pattern="/js/**" security="none"></http>
<http pattern="/image/**" security="none"></http>
<http pattern="/plugins/**" security="none"></http>
<http pattern="/register.html" security="none"></http>
<http pattern="/user/add.do" security="none"></http>
<http pattern="/user/sendCode.do" security="none"></http>

设置服务地址属性

<beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">    
     <beans:property name="service" value="http://localhost:9106/login/cas"/>
</beans:bean>  

设置认证类

<beans:bean 
id="userDetailsService" class="com.pinyougou.user.service.UserDetailServiceImpl"/> 
2. 页面显示用户名
  1. user-web创建loginController.java
@RestController
@RequestMapping("/login")
public class LoginController {

  @RequestMapping("/name")
  public Map showName(){
    String name = SecurityContextHolder.getContext().getAuthentication().getName();
    Map map = new HashMap();
    map.put("loginName",name);
    return map;
  }
}
  1. 创建loginService.js
// 服务层
app.service('loginService',function ($http) {
    // 读取列表数据绑定到表单
    this.showName=function () {
        return $http.get('../login/name.do');
    }
});
  1. 创建indexController.js
// 首页控制器
app.controller('indexController',function ($http, loginService) {
    $scope.showName=function () {
        loginService.showName().success(
            function (response) {
                $scope.loginName=response.loginName;
            }
        );
    }
});
  1. 修改home-index.html,引入js
<script type="text/javascript" src="plugins/angularjs/angular.min.js"></script>
<script type="text/javascript" src="js/base.js"></script>	
<script type="text/javascript" src="js/service/loginService.js"></script>
<script type="text/javascript" src="js/controller/indexController.js"></script>

指令,调用方法查询登录名

<body ng-app="pinyougou" ng-controller="indexController" ng-init="showName()">

显示用户名

<span class="name">{{loginName}}</span>
3. 退出登录

设置退出登录后的跳转地址

spring-security.xml

<!-- 单点登出  开始  -->     
<beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>
<!--经过此配置,当用户在地址栏输入本地工程 /logout/cas,相当于把9100xxxx映射为/logout/cas-->
<beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  
  <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9103"/>
  <beans:constructor-arg>  
    <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  
  </beans:constructor-arg>  
  <beans:property name="filterProcessesUrl" value="/logout/cas"/>  
</beans:bean>  
<!-- 单点登出  结束 -->  

退出登陆后,跳转网站首页

<span class="safe"> <a href="/logout/cas">退出登录 </a></span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值