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个过滤器,就是这些过滤器帮我完成了登录、校验、登出的功能。先看下类和属性:
- 首先,@Configuration表明这是一个配置类,它也会被Spring容器管理起来
- @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:校验过滤器
- 使用@Bean 注解表明myBean需要交给Spring进行管理,未指定bean 的名称,默认采用的是方法名,因此,产生了一个FilterRegistrationBean,名称为casValidationFilter。同样,你仍然可以使用@Service(value=” casValidationFilter”)声明一个bean。
- @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.实现自定义的自动配置有如下几步:
- 创建一个注解:EnableXXXX,并且使用注解:@Import(XXXConfiguration.class)
- 创建XXXConfiguration配置类,加上注解@Configuration,表明这是一个配置类,表明将@Bean注解可用于初始化相关类
- 创建XXXConfigurationProperties类,加上@ConfigurationProperties注解,表明和applciation.properties文件的属性一一对应,在第二步中,加入@EnableConfigurationProperties(XXXConfigurationProperties.class)注解,可以交给spring管理。
- 创建XXxConfigurer接口,以便提供给第三方开发者实现某些逻辑,即对修改关闭,对扩展开放。此类可选。
- 在启动类上加入第一步创建的EnableXXXX注解,即可使用。
2. 注解学习:
- @Import(CasClientConfiguration.class):将某个类交给spring管理
- @ConfigurationProperties可以和@EnableConfigurationProperties配套使用,表示启用某个配置文件,交给spring管理。
- @NonNull:可用于属性上,表示此属性不能为空
- @ConfigurationProperties(prefix = "cas", ignoreUnknownFields = false),指定配置文件中前缀,并且不能有其他的未知配置定义,属性可以和@NonNull结合使用。
- @NonNull:可用于属性上,表示此属性不能为空。
- @Configuration 和@Bean配套使用,@Configuration表明这是一个配置类,在方法上加上@Bean表明此方法的返回值交给spring管理,并且默认的值为方法名。
- @ConditionalOnProperty(prefix = "cas", name = "skipTicketValidation", havingValue = "false")与@Bean结合使用,可以条件化的配置某个bean是否初始化
以上是 Springboot整合Cas客户端源码解析 的全部内容, 来源链接: utcz.com/z/518667.html