学习笔记:微服务-6.spring zuul + spring security + cas client 实现微服务sso登录

java教程之Spring Security系列教程之实现CAS单点登录下篇-搭建CAS客户端 一. 搭建CAS客户端 1. 创建新项目 我们在之前的Spring Security项目中,创建一个新的module模块,作为CAS Client项目,如下图。 2. 引入依赖 然后在这个模块的pom.xml文件中,引入相关依赖。 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> &l... 阅读详情

上节架构了spring zuul实现微服务的网页路由,因为zuul是微服务群的统一入口,非常适合在zuul服务上进行统一登录认证,本节实验结合spring zuul +spring security +Apereo cas实现微服务群的统一登录认证

spring security是一个spring的权限认证系统,cas是单位中央认证系统,从中央认证系统认证后,获取一个中央认证系统的身份(本测试中认证用户名linbin),spring security对这个用户名进行映射,比如这里映射为spring security的登录用户admin(可以通过数据库查询映射关系),并设置admin用户的权限,从而实现统一登录认证到本spring boot微服务的本地系统用户和权限的转换,而因zuul的统一api入口地位,这个登录可以作为整个微服务群的统一登录

1. 新建spring boot 微服务项目 Eureka-Client-zuul

pom.xml  全文

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.linbin</groupId>
	<artifactId>Eureda-Client-zuul</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Eureda-Client-zuul</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Greenwich.M3</spring-cloud.version><!-- Finchley.M8 -->
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
      <dependency> 
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
		  <artifactId>spring-boot-starter-security</artifactId> 
		 </dependency> 
   <dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-cas</artifactId>
    </dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
		<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

关键依赖:

      <dependency>
        <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-security</artifactId> 
         </dependency> 
   <dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-cas</artifactId>
    </dependency>

2.  application.properties 配置

