`

单点登录 - CAS【四】获取更全面的用户信息(续)

 
阅读更多

       在上一篇文章单点登录 - CAS【四】获取更全面的用户信息中提到 配置attributeRepository

<!-- 组装sql用的查询条件属性 -->	
		<property name="queryAttributeMapping">
			<map>
			    <!-- key必须是uername而且是小写否则会导致取不到用户的其它信息,value对应数据库用户名字段,系统会自己匹配 -->
				<entry key="username" value="login_name" />
			</map>
		</property>

 key="username"必须是“username”,为什么会是一个定值哪?现在分析下:

 

 1、查看org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao源代码

 

 

2、通过SingleRowJdbcPersonAttributeDao找到父类AbstractJdbcPersonAttributeDao

 

 

3、通过AbstractJdbcPersonAttributeDao找到父类AbstractDefaultAttributePersonAttributeDao

     看下关键的代码:

    

public abstract class AbstractDefaultAttributePersonAttributeDao extends AbstractFlatteningPersonAttributeDao {
    private IUsernameAttributeProvider usernameAttributeProvider = new SimpleUsernameAttributeProvider();

    /**
     * @see org.jasig.services.persondir.IPersonAttributeDao#getPerson(java.lang.String)
     * @throws org.springframework.dao.IncorrectResultSizeDataAccessException if more than one matching {@link IPersonAttributes} is found.
     */
    public IPersonAttributes getPerson(String uid) {
        Validate.notNull(uid, "uid may not be null.");
        
        //Generate the seed map for the uid
        final Map<String, List<Object>> seed = this.toSeedMap(uid);
        
        //Run the query using the seed
        final Set<IPersonAttributes> people = this.getPeopleWithMultivaluedAttributes(seed);
        
        //Ensure a single result is returned
        IPersonAttributes person = (IPersonAttributes)DataAccessUtils.singleResult(people);
        if (person == null) {
            return null;
        }
        
        //Force set the name of the returned IPersonAttributes if it isn't provided in the return object
        if (person.getName() == null) {
            person = new NamedPersonImpl(uid, person.getAttributes());
        }
        
        return person;
    }


    /**
     * Converts the uid to a multi-valued seed Map using the value from {@link #getDefaultAttributeName()}
     * as the key.
     */
    protected Map<String, List<Object>> toSeedMap(String uid) {
        final List<Object> values = Collections.singletonList((Object)uid);
        final String usernameAttribute = this.usernameAttributeProvider.getUsernameAttribute();
        final Map<String, List<Object>> seed = Collections.singletonMap(usernameAttribute, values);
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Created seed map='" + seed + "' for uid='" + uid + "'");
        }
        return seed;
    }

 

 

发现如下几行

        final List<Object> values = Collections.singletonList((Object)uid);
        final String usernameAttribute = this.usernameAttributeProvider.getUsernameAttribute();
        final Map<String, List<Object>> seed = Collections.singletonMap(usernameAttribute, values);

 

4、获取SQL查询参数

    final String usernameAttribute = this.usernameAttributeProvider.getUsernameAttribute();

    然后找到 IUsernameAttributeProvider.java

   

public class SimpleUsernameAttributeProvider implements IUsernameAttributeProvider {
    private String usernameAttribute = "username";
    
    public SimpleUsernameAttributeProvider() {
    }
    
    public SimpleUsernameAttributeProvider(String usernameAttribute) {
        this.setUsernameAttribute(usernameAttribute);
    }
    
    /**
     * The usernameAttribute to use
     */
    public void setUsernameAttribute(String usernameAttribute) {
        Validate.notNull(usernameAttribute);
        this.usernameAttribute = usernameAttribute;
    }

    /* (non-Javadoc)
     * @see org.jasig.services.persondir.support.IUsernameAttributeProvider#getUsernameAttribute()
     */
    public String getUsernameAttribute() {
        return this.usernameAttribute;
    }

 

 

    private String usernameAttribute = "username";

  发现原因了吧,原来是在这个地方将属性给写死了,不明白为什么非得要将属性给写死哪?

queryAttributeMapping配置在org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao中,那么queryAttributeMapping是其或其父类中的属性,完全可以从属性中获取到想要的属性。

 

--------------------------------------------------------华丽的分割线------------------------------------------------------------------

在查看代码是发现AbstractJdbcPersonAttributeDao.java

public abstract class AbstractJdbcPersonAttributeDao<R> extends AbstractQueryPersonAttributeDao<PartialWhereClause> {
    private static final Pattern WHERE_PLACEHOLDER = Pattern.compile("\\{0\\}");
    
    private final SimpleJdbcTemplate simpleJdbcTemplate;
    private final String queryTemplate;
    private QueryType queryType = QueryType.AND;
    
    /**
     * @param ds The DataSource to use for queries
     * @param queryTemplate Template to use for SQL query generation. Use {0} as the placeholder for where the generated portion of the WHERE clause should be inserted. 
     */
    public AbstractJdbcPersonAttributeDao(DataSource ds, String queryTemplate) {
        Validate.notNull(ds, "DataSource can not be null");
        Validate.notNull(queryTemplate, "queryTemplate can not be null");
        
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(ds);
        this.queryTemplate = queryTemplate;
    }
    
    /**
     * @return the queryTemplate
     */
    public String getQueryTemplate() {
        return queryTemplate;
    }

    /**
     * @return the queryType
     */
    public QueryType getQueryType() {
        return queryType;
    }
    /**
     * Type of logical operator to use when joining WHERE clause components
     * 
     * @param queryType the queryType to set
     */
    public void setQueryType(QueryType queryType) {
        this.queryType = queryType;
    }

 

QueryType queryType = QueryType.AND;

/**
     * Type of logical operator to use when joining WHERE clause components
     *
     * @param queryType the queryType to set
     */
    public void setQueryType(QueryType queryType) {
        this.queryType = queryType;
    }

queryType 是查询逻辑操作符,值为:AND、OR

<constructor-arg index="1" value="select email,name,login_name,password from isc_user where {0}" />

 难道是支持多条件查询?

 

 

而我们在AbstractDefaultAttributePersonAttributeDao.java中发现

final List<Object> values = Collections.singletonList((Object)uid);
final String usernameAttribute = this.usernameAttributeProvider.getUsernameAttribute();
final Map<String, List<Object>> seed = Collections.singletonMap(usernameAttribute, values);

 

where条件后面参数替换

private static final Pattern WHERE_PLACEHOLDER = Pattern.compile("\\{0\\}");

 

这些只会返回单条数据,而不会支持上面的猜想。

 

 

分享到:
评论

相关推荐

    单点登录-cas学习项目源码

    单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。CAS(Central Authentication Service)是耶鲁大学开发的一个开源项目,它提供了一种集中...

    基于Cas的单点登录实现

    **基于Cas的单点登录实现** 单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。它为用户提供了一种方便、高效的访问多系统的方式,同时减少...

    CAS单点登录demo

    其流程主要包括:服务请求、重定向到CAS服务器、用户身份验证、返回Ticket、服务验证Ticket并获取用户信息。 2. CAS组件: - CAS Server:负责处理用户的登录请求,验证用户身份,并生成Ticket。 - CAS Client:...

    单点登录 - CAS【一】

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统或应用中登录后,无需再次认证即可访问其他相互信任的系统。CAS(Central Authentication Service)是 Yale 大学开发的一个开源项目...

    集成cas实现单点登录认证.zip

    在IT行业中,单点登录(Single Sign-On, SSO)是一种常见的身份验证机制,它允许用户在一个系统上登录后,无需再次验证即可访问其他多个相互信任的系统。本压缩包"集成cas实现单点登录认证.zip"显然包含了关于如何...

    用cas实现mantis单点登录和登出

    ### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...

    单点登录cas源码

    单点登录(Single Sign-On, SSO)是一种网络认证机制,允许用户在一次登录后,就能访问多个相互信任的应用系统,而无需再次进行身份验证。CAS(Central Authentication Service)是单点登录的一种实现,它是一个开源...

    单点登录cas服务器demo及springboot客户端demo

    单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在这个场景中,"cas-server"是中央认证服务(Central Authentication Service),...

    CAS单点登录配置

    CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On, SSO)系统,它允许用户通过一个入口点登录,然后在多个应用之间无缝切换,而无需再次验证身份。CAS的目的是...

    sonar-cas-plugin sso认证插件

    CAS是一种开放源码的单点登录(Single Sign-On, SSO)框架,广泛用于企业级应用程序,以简化用户身份验证流程。通过集成Sonar-CAS插件,SonarQube用户能够利用CAS服务进行统一的身份验证,从而在多个应用之间实现...

    cas单点登录客户端--c++版

    CAS(Central Authentication Service)是中央认证服务的缩写,它是一种广泛使用的单点登录(Single Sign-On, SSO)框架,主要用于实现用户在一个系统登录后,可以无须再次验证即可访问其他相互信任的系统。...

    基于springboot,cas5.3,shiro,pac4j,rest接口获取ticket不再跳转cas server登录页

    本文将深入探讨如何利用Spring Boot、CAS 5.3、Shiro、Pac4J这四个强大的工具来构建一个高效且用户友好的REST接口,以获取CAS(Central Authentication Service)票据,避免用户被重定向到CAS服务器的登录页面。...

    struts2+spring+cas单点登录

    使用struts2+spring+cas实现的单点登录功能,里面包括cas-server3.5.2项目一个,cas-client3.2.1 web项目两个,数据库脚本,请按照里面的说明文档进行部署,希望你们也能配置成功。

    单点登录CAS与权限管理框架Shiro集成

    ### 单点登录CAS与权限管理框架Shiro集成 #### 一、概述 单点登录(Single Sign-On,简称SSO)是一种常见的身份验证技术,它允许用户通过一次登录即可访问多个应用程序和服务。这种机制提高了用户体验,同时也简化...

    sso.rar_DotNetCasClient.dll_sso_sso 单点登录_单点登录_鍗曠偣鐧诲綍

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证技术,允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在IT领域,它极大地提升了用户体验和安全性,尤其对于大型企业或组织,管理...

    CAS单点登录配置大全

    **CAS单点登录配置大全** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On,SSO)协议。它允许用户通过一个统一的认证系统访问多个应用系统,而无需在每个系统...

    用CAS实现框架的SSO单点登录

    ### 用CAS实现框架的SSO单点登录 #### SSO单点登录概念与原理 SSO(Single Sign-On)即单点登录技术,是一种让用户只需登录一次即可访问多个关联应用的技术。它不仅提升了用户体验,同时也加强了系统的安全性。...

Global site tag (gtag.js) - Google Analytics