4. CAS客户端与SpringSecurity集成

4.1 Spring Security测试工程搭建

(1)建立Maven项目casclient_demo3 ,引入spring依赖和spring secrity 相关依赖 ,tomcat端口设置为9003

(2)建立web.xml ,添加过滤器等配置

(3)创建配置文件spring-security.xml

(4)添加html页面

4.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>

(2)修改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"/>

<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>

(3)创建UserDetailsServiceImpl

/**

* 认证类

*/

public class UserDetailServiceImpl implements UserDetailsService {

@Override

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

//构建角色集合

List<GrantedAuthority> authorities=new ArrayList();

authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

return new User(username, ""  , authorities);

}

}

这个类的主要作用是在登陆后得到用户名,可以根据用户名查询角色或执行一些逻辑。

4.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>

(2)创建springmvc.xml

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

<mvc:annotation-driven />

(3)创建UserController

@RestController

public class UserController {

@RequestMapping("/findLoginUser")

public void  findLoginUser(){

String name = SecurityContextHolder.getContext().getAuthentication().getName();

System.out.println(name);

}

}

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

4.4退出登录

修改spring-security.xml

<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>

在页面上添加链接

<a href="/logout/cas">退出登录</a>

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

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

5.品优购用户中心

5.1需求分析

用户中心实现单点登录。

5.2代码实现

5.2.1用户中心实现单点登录

(1)将用户中心相关的页面(home-开头的)拷贝至  pinnyougou-user-web

(2)pom.xml 引入springSecurity、cas客户端和springSecurity Cas整合包依赖(参照casclient_demo3)。

(3)web.xml  添加spring-security过滤器(参照参照casclient_demo3)设置首页为home-index.html

<welcome-file-list>

<welcome-file>home-index.html</welcome-file>

</welcome-file-list>

(4)构建UserDetailsServiceImpl.java  (参照casclient_demo3)

(5)添加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"/>

5.2.2页面显示用户名

(1)pinyougou-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;

}

}

(2)创建loginService.js

//服务层

app.service('loginService',function($http){

//读取列表数据绑定到表单中

this.showName=function(){

return $http.get('../login/name.do');

}

});

(3)创建indexController.js

//首页控制器

app.controller('indexController',function($scope,loginService){

$scope.showName=function(){

loginService.showName().success(

function(response){

$scope.loginName=response.loginName;

}

);

}

});

(5)修改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>

5.2.3退出登录

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

<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:bean>

退出登录后,跳转到网站首页

<span class="safe"> <a href="/logout/cas">退出登录 </a></span>

附录A. Spring Security 内置过滤器表

别名

Filter 类

CHANNEL_FILTER

ChannelProcessingFilter

SECURITY_CONTEXT_FILTER

SecurityContextPersistenceFilter

CONCURRENT_SESSION_FILTER

ConcurrentSessionFilter

LOGOUT_FILTER

LogoutFilter

X509_FILTER

X509AuthenticationFilter

PRE_AUTH_FILTER

AstractPreAuthenticatedProcessingFilter 的子类

CAS_FILTER

CasAuthenticationFilter

FORM_LOGIN_FILTER

UsernamePasswordAuthenticationFilter

BASIC_AUTH_FILTER

BasicAuthenticationFilter

SERVLET_API_SUPPORT_FILTER

SecurityContextHolderAwareRequestFilter

JAAS_API_SUPPORT_FILTER

JaasApiIntegrationFilter

REMEMBER_ME_FILTER

RememberMeAuthenticationFilter

ANONYMOUS_FILTER

AnonymousAuthenticationFilter

SESSION_MANAGEMENT_FILTER

SessionManagementFilter

EXCEPTION_TRANSLATION_FILTER

ExceptionTranslationFilter

FILTER_SECURITY_INTERCEPTOR

FilterSecurityInterceptor

SWITCH_USER_FILTER

SwitchUserFilter

完毕,good luck!