server.port=8000
eureka.client.serviceUrl.defaultZone=http://admin:123@centos7:8888/eureka/
spring.application.name=Euredaclientzuul
zuul.routes.euredaclient1.path=/c1/**
zuul.routes.euredaclient1.serviceId=Euredaclient1
zuul.routes.springdemo.path=/sd/**
zuul.routes.springdemo.serviceId=SpringDemo
spring.session.store-type=none

3. java文件目录

4. 启动类EuredaClientZuulApplication 

@EnableZuulProxy
@SpringBootApplication
public class EuredaClientZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(EuredaClientZuulApplication.class, args);
    }

}
5.WebSecurityConfig 类 是 spring security 配置实例

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	 @Autowired 
	 private AuthenticationEntryPoint authenticationEntryPoint; 
	 @Autowired 
	 private AuthenticationProvider authenticationProvider; 
	 @Autowired 
	 private SingleSignOutFilter singleSignOutFilter; 
	 @Autowired 
	 private LogoutFilter logoutFilter; 
	 @Override 
	 protected void configure(HttpSecurity http) throws Exception { 
		 //所有都需要认证才能访问 //由于设置了验证filter访问为,/login/cas,所以必须通过验证,否则出现死循环 
		 http
		 .authorizeRequests()
		 .antMatchers("/login/cas")
		 .permitAll()
		 .and()
		 .authorizeRequests()
		 .anyRequest()
		 .authenticated()
		 .and()
		 .httpBasic()
		 .authenticationEntryPoint(authenticationEntryPoint)
		 .and()
		 .logout()
		 .logoutSuccessUrl("/logout")
		 .and()
		 .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
		 .addFilterBefore(logoutFilter, LogoutFilter.class);
		 } 
	 @Override 
	 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
		 auth.authenticationProvider(authenticationProvider); 
		 } 
	 @Override 
	 protected AuthenticationManager authenticationManager() throws Exception { 
		 //设置cas认证提供 
		 return new ProviderManager( Arrays.asList(authenticationProvider)); 
		 } 
	 @Bean 
	 public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sp) throws Exception { 
		 //cas认证过滤器,当触发本filter时,对ticket进行认证 
		 CasAuthenticationFilter filter = new CasAuthenticationFilter(); 
		 filter.setServiceProperties(sp); 
		 filter.setAuthenticationManager(authenticationManager()); return filter; } 
	 @Override public void configure(WebSecurity web) throws Exception { super.configure(web); 
	 }
}

6.  CasSecurityConfig 实现与cas的接口配置

@Configuration
public class CasSecurityConfig {
	//cas服务 
	@Value("${cas.server.url:https://author.linbsoft.com/cas}") 
	private String casServerUrl; 
	@Bean 
	public ServiceProperties serviceProperties() { 
		ServiceProperties serviceProperties = new ServiceProperties(); 
		//本机服务,访问/login/cas时进行校验登录 
		serviceProperties.setService("http://springcloud.linbsoft.com:8000/login/cas"); 
		serviceProperties.setSendRenew(false); 
		return serviceProperties; 
		} 
	
	@Bean 
	@Primary 
	public AuthenticationEntryPoint authenticationEntryPoint( ServiceProperties sP) { 
		CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); 
		//cas登录服务 
		entryPoint.setLoginUrl(casServerUrl + "/login"); 
		entryPoint.setServiceProperties(sP); 
		return entryPoint; 
		} 
	@Bean 
	public TicketValidator ticketValidator() { 
		//指定cas校验器 
		return new Cas30ServiceTicketValidator( casServerUrl); 
		} 
	//cas认证 
	@Bean 
	public CasAuthenticationProvider casAuthenticationProvider() { 
		CasAuthenticationProvider provider = new CasAuthenticationProvider(); 
		provider.setServiceProperties(serviceProperties()); 
		provider.setTicketValidator(ticketValidator()); 
		provider.setUserDetailsService(customUserDetailsService()); 
		provider.setKey("CAS_PROVIDER_LOCALHOST_8000"); 
		return provider; 
		} 
	@Bean 
    public UserDetailsService customUserDetailsService(){ 
        return new CustomUserDetailsService(); 
    }
	@Bean 
	public SecurityContextLogoutHandler securityContextLogoutHandler() { 
		return new SecurityContextLogoutHandler(); 
		} 
	@Bean 
	public LogoutFilter logoutFilter() { 
		//退出后转发路径 
		LogoutFilter logoutFilter = new LogoutFilter( casServerUrl + "/logout", securityContextLogoutHandler()); 
		//cas退出 
		logoutFilter.setFilterProcessesUrl("/logout/cas"); 
		return logoutFilter; 
		} 
	@Bean 
	public SingleSignOutFilter singleSignOutFilter() { 
		//单点退出 
		SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); 
		singleSignOutFilter.setCasServerUrlPrefix(casServerUrl); 
		singleSignOutFilter.setIgnoreInitConfiguration(true); 
		return singleSignOutFilter; 
		} 
	//设置退出监听 
	@EventListener 
	public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener( HttpSessionEvent event) { 
		return new SingleSignOutHttpSessionListener(); 
		}
	
	}

7. CustomUserDetailsService 实现UserDetailsService接口

public class CustomUserDetailsService     implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("当前的用户名是:"+username);
        //这里为了方便测试,就直接返回一个用户信息,实际当中这里修改为查询数据库或者调用服务什么的来获取用户信息
        UserInfo userInfo = new UserInfo();
        userInfo.setId(104566569938L);
        userInfo.setUsername("admin");
        userInfo.setName("admin");
        Set<AuthorityInfo> authorities = new HashSet<AuthorityInfo>();
        AuthorityInfo authorityInfo = new AuthorityInfo("TEST-Roll");
        authorities.add(authorityInfo);
        authorityInfo = new AuthorityInfo("write-table-roll");
        authorities.add(authorityInfo);    
        userInfo.setAuthorities(authorities);
        return userInfo;
    }

}

8.   UserInfo  保存登录用户信息的类,CustomUserDetailsService 需要调用

public class UserInfo implements UserDetails {
	private static final long serialVersionUID = -1041327031937199938L;
	private Long id;
	private String name;
 	private String username;
	private String password;
	private boolean isAccountNonExpired = true;
	private boolean isAccountNonLocked = true;
	private boolean isCredentialsNonExpired = true;
	private boolean isEnabled = true;
	private Set<AuthorityInfo> authorities = new HashSet<AuthorityInfo>();
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		return	authorities;
	}

	@Override
	public String getPassword() {
		return password;
	}

	@Override
	public String getUsername() {
		return username;
	}

	@Override
	public boolean isAccountNonExpired() {
		return this.isAccountNonExpired;
	}

	@Override
	public boolean isAccountNonLocked() {
		return this.isAccountNonLocked;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		return this.isCredentialsNonExpired;
	}

	@Override
	public boolean isEnabled() {
		return this.isEnabled;
	}

	public void setUsername(String string) {
		this.username=string;
  }

	public void setName(String string) {
		this.name=string;
		
	}
	public String getName() {
		return this.name;
		
	}

	public void setAuthorities(Set<AuthorityInfo> authorities2) {
		authorities=authorities2;
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setAccountNonExpired(boolean isAccountNonExpired) {
		this.isAccountNonExpired = isAccountNonExpired;
	}

9. AuthorityInfo 是保存权限信息的类,UserInfo类需要使用

public class AuthorityInfo  implements GrantedAuthority{
    private static final long serialVersionUID = -175781100474818800L;
    /**
     * 权限CODE
     */
    private String authority;
    public AuthorityInfo(String authority) {
        this.authority = authority;
    }
    @Override
    public String getAuthority() {
        return authority;
    }
    public void setAuthority(String authority) {
        this.authority = authority;
    }

}
 

