前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

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

WX20180312-191623

2、下载代码

ContactAuthor