jasig CAS 实战
官网:
http://www.jasig.org/cas/public-api 这一页谈到为什么使用final关键字屏蔽了扩展,晕吧!
用户手册: https://wiki.jasig.org/display/CASUM/Home
使用clientfilter https://wiki.jasig.org/display/CASC/Using+CASFilter
获取跟多用户信息: http://www.open-open.com/home/space-124-do-blog-id-791.html
http://www.ibm.com/developerworks/web/library/wa-singlesign/
http://www.iteye.com/topic/544899
RESTFull Login: https://wiki.jasig.org/display/CASUM/RESTful+API
这个文档写的不全,增加的maven引用没有完全写出来,为了能让在maven下跑起来,可费了不少功夫。
下面是最终可跑的pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>edu.university.cas</groupId> <artifactId>cas-server</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <target>1.5</target> <source>1.5</source> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <warName>cas-server</warName> <packagingExcludes> **/spring-web-2.*, </packagingExcludes> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>${cas.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-webapp</artifactId> <version>${cas.version}</version> <type>war</type> <scope>runtime</scope> </dependency> <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-integration-restlet</artifactId> <version>${cas.version}</version> <type>jar</type> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>20030825.183949</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>20030825.184428</version> </dependency> <dependency> <groupId>com.noelios.restlet</groupId> <artifactId>com.noelios.restlet</artifactId> <version>1.1.1</version> </dependency> </dependencies> <properties> <cas.version>3.4.2</cas.version> </properties> <repositories> <repository> <id>ja-sig</id> <url> http://oss.sonatype.org/content/repositories/releases/ </url> </repository> <repository> <id>restlet</id> <url> http://maven.restlet.org/ </url> </repository> </repositories> </project>
上面的mysql以及jdbc support引用是由于我这个例子要使用mysql数据库验证才需要。
http://denger.iteye.com/blog/973068
最佳实践[自己编译]:
这种方式基本是本地覆盖源码的配置达到定制化而又能与最新的源码同步。
实际上只能覆盖配置,要自己扩展类还是很麻烦,引用的包没有。
实践中在使用https时会遇到证书的问题(在tomcat里面验证成功跳转时什么错也没报却找不到页面的情况也是这个原因),参见
http://hi.baidu.com/qq295361921/blog/item/489945d174d4f387a1ec9cfb.html
http://blog.ureshika.com/archives/400.html
总结一下:
1 怎样使用已有的用户系统来验证?
way 1:需要配置deployerConfigContext.xml
将bean id="authenticationManager"中的<property name="authenticationHandlers">中的
bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"
替换为:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="casDataSource" /> <property name="sql" value="select password from user where user=?" /> <property name="passwordEncoder" ref="myPasswordEncoder"/> </bean>
从中可以看出,可以将数据源配置为你想使用的用户数据库,将上面的sql换为返回对应password的语句。
如果想要更灵活的自定义,那就干脆直接实现AbstractUsernamePasswordAuthenticationHandler或者更高层次的接口。
way 2:看看这个也许有用,我没试过: https://wiki.jasig.org/display/CAM/Home
2 怎样添加权限控制?
举个例子,我要不同用户访问不同应用的权限不同,张三可以访问A服务,李四可以访问B服务,王二麻子可以访问A和B服务,怎么做?
有个点可以控制:
在web-inf/applicationContext.xml中定制自己的CentralAuthenticationService,要实现CentralAuthenticationService接口,应该在grantServiceTicket方法中对权限进行判断。这种逻辑当然不能在AuthenticationHandler里面做了,因为张三要访问B服务的话,身份验证应该是可以通过,只是没有权限,就不能给他访问B服务的票了。
3 怎样自定义登陆界面?
way1 :修改casserver自带的登陆界面,这个在securityContext.xml中配置
<bean id="casProcessingFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter" p:authenticationManager-ref="casAuthenticationManager" p:filterProcessesUrl="/services/j_acegi_cas_security_check"> <property name="authenticationSuccessHandler"> <bean class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler" p:alwaysUseDefaultTargetUrl="true" p:defaultTargetUrl="/services/manage.html" /> </property> <property name="authenticationFailureHandler"> <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> <constructor-arg index="0" value="
/authorizationFailure.html" />
</bean>
</property>
</bean>
way2 : 修改spring webflow参考 http://hi.baidu.com/fallenlord/blog/item/b031e83e87159cca7c1e7127.html xml的恐怖可见一斑。
我不明白这才几个可以数出来简单的跳转逻辑,要用webflow来配置一大堆xml,说是易于扩展吧结果却又这么麻烦。让别人还要专门画个图还不一定搞得清楚。
4 怎样logout
见文档https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1 ,没有可用的函数来logout,建议的做法是,使用链接指向cas server 的logout。
感觉yale这个实现里面很学院派,很繁琐。他们的做法也很古板。是个古里古怪的东西!按说理论也不是那么复杂,为什么就这样用的不舒服呢!希望有替代品!!