10.  创建一个showuser类用来测试显示登录认证后的本地用户及权限

@RestController
public class showuser {
    @RequestMapping("/user")
    public String showloginuser() {
        UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext() 
                .getAuthentication() 
                .getPrincipal(); 
        String user= "登陆用户:"+ userDetails.getUsername() +"<br>登陆权限:";
        for (GrantedAuthority grantedAuthority : userDetails.getAuthorities()) {
            user += ("<br>Authority:" + grantedAuthority.getAuthority());
        }
        return user;
    }
}

11. 全部类及配置介绍完毕,启动Eureda server微服务,再启动本例 Eureka-Client-zuul 服务

浏览器 http://springcloud.linbsoft.com:8000  本案例地址

会自动条转到 cas登录界面,登录后在eclipse控制台可以看见cas登录用户

控制台显示的是cas中央认证系统的登录用户

12. 在浏览器跳转到本地再进入 http://springcloud.linbsoft.com:8000/user 可以看见映射的本地账号

到此,实现了登录外部中央认证系统到登录本地应用的spring secutiry认证系统的流程

参考了多位网友的文章,在这一致致谢!

 

 

基于SpringCloud的OAuth2单点登录实战示例 SpringCloud 提供了一整套微服务开发工具链,其核心组件包括:组件名称功能描述Eureka服务注册与发现中心Ribbon客户端负载均衡器Feign声明式服务调用客户端ZuulAPI 网关,负责请求路由与过滤Config集中式配置管理服务分布式请求链路追踪Gateway新一代 API 网关(替代 Zuul)这些组件共同构成了 SpringCloud 微服务架构的基石。 阅读详情

相关推荐

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2154

CAS Clients 集成 Spring Security

CAS Clients概述 CAS客户端也是可以与各种软件平台和应用程序集成的软件包,以便使用或者更多支持的协议与CAS服务器通信。已经开发了支持许多软件平台和产品的CAS客户。 官方客户 .NET CAS客户端 Java CAS客户端 PHP CAS客户端 Apache CAS客户端 其他客户 其他非官方或孵化的CAS客户可以在这里找到。鉴于上述项目是非官方的,不受CAS的直接维护...

大强博客 848

ArcGIS通过已知坐标点转面(通过excel文件,有工具可批量生成面要素)

通过使用ArcGIS中的工具,将坐标点XY数据转换成可视化的点线面矢量数据,更加方便快捷有效的获取对应信息

qq_41046162的博客 3万+

Spring Cloud 之 Zuul、Spring Security、Oauth2 的整合

zuul为微服务的网关,所有的访问服务的api都要通过网关转发到内网对应的服务。spring security、oauth2为认证和授权中心,负责整个微服务api的安全 一、添加:learn-shop-public-auth 认证、授权中心 1、 在pom.xml中添加 &lt;dependencies&gt; &lt;!-- 注册中心 --&gt; &lt;dependenc...

