SSO之CAS集成SpringSecurity

前言:

关于CAS的客户端搭建配置以及服务端的部署配置请参考前面文章。

一:引入CAS与SpringSecurity的Jar

<properties>
    <spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!--安全框架security-->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.1.0.RELEASE</version>
    </dependency>
    <!--cas与springSecurity集成-->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-cas</artifactId>
        <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.jasig.cas.client</groupId>
        <artifactId>cas-client-core</artifactId>
        <version>3.3.3</version>
        <!--依赖排除log4j-->
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>log4j-over-slf4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <!-- 指定端口 -->
                <port>9113</port>
                <!-- 请求路径 -->
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

二:web.xml增加SpringSecurity过滤器链配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-security.xml</param-value>
</context-param>
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<!--springsecurity的过滤器链-->
<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>
<!-- 解决post乱码 -->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!--springmvc的前端控制器-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

三:SpringSecurity配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
   xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

   <!--1.不拦截资源和路径配置-->
   <http pattern="/index2.jsp" security="none"></http>
   <!--   entry-point-ref  入口点引用 -->
   <http use-expressions="false" entry-point-ref="casProcessingFilterEntryPoint">
      <intercept-url pattern="/**" access="ROLE_USER"/>
      <csrf disabled="true"/>
      <!-- custom-filter为过滤器, position 表示将过滤器放在指定的位置上,before表示放在指定位置之前  ,after表示放在指定的位置之后  -->
      <custom-filter ref="casAuthenticationFilter"  position="CAS_FILTER" />
      <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>
      <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>
   </http>

   <!-- CAS入口点 开始 -->
   <beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
      <!-- 单点登录服务器登录URL -->
      <beans:property name="loginUrl" value="http://localhost:9100/cas/login"/>
      <beans:property name="serviceProperties" ref="serviceProperties"/>
   </beans:bean>
   <beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
      <!--service 配置自身工程的根地址+/login/cas   -->
      <beans:property name="service" value="http://localhost:9113/login/cas"/>
   </beans:bean>
   <!-- CAS入口点 结束 -->

   <!-- 认证过滤器 开始 -->
   <beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
      <beans:property name="authenticationManager" ref="authenticationManager"/>
   </beans:bean>
   <!-- 认证管理器 -->
   <authentication-manager alias="authenticationManager">
      <authentication-provider  ref="casAuthenticationProvider">
      </authentication-provider>
   </authentication-manager>
   <!-- 认证提供者 -->
   <beans:bean id="casAuthenticationProvider"     class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
      <beans:property name="authenticationUserDetailsService">
         <beans:bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
            <beans:constructor-arg ref="userDetailsService" />
         </beans:bean>
      </beans:property>
      <beans:property name="serviceProperties" ref="serviceProperties"/>
      <!-- ticketValidator 为票据验证器 -->
      <beans:property name="ticketValidator">
         <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
            <beans:constructor-arg index="0" value="http://localhost:9100/cas"/>
         </beans:bean>
      </beans:property>
      <beans:property name="key" value="an_id_for_this_auth_provider_only"/>
   </beans:bean>
   <!-- 认证类 -->
   <beans:bean id="userDetailsService" class="com.xucj.demo.service.UserDetailsServiceImpl"/>

   <!-- 认证过滤器 结束 -->
   <!-- 单点登出  开始  -->
   <beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>
   <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
      <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9113/index.jsp"/>
      <beans:constructor-arg>
         <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
      </beans:constructor-arg>
      <beans:property name="filterProcessesUrl" value="/logout/cas"/>
   </beans:bean>
   <!-- 单点登出  结束 -->
</beans:beans>

com.xucj.demo.service包下的自定义认证类:


import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义认证类
 */
public class UserDetailsServiceImpl implements UserDetailsService{
    /*
        *@Desc 自定义认证类,主要是查询数据库,返回用户信息
        *@param username 认证管理器收集的页面上的用户名
        *@return org.springframework.security.core.userdetails.UserDetails
        **/
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //查询数据库
        //用户必须存在,并且状态必须是审核通过
        //1 username 2 password 3.权限列表
        List<GrantedAuthority> authorities = new ArrayList<>();//权限列表
        GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_SELLER");//权限对象
        GrantedAuthority authority2 = new SimpleGrantedAuthority("ROLE_USER");//权限对象
        authorities.add(authority);
        authorities.add(authority2);
        return new User(username,"",authorities);
    }
}

五:测试

新建index.jsp和index2.jsp,根据上面四的配置得知,index2.jsp不登录也不会被拦截,如下:

启动项目,访问:http://localhost:9113/可以跳转到自定义的登录页面,

根据四的配置可知,退出的路径:/logout/cas

登出后跳转到的路径:http://localhost:9113/index.jsp

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值