CAS 实现站内单点登录及实现第三方 OAuth、OpenId 登录(三)

本文详细介绍了如何在CAS (Central Authentication Service) 中配置用户信息,包括用户基本信息的获取及多条件登录设置等,有助于提高系统的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概括

    在大多数情况下,随着用户登录系统后,用户 ID、用户名、E-mail、用户头像等等基本信息,需要被使用直到用户退出系统。

    CAS Server 默认情况下,成功登录后,只会返回用户标示(通常是用户名)给 CAS Client。这时,各个 Client 还需要根据用户标示,去查询用户其它信息,这时如果如果 CAS Server 统一将这些信息返回给 Client 了,各个 Client 就无需再次进行查询了。

二、配置

    修改 deployerConfigContext.xml

  1. 修改

    <bean id="attributeRepositoryDao" class="com.buession.cas.service.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
        <property name="jdbcTemplate" ref="slaveJdbcTemplate" />
        <property name="queryTemplate" value="SELECT * FROM `member` WHERE {0} LIMIT 1" />
        <property name="queryAttributeMapping">
            <map>
                <entry key="username" value="username" />
            </map>
        </property>
        <property name="resultAttributeMapping">
            <map>
                <!-- key 对应数据库字段名,value 为查询结果转换为 Map 的 key -->
                <entry key="id" value="id" />
                <entry key="username" value="username" />
                <entry key="email" value="email" />
                ... ...
            </map>
        </property>
    </bean>

    SQL 语句最终会转换为: SELECT * FROM `member` WHERE username(queryAttributeMapping Map Entry 中的 value) = '登录表单中的 username'  LIMIT 1

  2. 修改

    <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
        <property name="registeredServices">
            <list>
                <bean class="org.jasig.cas.services.RegexRegisteredService">
                    ... ...
                    <property name="ignoreAttributes" value="true" />
                    <!-- 或者 -->
                    <property name="allowedAttributes">
                        <list>
                            <!--
                            value 的值对应 attributeRepositoryDao resultAttributeMapping 的 entry 的 value 属性
                            只有这里定义了元素,才会真正从 resultAttributeMapping 返回给 client
                            -->
                            <value>id</value>
                            <value>username</value>
                            <value>email</value>
                            ... ...
                        </list>
                    </property>
                </bean>
                ... ...
            </list>
        </property>
    </bean>

    当 ignoreAttributes 为 true 时,则返回获取到的全部用户信息给 CAS Client,而不根据 “allowedAttributes” 对结果进行过滤

  3. 假设是多条件登录,则需要修改

    <bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">
        ... ...
        <property name="authenticationHandlers">
            <list>
                <bean class="com.domain.authentication.handler.DatabaseAuthenticationHandler">
                    <property name="jdbcTemplate" ref="slaveJdbcTemplate" />
                    <property name="sql" value="SELECT `username`, ...... FROM `member` WHERE `username` = ? OR `email` = ? OR `mobile` = ?" />
                    <property name="passwordEncoder" ref="passwordEncoder" />
                </bean>
            </list>
        </property>
    </bean>
    class DatabaseAuthenticationHandler extends com.buession.cas.authentication.handler.support.DatabaseQueryAuthenticationHandler {
    
        @Override
        protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials)
                throws AuthenticationException {
            ... ...
            try {
                ... ...
                if (valid(username, password, r, passwordEncoder) == true) {
                    credentials.setUsername((String) r.get("username"));
                    return ture;
                }
            } catch (IncorrectResultSizeDataAccessException e) {
            }
    
            return false;
        }
    
    }

    登录验证 SQL 语句中,你必需得返回与 queryAttributeMapping Map 中 value 一致的字段,然后在 DatabaseAuthenticationHandler.authenticateUsernamePasswordInternal 中验证成功后,重新赋值给 UsernamePasswordCredentials 的 username,以方便根据一个唯一的用户值去查询更多的用户信息。

  4. 在模板文件 WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp 中添加

    <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
        <cas:attributes>
            <c:forEach var="r" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
                <cas:${fn:escapeXml(r.key)}>${fn:escapeXml(r.value)}</cas:${fn:escapeXml(r.key)}>
            </c:forEach>
        </cas:attributes>
    </c:if>

三、结果

122124_HikZ_154297.jpg
注意:cas:user 是登录表单中输入的 username,可能是用户名、e-mail、手机号码等等

转载于:https://my.oschina.net/eduosi/blog/206114

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值