XiaoY的专栏 1万+

深入解析数据通信中的码元速率与比特率:从基础到实战应用

本文深入解析了数据通信中的核心概念码元速率与比特率,通过生动的比喻和公式(比特率=波特率×log₂(M))揭示其本质关系。文章结合BPSK、QPSK、16QAM等调制技术,剖析了从4G/5G到LoRa等实战场景中如何权衡速率、距离与可靠性,并提供了软考真题解析与系统设计建议,帮助读者从理论到应用全面掌握数据速率优化。

weixin_29324877的博客 213

Keil MDK 5.37及之后版本 安装AC5(ARMCC)编译器详细步骤

由于Keil 5.37及之后版本不再默认安装AC5(ARMCC)编译器,这就会导致由AC5编译的工程无法正常编译,往往输出窗口会提示以下信息:*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.

s_Modesto的博客 1万+

浅谈网关与认证中心做动态角色管理(Zuul+SpringSecurity)

解决角色频繁更改问题,不谈代码

weixin_44870613的博客 1318

OPTEE v4.4.0 qemu_v8环境搭建(支持Hafnium)

一、前提条件 二、拉取代码 三、下载工具链 四、修改代码 五、编译 六、运行

AI-安全-功耗 889

springcloud 入门(10) Spring Security 安全与权限

spring security

做一个有思想的技术人 4579

PHM 2010数据集解读

PHM数据挑战赛是一项面向所有潜在与会者的竞赛。今年的挑战集中在使用测力仪、加速度计和声发射数据估计高速数控铣床刀具的RUL上。 博客对PHM 2010数据集的组成和信号进行了可视化。

cnjs1994的博客 7648

058、时域降噪(Temporal Denoise):运动补偿与递归滤波在视频降噪中的应用

本文深入探讨了时域降噪(Temporal Denoise)技术在视频处理中的应用。作者通过车载环视项目案例,揭示了空域降噪的局限性,提出利用帧间信息进行降噪的核心思路。文章详细解析了递归滤波和运动补偿两大关键技术,指出递归滤波简单但易产生拖影,而运动补偿通过计算运动矢量解决此问题。作者还分享了多帧降噪方案的优势与算力挑战,并总结了噪声模型匹配、运动矢量一致性等实战调优经验。最后强调时域降噪需要与空域降噪平衡,指出调试工具的重要性,提出"在保证运动区域无鬼影的前提下追求信噪比"的实践原则,体现了算法复杂度与效

zzfmlxs的博客 92

微服务集成cas_Spring Cloud(四) Spring Cloud Security集成CAS (单点登录)对微服务认证...

一、前言由于leader要求在搭好的spring cloud 框架中加入对微服务的认证包括单点登录认证,来确保系统的安全,所以研究了Spring Cloud Security这个组件。在前面搭好的demo中,如何确保微服务的安全,为整个系统添加安全控制,就需要用到Spring Cloud Security。用户通过服务网关zuul来访问任何一个微服务的时候,都需要跳转到第三方的认证比如github...

weixin_39733232的博客 414

YOLOv11在RK3588芯片上的NPU加速与INT8量化部署全面指南

RK3588 NPU适配YOLOv11的关键技术要点 摘要:本文详细分析了Rockchip RK3588 NPU的硬件架构特性及其对YOLOv11模型的适配优化方案。RK3588 NPU采用三核设计,具备6TOPS算力,包含192个MAC单元和128KB专用SRAM。YOLOv11作为最新目标检测模型,其CSPNet-v5骨干网络、PANet特征金字塔和SiLU激活函数需要特殊适配处理。文章系统介绍了从PyTorch模型导出、ONNX优化到RKNN模型转换的完整流程,重点阐述了NPU不支持的算子处理方案和量

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1357

spring-security-cas-client 遇到的坑

spring-security-cas-client 遇到的坑

kingwin28的博客 317

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Security整合CAS实现单点登录