CAS客户端与SpringSecurity集成的更多相关文章

  1. 品优购商城项目(六)CAS客户端与SpringSecurity集成

    cas单点登录旨在解决传统登录模式session在分布式项目中共享登录信息的问题. 本文cas服务器使用 4.0版本,仅供学习参考.把 cas.war 直接部署在tomcat即可,这里有个固定的用户名 ...

  2. 单点登录(SSO)解决方案之 CAS客户端与Spring Security集成

    接上篇:单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造 Spring Security Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制 ...

  3. CAS学习笔记三:SpringBoot自动配置与手动配置过滤器方式集成CAS客户端

    本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式集成CAS客户端. 需要提前搭建 CAS 服务端,参考 https://www.cnblogs.com/hell ...

  4. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  5. CAS客户端服务器端配置步骤

    来自我的个人网站:http://lkf.22web.org/ cas介绍: CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 ...

  6. 如何利用tomcat和cas实现单点登录(2):配置cas数据库验证和cas客户端配置

    接(1),上一篇主要讲述了tomcat和cas server端的部署. 接下来主要还有两个步骤. 注意:为了开启两个tomcat,要把直接配置的tomcat的环境变量取消!!!!!!!!!! 客户端配 ...

  7. 配置php的CAS客户端

    1.下载安装xmapp 2.开启Apache服务. 3.下载php的CAS客户端源码包(我使用的是CAS-1.2.0.tgz),解压到xmap的htdocs目录下(D:\xmapp\htdocs),进 ...

  8. cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...

  9. Cas 服务器 Service(Cas客户端)注册信息维护

    作为Cas服务器,允许哪些客户端接入与否是通过配置来定义的.对Cas服务器来说,每一个接入的客户端与一个Service配置对应:在Cas服务器启动时加载并注册上这些Service,与之对应的客户端才能 ...

随机推荐

  1. TensorBoard:可视化学习

    数据序列化 TensorBoard 通过读取 TensorFlow 的事件文件来运行.TensorFlow 的事件文件包括了你会在 TensorFlow 运行中涉及到的主要数据.下面是 TensorB ...

  2. 基于 Vue3.0 Composition Api 快速构建实战项目

    Quick Start 项目源码:https://github.com/Wscats/vue-cli 本项目综合运用了 Vue3.0 的新特性,适合新手学习

  3. luogu P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team

    题目背景 老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的N头奶牛中选出一支队伍. 每只奶牛的能力为整数,第i头奶牛的能力为R i .飞盘队的队员数量不能少于 1.大于N.一 支队伍的总能力就是 ...

  4. git 使用详解(5)—— get log 查看提交历史

    git log 查看 提交历史 在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看. 接下来的例子会用我专门用于演示的 simplegit 项目,运行下面 ...

  5. openstack网络(二)

    连接物理服务器 单网卡 多网卡 跨主机安装网络服务 使用单个控制节点安装 使用专用网络节点安装 连接物理服务器 每个物理主机所需的网卡数量取决于云平台使用领域,组织的安全性和性能要求以及硬件的可用性. ...

  6. MVC效验器

    步骤一:导入依赖 <!--数据效验--> <dependency> <groupId>org.hibernate</groupId> <artif ...

  7. leetcode字节跳动专题(持续更新)

    挑战字符串 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  8. Java中替换字符串中特定字符,replaceAll,replace,replaceFirst的区别

    使用“;”替换过字符串中的“,” public class Test01 {public static void main(String[] args) {String number = " ...

  9. 2019牛客全国多校训练四 I题 string (SAM+PAM)

    链接:https://ac.nowcoder.com/acm/contest/884/I来源:牛客网 题目描述 We call a,ba,ba,b non-equivalent if and only ...

  10. ARTS-S mac终端ftp命令行上传下载文件

    上传 ftp -u ftp://root:123456@10.11.12.3/a.txt a.txt 下载 ftp -o a.txt ftp://root:123456@10.11.12.13/a.t ...