CAS客户端使用SpringSecurity访问CAS发布的属性
摘要
- CAS服务端基于cas-overlay-template-5.3.14,已实现基于jdbc的自定义登录策略、验证码、动态service配置、多属性返回,等等
- CAS客户端基于spring-boot-2.3.3.RELEASE,spring-security-cas-5.3.4.RELEASE
- 本文代码地址:https://github.com/hanqunfeng/springbootchapter/tree/master/chapter36
- 其重点是client的UserDetailsService的实现类要继承自AbstractCasAssertionUserDetailsService
cas服务配置
-
如果是json配置方式:services目录下需要为每个客户端配置一个json文件,如client1-10000005.json
1 | { |
cas多属性返回
-
services的json文件中要增加如下配置
1 | # 返回全部配置属性 |
动态service
1 | 如果使用代码的方式维护service,则也要根据情况来创建返回策略, |
-
配置属性
1 | # 动态services配置 |
-
这里说一下delete异常的问题,可以引入jdbcTemplate直接操作数据表,参考chapter36/cas-overlay-template-5.3.14/src/main/java/com/cas/config/DataSourceConfig.java
1 | List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from regexregisteredservice where serviceId = '" + serviceId + "'"); |
基于配置文件返回属性
1 | ##################################################### |
代码实现返回属性内容
-
这个需要结合自定义登录策略来实现,代码参考:chapter36/cas-overlay-template-5.3.14/src/main/java/com/cas/security/CustomerHandlerAuthentication.java,注意要关闭配置文件的登录策略,否则会失效
-
注册自定义登录策略,代码参考:chapter36/cas-overlay-template-5.3.14/src/main/java/com/cas/config/CustomAuthenticationConfig.java
-
然后将其加入自动配置中,chapter36/cas-overlay-template-5.3.14/src/main/resources/META-INF/spring.factories
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
cas-client-springsecurity
-
这里说一下,如果不使用springsecurity,而是直接依赖cas-client,其获取cas返回属性的方式
1 | Principal principal = request.getUserPrincipal(); |
-
使用springsecurity的配置类代码参考:chapter36/springsecurity-client-demo/src/main/java/com/example/springsecuritydemo/config/WebSecurityConfigByCASByAttrs.java
1 | /** |
-
UserDetailsServiceImplByAttrs的重点就是要继承AbstractCasAssertionUserDetailsService,而不是实现UserDetailsService
1 | //实际可以接收的属性 |
-
这里说一下AbstractCasAssertionUserDetailsService,它有一个实现类GrantedAuthorityFromAssertionAttributesUserDetailsService
不过其将返回数据都做为用户的权限了,所以其只是用来从服务器端获取用户权限使用
1 | CasAuthenticationToken principal = (CasAuthenticationToken) request.getUserPrincipal(); |
-
如果希望灵活使用cas返回属性,则需要自定义实现类,笔者这里将获取到的属性map存储到自定义的CustomerUser属性中了
-
代码中使用属性
1 | #获取登录的用户名称 |