在上一篇文章单点登录 - 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\\}");
这些只会返回单条数据,而不会支持上面的猜想。
相关推荐
使用struts2+spring+cas实现的单点登录功能,里面包括cas-server3.5.2项目一个,cas-client3.2.1 web项目两个,数据库脚本,请按照里面的说明文档进行部署,希望你们也能配置成功。
1 单点登录总体解决方案 2 CAS原理和协议 3 CAS安全性 4 CAS工作模式 5 系统设计方案 6 CAS关键技术 6.1 域名规范 6.2 中文用户登录提交时乱码 6.3 客户端获取中文用户名及...9.3 TOMCAT中使用CAS实现单点登录LDAP方式
主要讲述了CAS单点登录多数据及获取更多用户信息配置。
这个资源是一个CAS(Central Authentication Service)单点登录演示项目,用于展示如何实现基于CAS的单点登录系统。CAS是一种常用的身份认证和授权解决方案,适用于分布式系统中的用户身份验证。该演示项目将通过...
提供了cas server 5.3.9 单点登录的资源整合,cas服务器,运行即可用 配置了spring srcurity 密码验证方式
SSO通过将用户登录信息映射到浏览器cookie中,解决其他应用免登获取用户会话的问题。 为什么需要SSO 开放平台业务本身不需要SSO,但是如果平台的普通用户也可以在申请后成为一个应用开发者,那么就需要将平台加入到...
CAS 全称集中式认证服务(Central Authentication Service),是实现单点登录(SSO)的一中手段。 CAS 的通讯流程图如下(图片来自Google图库): 对于本文用户可感知的层面,认证过程如下: 前端访问后端登录接口 ...
-- 该过滤器使得开发者可以通过 org.jasig.cas.client.util.AssertionHolder 来获取用户 的登录名。 比如 AssertionHolder.getAssertion().getPrincipal().getName()。 --> <filter-name>CAS Assertion ...
单点登录cas服务端连接数据库获取用户数据做登录验证用
│ ├─jeeplatform-sso-cas-----------------------CAS单点登录服务端 │ │ │ ├─jeeplatform--sso-oauth2---------------OAuth2.0单点登录服务端 │ │ ``` ## 二、系统设计 ### 系统管理(模块名称...
文档里面介绍了cas单点登录的主要配置及多个用户信息的配置,在客户端怎么才能获取多样的用户信息。
上述snsapi_base模式是静默模式,不需微信用户手动授权,用户感受不到界面的跳转,但仅可获取用户的openid信息,对于我们来说openid暂时足够了。 第二步:通过code换取网页授权access_token 获取code后,请求以下...
为了使示例应用程序正常运行,我们根据 MySQL 用户数据表引入了特定的 CAS 配置。 由于 CAS 架构和基于源代码的特性,在创建 CAS.war 文件时应该编译一些 MySQL 模块。安装和配置创建一个 WWPass 开发者帐户在上...
auth-cas单点登录服务器端,所有客户端的用户登录都需要转移到cas服务器端。提供用户名密码登录和qq登录两种方式 auth-cas-shiro-common shiro-cas整合需要的工具类,供所有客户端帖子使用,只需将其作为jar包即可...
CAS单点登录机制使用RSA2和RSA进行数据加密和解密。 - utils:工具包,包含一些实用的函数,如从UA池中获取随机的User-Agent,和操作数据库的方法等。 - spider.py:爬虫主文件,根据城市和地区爬取相应的数据,并将...
获取有关当前用户的信息 75 9.2.2 UserDetailsService 75 9.2.3授予权力 77 9.2.4总结 77 9.3认证 78 9.3.1什么是Spring Security中的认证? 78 9.3.2直接设置SecurityContextHolder内容 80 9.4 Web应用程序中的身份...
单点登录: 统一认证平台UC: 职责:登录和鉴权 登录:生成token信息,将信息存到UC域名下的cookies中 鉴权:验证token的正确性,子系统每个请求会首先到UC来验证token是否有效 返回token信息:子系统会使用JSONP跨域...
授权模块,支持CAS单点登录,简单properties配置即可,不用再写很多的xml。 支持多数据源,简单properties配置即可实现,为了安全性吧,暂不提供界面维护数据源,不存数据库。 数据表主键优化,如分类科目表,采用有...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...