web后端移动WEB开发Spring Security

Spring Security实践(三):通过CAS实现SSO

2016-04-08  本文已影响13217人  Endzzz

SSO(单点登录)要求同一个用户在使用不同的应用时,只需要登录一次即可。关于SSO系统的详细介绍此处不涉及。Spring Security提供了良好的接口和CAS进行整合。CAS是一个SSO系统,分为Client和Server,Server来完成用户的认证,Client放在应用端来和Server进行交互获取用户的认证信息。

本文主要用来指导在Spring Security框架下配置CAS完成SSO功能。达到如下目的:

关于CAS Server的安装和配置,本文档不做说明,可以参考《CAS Server部署指南》文档。

配置

为了使用CAS的功能,需要安装security支持CAS的jar包,修改pom.xml如下:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-cas</artifactId>
    <version>4.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.3.3</version>
    <scope>compile</scope>
</dependency>

Spring-security.xml的配置如下:

<!-- CAS Configuration-->
<bean id="serviceProperties"
      class="org.springframework.security.cas.ServiceProperties">
    <property name="service"
              value="http://localhost:8080/login/cas"/>
    <property name="sendRenew" value="false"/>
</bean>
<!-- CAS Filter-->
<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="casAuthenticationProvider" />
</security:authentication-manager>
<bean id="casAuthenticationProvider"
      class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
    <property name="authenticationUserDetailsService">
        <bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
            <constructor-arg ref="userService" />
        </bean>
    </property>
    <property name="serviceProperties" ref="serviceProperties" />
    <property name="ticketValidator">
        <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
            <constructor-arg index="0" value="https://ssomanage.test.com:8443/cas" />
        </bean>
    </property>
    <property name="key" value="casAuthProviderKey"/>
</bean>
<security:user-service id="userService">
    <security:user name="xiaof" password="post-it" authorities="ROLE_ADMIN,ROLE_USER" />
    <security:user name="test1" password="" authorities="ROLE_USER" />
</security:user-service>
<bean id="casFilter"
      class="org.springframework.security.cas.web.CasAuthenticationFilter">
    <property name="authenticationManager" ref="authenticationManager"/>
</bean>
<bean id="casEntryPoint"
      class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
    <property name="loginUrl" value="https://ssomanage.test.com:8443/cas/login"/>
    <property name="serviceProperties" ref="serviceProperties"/>
</bean>
<!-- CSRF Configuration-->
<bean id="csrfTokenFilter" class="com.test.cloud.security.CsrfTokenFilter"/>
<!-- CAS Logout Configuration-->
    <!-- This filter handles a Single Logout Request from the CAS Server -->
<bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>
<!-- This filter redirects to the CAS Server to signal Single Logout should be performed -->
<bean id="requestSingleLogoutFilter"
      class="org.springframework.security.web.authentication.logout.LogoutFilter">
    <constructor-arg value="https://ssomanage.test.com:8443/cas/logout"/>
    <constructor-arg>
        <bean class= "org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
    </constructor-arg>
    <property name="filterProcessesUrl" value="/logout/cas"/>
</bean>
<security:debug/>
<!-- General Configuration-->
<security:http
        auto-config="false"
        entry-point-ref="casEntryPoint">
    <security:intercept-url pattern="/" access="permitAll" />
    <security:intercept-url pattern="/login/cas" access="permitAll" />
    <!--<security:intercept-url pattern="/index.jsp" access="permitAll" />-->
    <security:intercept-url pattern="/view/app/pages/**" access= "hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/**" access= "hasRole('ROLE_USER')" />
    <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:csrf disabled="true"/>-->
    <security:custom-filter ref="csrfTokenFilter" after="CSRF_FILTER"/>
</security:http>

这里不再对配置进行逐条说明,CAS对应的配置不需要修改前后台代码,CSRF配置修改前后台代码参考《Spring Security实践(二):简单认证的实现》。在配置过程中需要注意以下几点:

演示

这里通过一个实际的例子来演示SSO登录的过程,并对其中的通信细节做简要说明。

操作示例

通信细节

小结

本文说明了在Spring Security中应用CAS如何进行配置,并对操作和通信细节进行了演示。多个应用进行单点登录在实际环境中也经过测试,和单个应用登录并没有不同,在认证的时候携带了一个指定的ticket.

上一篇 下一篇

猜你喜欢

热点阅读