锁定老帖子 主题:关于CAS实现单点登录的思考
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-19
最后修改:2011-05-06
公司要做一个包括很多应用的系统,要实现单点登录,现在所有的应用都还没有做好,在做架构,我负责单点登录。 于是研究了两天CAS,对用户注册这个问题很纠结,有以下两种方式,不知哪个更好,期待大家讨论。
1、Server端有DB,自己做好用户注册的实现,将接口提供给各个Client端(具体用什么方式让Client端调用是个难点,难点1)。 这样的话,用户登录某一应用(CAS中的Client端)时,会被拦截,转到Server端,在Server端读数据库进行验证,验证通过后,返回到Client端,然后Client端再读自己的数据库,取出用户的信息(此处很纠结,因为各个Client的用户实体的属性是不一样的,比如有的Client端的用户有手机号这一属性,有的则没有,所以综合了一下,只希望在Server端存用户的用户名和密码)。
2、Server端无DB,注册时到各Client端只把用户信息保存到各自的DB。 这样的话,用户登录某一应用(CAS中的Client端)时,会被拦截,转到Server端,Server端根据请求的不同判断该调用哪个Client的DB进行验证(难点2),此处又要有分支了: 1)、验证的时候把用户信息读出来,验证通过后,将用户信息直接传给Client端(难点3),这样Client端就不用再读DB提取用户信息了。 2)、验证的时候不读用户的信息,验证通过后,返回到Client端,Client端再读用户信息。
大家觉的用什么方式好一些?并希望大家对标红的三个难点进行讨论。
这个帖子不错:http://www.iteye.com/topic/165313
BTW: 感谢大家的热情参与,特别鸣谢:wad12302、denger 、fallen_lord、lovit 大家可以看一下他们的发帖,会得到不少信息。 扩展CAS等具体做法请参照fallen_lord的发帖。 稍后我会参照他们的观点作出整理,loading..........
-----------------------------------分割线-----------------------------------------------------
现在正在实现着,等实现好了再把方案完整的贴出来。 采用的方式是REST,谢谢denger的建议,至于CAS怎么集成REST,大家可以去看denger博客上的文章:http://denger.iteye.com/blog/973068
loading...........
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-21
我也想问下:
那么现在 server端进行验证的时候 怎么判断用户的信息 ?? server这边怎么获取用户信息?? 直接连接client 的数据库吗 还是怎么的?? 是否需要一个 共享的 用户信息保存中心? |
|
返回顶楼 | |
发表时间:2011-04-22
wad12302 写道 我也想问下:
那么现在 server端进行验证的时候 怎么判断用户的信息 ?? server这边怎么获取用户信息?? 直接连接client 的数据库吗 还是怎么的?? 是否需要一个 共享的 用户信息保存中心? 直接连Client数据库。 如果你有一个以上的Client,那么就把这些Client的数据库信息都配置到Server端,验证的时候Server端会根据你配置的Client的数据库信息去读Client的数据库,如果其中任何一个通过了就算通过了。 不需要共享的用户信息保存中心。 PS: CAS只提供验证、退出等功能,不提供注册等功能。 |
|
返回顶楼 | |
发表时间:2011-04-22
这个了解。
主要是现在 想了解怎么 分配注册这个问题: 比如我有多个系统进行合并,并且每个系统 都有自己的用户信息存储表 系统A a_user 系统B b_user 那么 现在我使用单点登录时候 怎么判断查询那个 表的用户信息好,有什么策略没有。 应为cas 提供验证,但是登录时候 用户名和密码最终是用哪里的? |
|
返回顶楼 | |
发表时间:2011-04-23
wad12302 写道 这个了解。
主要是现在 想了解怎么 分配注册这个问题: 比如我有多个系统进行合并,并且每个系统 都有自己的用户信息存储表 系统A a_user 系统B b_user 那么 现在我使用单点登录时候 怎么判断查询那个 表的用户信息好,有什么策略没有。 应为cas 提供验证,但是登录时候 用户名和密码最终是用哪里的? 从你问的这些问题看,你根本就没深入了解一下CAS,建议多上网上查查,另外,我文中最后的那个链接挺不错的,仔细看完了估计你就了解的差不多了。 对于你的问题: 找到deployerConfigContext.xml这个文件,在beans标签的下面加上以下两个数据源(注意,所加的这两个数据源必须是beans下面的第一个bean): <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://192.168.1.244:3306/cas</value></property> <property name="username"><value>root</value></property> <property name="password"><value>root</value></property> </bean> <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://192.168.1.245:3306/cas1</value></property> <property name="username"><value>root</value></property> <property name="password"><value>root</value></property> </bean> 然后找到: <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> 把他注释掉,加上以下两个: <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="sql" value="select password from a_user where username=?" /> <property name="dataSource" ref="dataSource1" /> </bean> <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="sql" value="select password from b_user where username=?" /> <property name="dataSource" ref="dataSource2" /> </bean> 修改成这样就可以了。 然后: 假如a_user中有一个用户:auser,b_user中有一个用户buser,这样你无论用哪一个用户登录,CAS就会先查a_user,如果用户名密码都正确,那么就通过,如果a_user中验证失败,那么CAS就会再查b_user,用户名密码都正确就算通过了,此时不正确,就算这次登录验证没通过。 如果现在还不知道怎么回事,那我就哭了。。。。。 另外,千万不要成为伸手党,自己查资料才是王道。 |
|
返回顶楼 | |
发表时间:2011-04-25
最后修改:2011-04-25
我个人觉得 选1...
理由是...你的server是个用户中心.他提供向外服务.. 所有的系统依赖于他,而对于依赖他的Client端特有的属性,比如手机,如果不是大家都需要,就放在Client处, Client端也有个数据库,每天同步即可,或者有修改即使广播更新 我感觉方案2就像层皮,,不是真真意义上的用户中心了.. 如果用户信息需要同步..你的广播源用谁了?逻辑上不是很合适吧 |
|
返回顶楼 | |
发表时间:2011-04-25
单点登录,最基本的用户数据还是要存储在server端
否则,单点登录就失去意义:不同的应用有不同的账号,你怎么实现漫游? |
|
返回顶楼 | |
发表时间:2011-04-25
就我的使用cas来说,用户信息肯定要统一起来 各个client如果都有自己的用户数据库那么就失去用户信息的意义了 这些其实相当于一个普通的用户相关信息 真正的用户名密码都只有一套 |
|
返回顶楼 | |
发表时间:2011-04-25
最后修改:2011-04-25
谢谢!
其实针对多个用户信息不同表情况 只是限于 继承原有系统,如果新系统 可能都会采取多个系统共用一个用户信息(只针对于企业应用系统) 还有一点就是对于多数据源问题,这个对于认证时候可以选择: 但是我主要是想表达另一个问题是:用户信息问题(也只是企业应用,基于原有系统集成) 系统A a_user 系统B b_user 当用户A单点登录到B系统时候 那么B系统对A用户的权限验证问题(B系统中没有A的用户信息,是否需要数据同步), 通过2个数据源链式访问验证用户,那么过后对于 一些操作(读取,删除)权限的验证 有没有什么好的策略进行延伸 也许这个问题已经不是单点登录问题?? 主要想知道有什么好的机制 |
|
返回顶楼 | |
发表时间:2011-04-25
最后修改:2011-04-25
用一个LDAP服务器,如Active Directory来集中管理用户信息。CAS跟LDAP结合进行身份验证,各个应用自己维护各自的用户信息。当然这会涉及到各个应用与LDAP服务器之间用户信息同步的问题。
|
|
返回顶楼 | |