Springboot整合Cas客户端源码解析

编程

前言:

Springboot整合Cas客户端源码解析,版本:5.3

官方已经整合好了,直接引用maven坐标,在application.properties中定义相关参数,就可以使用了,非常方便。

<dependency>

<groupId>org.jasig.cas.client</groupId>

<artifactId>cas-client-support-springboot</artifactId>

</dependency>

具体使用,参见:https://shimo.im/docs/QVyJgqdjHVdP9D3G/

 Pom.xml核心依赖:

<dependency>

<groupId>org.jasig.cas.client</groupId>

<artifactId>cas-client-core</artifactId>

<version>${project.version}</version>

</dependency>

<dependency>

<groupId>org.jasig.cas.client</groupId>

<artifactId>cas-client-support-saml</artifactId>

<version>${project.version}</version>

</dependency>

Cas-client-core包含认证和校验等核心功能。其具体是如何认证和校验的,参见:

cas-client-support-saml 提供对saml认证的功能

此工程相当简单,总共就一个包,4个类,结构清晰,下面简单说明下各个类的作用

 

  • EnableCasClient : 注解类,可以用在任何有@Configuration注解的类上,表示启用cas client;
  • CasClientConfigurer: 接口类,以供用户实现相关接口,添加自己的逻辑
  • CasClientConfigurationProperties:属性配置类,和配置文件的内容一一对应
  • CasClientConfiguration:注入核心的过滤器,初始化参数

下面详细接说各个类是如何工作的:

1. EnableCasClient

 

 

  • 包含一个属性ValidationType,说明校验类型支持3个枚举选项,可以不指定,默认是cas3
  • @Import(CasClientConfiguration.class),这个就非常重要了,它说明需要将CasClientConfiguration类交给spring容器管理,这里扩展一下:通常我们在某个类上注解了@Service,@component等,spring就会帮我们初始化(IOC),但是有个前提,这个类的包名一定要是在启动类(有@SpringbootApplication)下才会生效。如果不是,则需要我们显示的指定,@Import就是这个作用。

 

2. CasClientConfiguration

这个类是最重量级的配置了,它注入了5个过滤器,就是这些过滤器帮我完成了登录、校验、登出的功能。先看下类和属性:

 

  1. 首先,@Configuration表明这是一个配置类,它也会被Spring容器管理起来
  2. @EnableConfigurationProperties(CasClientConfigurationProperties.class):启用配置类:CasClientConfigurationProperties,其核心目的就是将CasClientConfigurationProperties交给spring管理,相当于在CasClientConfigurationProperties类上加了一个注解@Service或者@Component。

 

或许有读者问,为什么不直接在CasClientConfigurationProperties类上加@Service/ Component呢?答案就是:这是一种规约,对于属性配置类推荐用@EnableConfigurationProperties进行依赖反转。spring的自动配置都是采用此注解使其生效的,而且这样其含义也更加明显:这是一个属性配置,而不是一个服务(service)或者 组件(component)或者控制器(controller)

 

3. 注入了CasClientConfigurationProperties类,上面说了它已经被spring容器管理起来了,所以可以直接通过@Autowired依赖注入(DI)。

4. 引入了CasClientConfigurer类,这是个接口,@Autowired(required = false)表示如果有实现类的话,就会注入进来。并且只能由一个实现,否则抛异常。

   

过滤器注入,下面看5个过滤器是如何注入的:

3. CasValidationFilter:校验过滤器

 

  1. 使用@Bean 注解表明myBean需要交给Spring进行管理,未指定bean 的名称,默认采用的是方法名,因此,产生了一个FilterRegistrationBean,名称为casValidationFilter。同样,你仍然可以使用@Service(value=” casValidationFilter”)声明一个bean。
  2. @ConditionalOnProperty(prefix = "cas", name = "skipTicketValidation", havingValue = "false", matchIfMissing = true)

配置文件中,前缀为cas,名称为skipTicketValidation,其值为false,组合起来就是:

cas. skipTicketValidation=false,如果没有这个配置,cas. skipTicketValidation=true。

符合这个条件,那么就加载这个bean,否则就不加载,那根据上面的条件,这个类一定会被初始化。

3. 如果配置文件中指定了校验类型,就new 一个对应的校验器,否则使用默认的Cas30ProxyReceivingTicketValidationFilter

4. 初始化:

传入相关参数,通过initFilter进行初始化,看下这个方法做了些什么:

参数详解:

filterRegistrationBean:过滤器bean,即上面提到的casValidationFilter Bean

targetFilter: 真正的过滤器类—Cas30ProxyReceivingTicketValidationFilter,

