概述
cas-server默认的可用信息只有用户名, 如果我还想知道他的角色类型等其它属性,这时候就需要做一些配置了。其它代码编写代码方式这里不做介绍,只做简单配置的方式介绍。
想了解更多,请查看我的以往文章。
配置JDBC返回多属性
首先我们在resources下面application.properties中开启服务配置,这里以Json配置为例。
然后再在pom.xml文件中开启Json依赖包和属性返回依赖包,同时注释掉无关的包。
<!-- Json Service Registry -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-json-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
<!-- Authentication Attributes -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-authentication-attributes</artifactId>
<version>${cas.version}</version>
</dependency>
<dependentWarExcludes>
<!-- 让war包下的json不初始化 -->
**/services/*.json
</dependentWarExcludes>
具体的Json配置文件如下:
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|imaps|http)://.*",
"name" : "web",
"id" : 10000001,
"evaluationOrder" : 10,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"enabled" : true,
"ssoEnabled" : true
},
"attributeReleasePolicy": {
"@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
},
"theme": "tongyao"
}
在这里我们添加如下的配置:
"attributeReleasePolicy": {
"@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
}
这个配置就是Return All模式,返回所有的相关配置了的属性。如果我们要限制某些属性的返回,可以配置如下:
"attributeReleasePolicy" : {
"@class" : "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
"allowedAttributes" : [ "java.util.ArrayList", [ "username", "mail" ] ]
}
这里的意思就是只让username和email进行返回。
接着我们开启JDBC认证和JDBC多属性返回情况,如下:
JDBC认证配置:
##
# JDBC配置
#
#查询账号密码SQL,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from user where username=?
#指定上面的SQL查询字段名(必须)
cas.authn.jdbc.query[0].fieldPassword=password
#指定过期字段,1为过期,若过期不可用
cas.authn.jdbc.query[0].fieldExpired=expired
#为不可用字段段,1为不可用,需要修改密码
cas.authn.jdbc.query[0].fieldDisabled=disabled
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#数据库dialect配置
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库用户密码
cas.authn.jdbc.query[0].password=123
#数据库事务自动提交
cas.authn.jdbc.query[0].autocommit=false
#数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#超时配置
cas.authn.jdbc.query[0].idleTimeout=5000
重启CAS服务,CAS使用原来代码的模板登录,并且使用JDBC认证。
JDBC多属性配置:
单行属性配置
#单行属性
cas.authn.attributeRepository.jdbc[0].attributes.username=username
cas.authn.attributeRepository.jdbc[0].attributes.password=password
cas.authn.attributeRepository.jdbc[0].attributes.email=email
cas.authn.attributeRepository.jdbc[0].singleRow=true
cas.authn.attributeRepository.jdbc[0].order=0
cas.authn.attributeRepository.jdbc[0].requireAllAttributes=true
# cas.authn.attributeRepository.jdbc[0].caseCanonicalization=NONE|LOWER|UPPER
# cas.authn.attributeRepository.jdbc[0].queryType=OR|AND
cas.authn.attributeRepository.jdbc[0].sql=SELECT * FROM user WHERE {0}
cas.authn.attributeRepository.jdbc[0].username=username
#数据库连接
cas.authn.attributeRepository.jdbc[0].url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#数据库dialect配置
cas.authn.attributeRepository.jdbc[0].dialect=org.hibernate.dialect.MySQLDialect
#数据库用户名
cas.authn.attributeRepository.jdbc[0].user=root
#数据库用户密码
cas.authn.attributeRepository.jdbc[0].password=123
#数据库事务自动提交
cas.authn.attributeRepository.jdbc[0].autocommit=false
#数据库驱动
cas.authn.attributeRepository.jdbc[0].driverClass=com.mysql.jdbc.Driver
#超时配置
cas.authn.attributeRepository.jdbc[0].idleTimeout=5000
cas.authn.attributeRepository.jdbc[0].ddlAuto=none
cas.authn.attributeRepository.jdbc[0].leakThreshold=10
cas.authn.attributeRepository.jdbc[0].batchSize=1
cas.authn.attributeRepository.jdbc[0].dataSourceProxy=false
然后启动官方的客户端Demo,登录后可以发现我们配置的属性都出来了。
JSON服务不明的话,可以看看我文章:springboot 集成cas5.3 配置及管理JSON Service服务这个文章详细讲解了JSON服务注册管理。
在这里插入图片描述
比如现在我有一张user_attrs表,分别是同一个用户不同角色对应在不同公司任职。这里就会使用到多行的属性返回。
多行属性配置
#多行属性
cas.authn.attributeRepository.jdbc[1].attributes.admin=admin_multi
cas.authn.attributeRepository.jdbc[1].attributes.dev=dev_multi
cas.authn.attributeRepository.jdbc[1].attributes.user=user_multi
cas.authn.attributeRepository.jdbc[1].columnMappings.role=company
cas.authn.attributeRepository.jdbc[1].singleRow=false
cas.authn.attributeRepository.jdbc[1].order=1
cas.authn.attributeRepository.jdbc[1].requireAllAttributes=true
# cas.authn.attributeRepository.jdbc[1].caseCanonicalization=NONE|LOWER|UPPER
# cas.authn.attributeRepository.jdbc[1].queryType=OR|AND
cas.authn.attributeRepository.jdbc[1].sql=SELECT * FROM user_attrs WHERE {0}
cas.authn.attributeRepository.jdbc[1].username=username
#数据库连接
cas.authn.attributeRepository.jdbc[1].url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#数据库dialect配置
cas.authn.attributeRepository.jdbc[1].dialect=org.hibernate.dialect.MySQLDialect
#数据库用户名
cas.authn.attributeRepository.jdbc[1].user=root
#数据库用户密码
cas.authn.attributeRepository.jdbc[1].password=123
#数据库事务自动提交
cas.authn.attributeRepository.jdbc[1].autocommit=false
#数据库驱动
cas.authn.attributeRepository.jdbc[1].driverClass=com.mysql.jdbc.Driver
#超时配置
cas.authn.attributeRepository.jdbc[1].idleTimeout=5000
cas.authn.attributeRepository.jdbc[1].ddlAuto=none
cas.authn.attributeRepository.jdbc[1].leakThreshold=10
cas.authn.attributeRepository.jdbc[1].batchSize=1
cas.authn.attributeRepository.jdbc[1].dataSourceProxy=false
同样的,重新启动我们的CAS服务端,发现达到我们的要求了,返回了多个属性值。
客户端获取多属性方法
@RequestMapping("/getUserInfo")
@ResponseBody
public String getUserInfo(HttpSession session){
Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION);
AttributePrincipal principal = assertion.getPrincipal();
return principal ;
}
也可以使用官方示例demo传送门,我这个文章有做讲解
登录成功,返回官方示例demo后出现的参数。
自定义认证返回多属性
springboot 集成cas5.3 实现自定义认证策略。详细讲解了自定义认证策略
在返回对象的时候,添加HashMap即可。
对应的JSON服务也添加配置
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|http)://localhost:8083.*",
"name" : "demo3",
"id" : 10000006,
"description" : "允许demo3-单点退出 访问",
"evaluationOrder" : 10
/*多属性返回,大坑:返回的时候,json里一定要跟自定义认证策略里的map值一致*/
,"attributeReleasePolicy" : {
/*全部返回*/
"@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy",
/*只返回指定属性*/
/*"@class" : "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
"allowedAttributes" : [ "java.util.ArrayList", [ "username", "password" ] ]*/
}
}
需要注意,attributeReleasePolicy下的
#全部返回
org.apereo.cas.services.ReturnAllAttributeReleasePolicy
#只返回指定属性
org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy
"allowedAttributes" : [ "java.util.ArrayList", [ "username", "password" ] ]
关于cas更多信息,可以查看我以往文章。