目标
- 搭建单点登录服务器,开发单点登录客户端
- 实现CAS认证数据源设置
- 更换CAS登录页面
- 掌握CAS与springSecurity集成
- 完成用户中心单点登录功能
1. 开源单点登录系统CAS入门
1. 什么是单点登录
单点登录(Single Sign On),简称SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义时在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
目前的品优购系统存在多个子系统,分别部署在不同的服务器中,使用传统方式的session是无法解决的,需要使用相关的单点登录技术解决。
2. 什么是CAS
CAS是耶鲁大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法。CAS在2004年成为JA-SIG的一个项目,具有以下特点:
- 开源的企业级单点登录解决方案
- CAS Server 为需要独立部署的web应用
- CAS Client支持非常多的客户端(指的是各web应用),包括java,PHP、Perl等
从结构上看,CAS包含两个部分:CAS Server和CAS Client。CAS Server需要独立部署,主要负责对用户的认证工作。CAS Client负责处理对客户端受保护资源的访问请求。需要登录时,重定向到CAS Server,下图为最基本的协议过程
SSO单点登录访问流程主要有以下步骤:
- 访问服务:SSO客户端发送请求访问应用系统提供的服务资源
- 定向认证:SSO客户端会重定向用户请求到SSO服务器
- 用户认证:用户身份认证
- 发放票据:SSO服务器会产生一个随机的Service Ticket
- 验证票据:SSO服务器验证Service Ticket的合法性,验证通过后,允许客户端访问服务
- 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端
形象比喻:去游乐园玩,各种小的游乐设施也都要收费,可以买通票,但每个地方需要验证下。
3. CAS服务端部署
CAS服务端就是一个war包,过程类似solr,启动tomcat解压war包,浏览器输入http://localhost:8080/cas/login
,用户名密码为casuser/Mellon
,在项目的WEB-INF下的deployerConfigContext配置中添加用户名和密码都为admin,方便操作。
4. 服务端配置
1. 端口修改
- 修改tomcat端口,conf\server.xml找到port,将端口改为9100
- 修改CAS配置文件,修改WEB-INF/cas.properties的server.name,也改为9100
2. 去除HTTPS认证
默认使用HTTPS协议,需要安全证书,开发阶段,可使用http协议。如何修改?
- 修改cas的WEB-INF/deployerConfigContext.xml
找到如下配置
<bean id="proxyAuthenticationHandler" class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" />
添加p:requireSecure="false"
- 修改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" />
- 修改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搭建
- 搭建工程引入依赖
创建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>
- 添加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>
- 编写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:9001
和http://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. 配置数据源
- 修改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"/>
- 将三个相关jar包放到webapps\cas\WEB-INF\lib下
包括c3p0 cas-server-support-jdbc mysql-connector-java
用数据库的用户名密码测试
3. CAS服务端界面改造
1. 需求分析
将CAS默认的登录页面改造为品优购登录页
2. 改造
1. 拷贝资源
- 将品优购的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下
- 将css js等文件夹拷贝到 cas目录下
- 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp
2. 修改页面
编辑casLoginView.jsp内容
- 添加指令
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
- 修改form标签
<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
......
</form:form>
- 修改用户名框
<form:input id="username" tabindex="1"
accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true"
placeholder="邮箱/用户名/手机号" class="span2 input-xfat" />
- 修改密码框
<form:password id="password" tabindex="2" path="password"
accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off"
placeholder="请输入密码" class="span2 input-xfat" />
- 修改登录按钮
<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="sui-btn btn-block btn-xlarge btn-danger" accesskey="l" value="登陆" type="submit" />
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测试工程搭建
- 建立Maven项目casclient_demo3 ,引入spring依赖和spring secrity 相关依赖 ,tomcat端口设置为9003
- 建立web.xml ,添加过滤器等配置
- 创建配置文件spring-security.xml
- 添加html页面
以上步骤参照第4天的spring-security-demo
2. spring security与cas集成
- 引入依赖
<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>
- 修改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>
- 创建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. 获取登录名
在处理后端逻辑时需要获得登陆名,如何获取?和之前方式一样。
- 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>
- 创建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>
- 创建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. 用户中心实现单点登录
- 将用户中心相关的页面(home-开头)拷贝到user-web
- pom.xml 引入springSecurity、cas客户端和springSecurity Cas整合包依赖
- web.xml 添加spring-security过滤器(参照参照casclient_demo3)设置首页为home-index.html
<welcome-file-list>
<welcome-file>home-index.html</welcome-file>
</welcome-file-list>
- 构建UserDetailsServiceImpl.java
- 添加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. 页面显示用户名
- 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;
}
}
- 创建loginService.js
// 服务层
app.service('loginService',function ($http) {
// 读取列表数据绑定到表单
this.showName=function () {
return $http.get('../login/name.do');
}
});
- 创建indexController.js
// 首页控制器
app.controller('indexController',function ($http, loginService) {
$scope.showName=function () {
loginService.showName().success(
function (response) {
$scope.loginName=response.loginName;
}
);
}
});
- 修改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>