filterOrder: 过滤器的顺序,值越小,优先级越高,

initParams:此过滤器的初始化参数

urlPatterns:此过滤器拦截哪些url,支持正则表达

 

这就说明了FilterRegistrationBean将以上几个参数进行封装,此验证过滤器的优先级为1,是最先执行的,根据配置文件内容将相关参数初始化。具体的参数说明,参见: https://shimo.im/docs/8PVwxww3wC3HwRCy

 

最后,如果有CasClientConfigurer的实现,则调用其实现的验证逻辑。后面其他的几个逻辑实现都是这个步骤,创建过滤器—初始化—调用其实现类,因此后面的过滤器就简单说明下。

4. casAuthenticationFilter:认证过滤器

 

根据参数配置创建对应的认证实现类:如果是cas/cas3就创建AuthenticationFilter,否则创建Sam11AuthenticationFilter,其优先级为2,将登录路径放入配置中。

5. CasSingleOutFilter: 登出过滤器

如果cas.single-logout.enabled=true,则创建此过滤器,并且其优先级最高。

 

其他的过滤器都比较简单,不再赘述。因此这些过滤器的顺序为:

casSingleSignOutFilter

casValidationFilter

casAuthenticationFilter

casHttpServletRequestWrapperFilter

casAssertionThreadLocalFilter

 

3. CasClientConfigurationProperties:Cas配置文件

 

此类通过@ConfigurationProperties(prefix = "cas", ignoreUnknownFields = false)进行注解,说明:

在配置文件中,只找以cas 开头的配置,不允许有其他未知的属性,否则将无法启动程序,所有自定义属性一定不能以cas开头,仅这一个注解还不能由spring管理,所以,前面我们提到在CasClientConfiguration类中需要使用注解:@EnableConfigurationProperties(CasClientConfigurationProperties.class),这样其他类就可以注入了此类了。显然,你可以在这个类中加入注解: @Service,但是这种方式不推荐。

 

  • serverUrlPrefix:必填,服务端url前缀,比如:https://example.com/cas
  • serverLoginUrl:必填,服务端的登录路径,比如:https://example.com/cas/login
  • clientHostUrl:必填,客户端的url: https://myclient.example.com
  • authenticationUrlPatterns: 选填,认证的url,可支持正则表达式

其他的属性略。

 

4. CasClientConfigurer

客户端的实现接口,可通过此接口实现自己的逻辑,最终会在各种过滤器初始化的最后一步调用,注意,只能有一个实现类。

比如,忽略某些url,不认证。

自定义一个类CasAutoConfigExt 实现CasClientConfiguer ,覆写 configureAuthenticationFilter方法,通过ignorePattern属性添加白名单url。

 

5. 总结

1.实现自定义的自动配置有如下几步:

    1. 创建一个注解:EnableXXXX,并且使用注解:@Import(XXXConfiguration.class)
    2. 创建XXXConfiguration配置类,加上注解@Configuration,表明这是一个配置类,表明将@Bean注解可用于初始化相关类
    3. 创建XXXConfigurationProperties类,加上@ConfigurationProperties注解,表明和applciation.properties文件的属性一一对应,在第二步中,加入@EnableConfigurationProperties(XXXConfigurationProperties.class)注解,可以交给spring管理。
    4. 创建XXxConfigurer接口,以便提供给第三方开发者实现某些逻辑,即对修改关闭,对扩展开放。此类可选。
    5. 在启动类上加入第一步创建的EnableXXXX注解,即可使用。

2. 注解学习:

  1. @Import(CasClientConfiguration.class):将某个类交给spring管理
  2. @ConfigurationProperties可以和@EnableConfigurationProperties配套使用,表示启用某个配置文件,交给spring管理。
  3. @NonNull:可用于属性上,表示此属性不能为空
  4. @ConfigurationProperties(prefix = "cas", ignoreUnknownFields = false),指定配置文件中前缀,并且不能有其他的未知配置定义,属性可以和@NonNull结合使用。
  5. @NonNull:可用于属性上,表示此属性不能为空。
  6. @Configuration 和@Bean配套使用,@Configuration表明这是一个配置类,在方法上加上@Bean表明此方法的返回值交给spring管理,并且默认的值为方法名。
  7. @ConditionalOnProperty(prefix = "cas", name = "skipTicketValidation", havingValue = "false")与@Bean结合使用,可以条件化的配置某个bean是否初始化

以上是 Springboot整合Cas客户端源码解析 的全部内容, 来源链接: utcz.com/z/518667.html

回到顶部