CAS-Client03项目结构图 CAS-Client03项目运行示例 ① 初次访问没有登录会跳转至CAS登录页面 ② 登录成功后 ③ 退出登录 pom.xml依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ...

战丶后风!!的博客 1369

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringSecurity3.X--Cas client 配置之配置session-management遇到的问题

关于“SpringSecurity3.X--Cas client 配置”可以参看SpringSecurity3.X--Cas client 配置   直接说问题吧,就是希望同一时间相同的用户只能有一个访问系统,我理所当然的想到了session-management,在使用SpringSecurity2.x时,直接配置如下即可: &lt;sec:http...

hanqunfeng的专栏 986

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Security---CAS实现单点登录

最近因为一直在用的一个系统,在登录是老是出现某个问题,而这个系统是用CAS实现的单点登录。于是,就又回去重新了解一边CAS的认证流程,以及在Spring Security上的实现。这次回顾,让我对整个流程有了更深入的理解。在这里特意做一个总结和记录。本人的另一篇讲述Spring Security3.1配置的文章,描述的也非常详细。读者可结合两篇文章一起学习。文...

weixin_34060741的博客 381

Spring Security3源码分析-CAS支持

Spring Security3对CAS的支持主要在这个spring-security-cas-client-3.0.2.RELEASE.jar包中 Spring Security和CAS集成的配置资料很多。这里讲解的比较详细 http://lengyun3566.iteye.com/blog/1358323 配置方面,主要为下面的部分: &lt;security:http auto-con...

Dead_Knight的专栏 601

CAS客户端与SpringSecurity集成

1、Spring Security测试工程搭建(1)建立Maven项目casclient_demo3 ,引入spring依赖和spring secrity 相关依赖 ,tomcat端口设置为9003。(2)建立web.xml ,添加过滤器等配置。(3)创建配置文件spring-security.xml。 (4)添加html页面。2、Spring Security与 CAS集成    (1)引入依赖...

魔法革1996 3812

SpringSecurity3.X--Cas client 配置

目录 SpringSecurity3.X--一个简单实现 SpringSecurity3.X--前台与后台登录认证 SpringSecurity3.X--remember-me SpringSecurity3.X--验证码   最近参照springsecury3.x的官方帮助文档,对cas客户端进行了配置,确实与springsecurit...

hanqunfeng的专栏 263

Spring Zuul和Spring Security的整合

照搬了https://blog.csdn.net/WiLL_XS/article/details/104894724这篇文章的代码,先谢谢这位老哥,在这些代码的基础上根据自己的需求简化了很多 pom.xml: <!--zuul 网关组件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId&gt

weixin_43900374的博客 2052

spring security+cas 单点登录示例(单点退出)

版本说明 6.0及以上需要jdk11,如果你是jdk8,最高只能用5.3版本 5.3以下版本的是maven工程,6.0以上改成gradle工程了 这里基于5.3版本搭建 原理 服务端搭建 下载源码 https://github.com/apereo/cas-overlay-template/tree/5.3 下载官方的cas-overlay-template,在此基础上修改打包,运行。 cas-overlay-template已经集成了springboot,可直接运行。 build之后会在target目录生

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 3514

springSecurity集成cas

cas是Central Authentication Service的简写.提供中央认证服务,实现企业级单点登录.详细参考:https://www.apereo.org/projects/cas .下面是入门测试一.客户端核心配置.package org.exam.config; import org.jasig.cas.client.validation.Cas20ProxyTicketValid

xiejx618的专栏 2624

(二)系统开发单点登录解决方案-CAS整合springSecurity项目实战

咱们接着上一篇的入门接着做4. CAS 客户端与 SpringSecurity 集成 4.1 Spring Security 测试工程搭建 (1)建立 Maven 项目 casclient_demo3 ,引入 spring 依赖和 spring secrity 相关依赖 ,tomcat 端口设置为 9003 (2)建立 web.xml ,添加过滤器等配置 (3)创建配置文件 spring-secu...

oschina_41740100的博客 2066
上一篇: 学习笔记:微服务-5.spring zuul
下一篇: 学习笔记:微服务-7 了解spring cloud架构
领尚
博客等级 码龄14年 1143粉丝 271原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值