5、接2.md_CAS从服务端的获取参数多行
前言
Github:https://github.com/HealerJean
1、人无完人,谁都会犯错,我犯的错误就是在文档2018-03-11-2_MD5-加盐校验-自定义密码校验-rest密码校验-客户端登录具体参数
关于返回的具体参数还缺少一部分内容。而且正好上一节做了第三方登录。也是获取具体参数的,更加详细。这个时候的代码我们还是利用 4、中的代码继续。如果朋友们有需要可以自己将本代码的内容整合到2中。
1.1、获取更多的参数-多行
也就是说返回一个类似于一个name为school,但是它里面包含很多其他的值,比如包含,大连工业大学,清华大学,北京大学
1、创建多行数据库表和之前的sys_user_rest_salt
表进行关联
-- 这个具体的返回,我还是按照之前rest随机盐查询的数据库开始,
-- 也就是说主用户表依旧是sys_user_rest_salt,根据主表中的邮箱确定本从表sys_user_rest_salt_attrs
/*
* 用户属性表
*/
CREATE TABLE sys_user_rest_salt_attrs (
EMAIL VARCHAR(100) NOT NULL,
ATTR_KEY VARCHAR(50) NOT NULL,
ATTR_VAL VARCHAR(100) NOT NULL
);
# ---用户属性表
INSERT INTO sys_user_rest_salt_attrs VALUES ('mxzdhealer@gmail.com', 'group', '软件研究所');
INSERT INTO sys_user_rest_salt_attrs VALUES ('mxzdhealer@gmail.com', 'group', '计算机132');
INSERT INTO sys_user_rest_salt_attrs VALUES ('mxzdhealer@gmail.com', 'school', '大连工业大学');
INSERT INTO sys_user_rest_salt_attrs VALUES ('mxzdhealer@gmail.com', 'school', '北京大学');
INSERT INTO sys_user_rest_salt_attrs VALUES ('mxzdhealer@gmail.com', 'school', '清华大学');
INSERT INTO sys_user_rest_salt_attrs VALUES ('zhangsan@gmail.com', 'group', 'DEV_ROLE');
1.2、通过单行的返回值确定多行
# 6、服务端返回客户端详细的用户信息
cas.authn.attributeRepository.jdbc[0].singleRow=true
cas.authn.attributeRepository.jdbc[0].order=0
cas.authn.attributeRepository.jdbc[0].url=jdbc:mysql://localhost:3306/casnew?allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
cas.authn.attributeRepository.jdbc[0].user=root
cas.authn.attributeRepository.jdbc[0].password=123456
#username 返回登录的时候的提供的用户名,配置为和数据库一致,观察ddkj即可发现这里配置的为email,主要看登录的是什么,也就是查询条件
cas.authn.attributeRepository.jdbc[0].username=email
#使用邮箱登录的
cas.authn.attributeRepository.jdbc[0].sql=select * from sys_user_rest_salt where email=?
# 下面这里为配置要返回的信息,要返回的信息为email,address
cas.authn.attributeRepository.jdbc[0].attributes.id=id
cas.authn.attributeRepository.jdbc[0].attributes.email=email
cas.authn.attributeRepository.jdbc[0].attributes.address=address
cas.authn.attributeRepository.jdbc[0].dialect=org.hibernate.dialect.MySQL5Dialect
cas.authn.attributeRepository.jdbc[0].ddlAuto=none
cas.authn.attributeRepository.jdbc[0].driverClass=com.mysql.jdbc.Driver
cas.authn.attributeRepository.jdbc[0].leakThreshold=10
cas.authn.attributeRepository.jdbc[0].propagationBehaviorName=PROPAGATION_REQUIRED
cas.authn.attributeRepository.jdbc[0].batchSize=1
cas.authn.attributeRepository.jdbc[0].healthQuery=SELECT 1
cas.authn.attributeRepository.jdbc[0].failFast=true
# 后来补充的,6.2、根据上面的单行,生成下面的多行
cas.authn.attributeRepository.jdbc[1].singleRow=false
cas.authn.attributeRepository.jdbc[1].order=0
cas.authn.attributeRepository.jdbc[1].url=jdbc:mysql://localhost:3306/casnew?allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
cas.authn.attributeRepository.jdbc[1].user=root
cas.authn.attributeRepository.jdbc[1].password=123456
#username 返回登录的时候的提供的用户名,配置为和数据库一致,观察ddkj即可发现这里配置的为email
# ,主要看登录的是什么,从网上理解也就是查询条件,不太懂,反正理解成登录什么就是什么吧。没错
cas.authn.attributeRepository.jdbc[1].username=email
#使用邮箱登录的
cas.authn.attributeRepository.jdbc[1].sql=select * from sys_user_rest_salt_attrs where email=?
#多行,返回的多行名字,确定数据中的字段是,attributes.group、school
cas.authn.attributeRepository.jdbc[1].attributes.group=group_multi
cas.authn.attributeRepository.jdbc[1].attributes.school=school_multi
#键值对
cas.authn.attributeRepository.jdbc[1].columnMappings.ATTR_KEY=ATTR_VAL
cas.authn.attributeRepository.jdbc[1].dialect=org.hibernate.dialect.MySQL5Dialect
cas.authn.attributeRepository.jdbc[1].ddlAuto=none
cas.authn.attributeRepository.jdbc[1].driverClass=com.mysql.jdbc.Driver
cas.authn.attributeRepository.jdbc[1].leakThreshold=10
cas.authn.attributeRepository.jdbc[1].propagationBehaviorName=PROPAGATION_REQUIRED
cas.authn.attributeRepository.jdbc[1].batchSize=1
cas.authn.attributeRepository.jdbc[1].healthQuery=SELECT 1
cas.authn.attributeRepository.jdbc[1].failFast=true
1.3、使用第三方登录的工程sso-client-pac4j登录测试
方法也一样,只不过请求的url名字变了而已变成了limitGetAttribute ,启动
sso-server 8443
sso-server-rest 8888
sso-server-pac4j 8003
@GetMapping("limitGetAttribute")
@ResponseBody
public String limitGetAttribute(HttpServletRequest request){
if (request.getUserPrincipal() != null) {
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
final Map attributes = principal.getAttributes();
if (attributes != null) {
Iterator attributeNames = attributes.keySet().iterator();
if (attributeNames.hasNext()) {
for (; attributeNames.hasNext(); ) {
String name = (String) attributeNames.next();
System.out.printf("name:"+name+"-------");
final Object attributeValue = attributes.get(name);
if (attributeValue instanceof List) {
final List values = (List) attributeValue;
for (Object value : values) {
System.out.printf("value:"+value+"|");
}
System.out.printf("|");
} else {
System.out.printf(attributeValue.toString());
}
System.out.println("------------");
}
} else {
System.out.println("No attributes are supplied by the CAS server.</p>");
}
} else {
System.out.println("<pre>The attribute map is empty. Review your CAS filter configurations.</pre>");
}
} else {
System.out.println("<pre>The user principal is empty from the request object. Review the wrapper filter configuration.</pre>");
}
String user3 = AssertionHolder.getAssertion().getPrincipal().getName();
System.out.println("3、AssertionHolder.getAssertion().getPrincipal().getName()"+user3);
return "github";
}
2、浏览器请求: http://casclientpac4j:8083/limitGetAttribute 登录成功之后观察客户端控制台
name:group_multi-------value:软件研究所|value:计算机132||------------
name:address-------山西忻州------------
name:isFromNewLogin-------true------------
name:authenticationDate-------2018-03-12T19:14:53.457+08:00[Asia/Shanghai]------------
name:authenticationMethod-------RestAuthenticationHandler------------
name:successfulAuthenticationHandlers-------RestAuthenticationHandler------------
name:school_multi-------value:北京大学|value:清华大学|value:大连工业大学||------------
name:longTermAuthenticationRequestTokenUsed-------false------------
name:id-------1------------
name:email-------mxzdhealer@gmail.com------------
3、AssertionHolder.getAssertion().getPrincipal().getName()mxzdhealer@gmail.com
2、下载代码