CAS+Spring security实现单点登录之配置篇

来源:互联网 发布:socket文件传输java 编辑:程序博客网 时间:2024/06/06 12:23

分清Spring security和CAS的职责

CAS职责
  • 单点认证(自己YY的名词,懂就行):在CAS Server认证后,各Client都认
  • 对不起,没其他的了,其他都是Spring security干的事情!
Spring security职责
  • 认证各个请求,认证不过,就去做身份认证
    此处占两个灰常灰常重要的坑:
    • 坑1:怎么认证请求,判断请求的人有没有验证过,有没有通行证(角色涉及的权限暂不表)
    • 坑2:怎么认证身份,来者是谁,验明正身后给发通行证。
  • 保存、销毁用户信息,并提供查询方式;

配置:

配置Spring security

配置特定的servlet filter,配置位置:web.xml

<filter>    <filter-name>springSecurityFilterChain</filter-name>    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping>    <filter-name>springSecurityFilterChain</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>

配置CAS的认证机制

对应上述坑1。配置地址:spring security的配置文件,例如spring-security.xml什么的

何时开始认证?指定CAS的认证时机
<security:http auto-config="false" entry-point-ref="casEntryPoint">    <security:custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>    <security:custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>    <security:custom-filter ref="casFilter" position="CAS_FILTER"/>  </security:http>

说明:spring security采用filterchain来处理request,它定义了一套处理点,详见官方文档:spring security reference。另,偷偷加入了logout的处理,道理是类似的。

用什么认证?定义CAS的Filter
<bean id="casFilter"    class="org.springframework.security.cas.web.CasAuthenticationFilter">    <property name="authenticationManager" ref="authenticationManager"/></bean><security:authentication-manager alias="authenticationManager">        <security:authentication-provider ref="casAuthenticationProvider"/></security:authentication-manager>
如何认证?定义认证的Provider

按照spring security的玩法,实际做认证逻辑的是authenticationProvider,即此处的casAuthenticationProvider:

<bean id="casAuthenticationProvider"    class="org.springframework.security.cas.authentication.CasAuthenticationProvider">    <property name="authenticationUserDetailsService">       <bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">            <constructor-arg ref="MyUserDetailsImpl"/>       </bean>    </property>    <property name="serviceProperties" ref="serviceProperties"/>    <property name="ticketValidator">        <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">            <constructor-arg index="0" value="${cas.server.validator}"/>        </bean>    </property>    <property name="key" value="casAuthProviderKey"/></bean>

参数说明

  • 保存认证信息的类,没错,必须实现某个spring security定义好的接口,它就是UserDetailsService

  • 票据认证,也就是产生了票据,我怎么认证票据是否是正确的呢,此处插入了CAS的认证类。

  • 服务属性,存点信息,和我们处理相关的信息

CAS认证所需配置信息

ServiceProperties处放CAS的各种杂七杂八的配置。

<bean id="serviceProperties"    class="org.springframework.security.cas.ServiceProperties">    <property name="service" value="${web.server.login}"/>    <property name="sendRenew" value="false"/></bean>
参数说明
  • service 这玩意就是CAS Service认证完用户名、密码后回来访问CAS Client的地址;
  • sendRenew 网上看到某美女程序员说是要不要每次请求都认证一把,当时我就信了。

小结

到此已经填完了坑1,开始填坑2,即跑去验明正身。

配置用户名&密码认证点

spring security说去AuthenticationEntryPoint处验证。CAS提供实现了该接口的类。
在配置CAS认证时机的时候,其实已经配置了,回顾下

<security:http auto-config="false" entry-point-ref="casEntryPoint">
<bean id="casEntryPoint"   class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">    <property name="loginUrl" value="${cas.server.login}"/>    <property name="serviceProperties" ref="serviceProperties"/></bean>
参数说明
  • loginUrl 指定CAS Server上登录认证地址,ip:port/cas/login
  • serviceProperties 同上

总结

至此,两个坑填完,配置也就基本配完了。还剩余spring security的角色什么的,放在spring securtiy的总结篇再折腾。

总结final

认证总体框架是spring security的,我们只需要给spring security的几个坑填上CAS的机制而已。

总结final2

C转JAVA,刚开始慢慢看看Spring各大框架,框架重不重咱以后总结,设计思想是值得学习的。

1 0