`
kobe学java
  • 浏览: 258564 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Topic: Spring Security 3 与 CAS单点登录配置-Client

 
阅读更多

转载:

 

http://www.hxdw.com/bbs/post/print?bid=60&id=144183


Topic: Spring Security 3 与 CAS单点登录配置-Client




1.Spring Security 3 与 CAS单点登录配置-Client Copy to clipboard
Posted by: netboy
Posted on: 2010-11-12 11:27

如果CAS配置完成。就可以进行Client的配置了。 
以下Client的配置前提是你对Spring Security有一定了解。如果不熟悉,还是希望能先读一下Spring Security相关的文章。 

下面是Client的Spring Security 3的最基础的配置 

1.配置<http>标签 
Xml代码 
<http auto-config="false" entry-point-ref="casEntryPoint" servlet-api-provision="true"> 
<intercept-url pattern="/manage/**" access="ROLE_ADMIN" /> 
<intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /> 
<!-- logout-success-url="/login.html" --> 
<logout logout-url="/logout.html" success-handler-ref="casLogoutSuccessHandler"/> 
<custom-filter position="FORM_LOGIN_FILTER" ref="casFilter"/> 
</http> 

  <http auto-config="false" entry-point-ref="casEntryPoint" servlet-api-provision="true">
    <intercept-url pattern="/manage/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" />
    <!-- logout-success-url="/login.html" -->
    <logout logout-url="/logout.html" success-handler-ref="casLogoutSuccessHandler"/>
    <custom-filter position="FORM_LOGIN_FILTER" ref="casFilter"/>
  </http>

这里,重点是: 

* 不使用http的自动配置。 
* entry-point-ref="casEntryPoint"作用是认证的入口,是一个实现 AuthenticationEntryPoint接口的类。为ExceptionTranslationFilter类提供认证依据。 
* <custom-filter position="FORM_LOGIN_FILTER" ref="casFilter"/> 使用自定义的Filter,放置在过滤器链的FORM_LOGIN_FILTER的位置。 
似乎casFilter与casEntryPoint的功能有重叠。 
其实,casEntryPoint只是提供认证入口的作用,当没有权限,将跳转到该地址。 
casFilter是处理CAS service ticket的。当无权访问时,会使用casEntryPoint提供认证入口。 

2.分别配置casEntryPoint和casFilter 
配置:casEntryPoint 
Xml代码 
<beans:bean id="casEntryPoint" 
class="org.springframework.security.cas.web.CasAuthenticationEntryPoint"> 
<beans:property name="loginUrl" value="https://cas.boc.com:8443/casServer/login"/> 
<beans:property name="serviceProperties" ref="serviceProperties"/> 
</beans:bean> 
<beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties"> 
<beans:property name="service" 
value="https://report.boc.com:8443/report/j_spring_cas_security_check"/> 
<beans:property name="sendRenew" value="false"/> 
</beans:bean> 

<beans:bean id="casEntryPoint"
  class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
  <beans:property name="loginUrl" value="https://cas.boc.com:8443/casServer/login"/>
  <beans:property name="serviceProperties" ref="serviceProperties"/>
</beans:bean>
<beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
  <beans:property name="service"
  value="https://report.boc.com:8443/report/j_spring_cas_security_check"/>
<beans:property name="sendRenew" value="false"/>
</beans:bean>

配置casFilter 
Xml代码 
<beans:bean id="casFilter" 
class="org.springframework.security.cas.web.CasAuthenticationFilter"> 
<beans:property name="authenticationManager" ref="authenticationManager"/> 
</beans:bean> 

<authentication-manager alias="authenticationManager"> 
<authentication-provider ref="casAuthenticationProvider"/> 
</authentication-manager> 

<beans:bean id="userDetailsService" class="com.reportstart.security.service.impl.BocUserDetaislServiceImpl"> 
<beans:property name="userDao"> 
<beans:ref bean="userDao"/> 
</beans:property> 
</beans:bean> 

<beans:bean id="casAuthenticationUserDetailsService" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
<beans:property name="userDetailsService" > 
<beans:ref local="userDetailsService"/> 
</beans:property> 
</beans:bean> 

<beans:bean id="casAuthenticationProvider" 
class="org.springframework.security.cas.authentication.CasAuthenticationProvider"> 
<beans:property name="authenticationUserDetailsService" ref="casAuthenticationUserDetailsService"/> 
<beans:property name="serviceProperties" ref="serviceProperties" /> 
<beans:property name="ticketValidator"> 
<beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator"> 
<beans:constructor-arg index="0" value="https://cas.boc.com:8443/casServer" /> 
</beans:bean> 
</beans:property> 
<beans:property name="key" value="an_id_for_this_auth_provider_only"/> 
</beans:bean> 
</beans:bean> 

<beans:bean id="casFilter"
      class="org.springframework.security.cas.web.CasAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager"/>
  </beans:bean>
  
  <authentication-manager alias="authenticationManager">
    <authentication-provider ref="casAuthenticationProvider"/>
  </authentication-manager>
  
  <beans:bean id="userDetailsService" class="com.reportstart.security.service.impl.BocUserDetaislServiceImpl">
    <beans:property name="userDao">
      <beans:ref bean="userDao"/>
    </beans:property>
  </beans:bean>

  <beans:bean id="casAuthenticationUserDetailsService" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
    <beans:property name="userDetailsService" >
      <beans:ref local="userDetailsService"/>
    </beans:property>
  </beans:bean>

  <beans:bean id="casAuthenticationProvider"
      class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
    <beans:property name="authenticationUserDetailsService" ref="casAuthenticationUserDetailsService"/>
    <beans:property name="serviceProperties" ref="serviceProperties" />
    <beans:property name="ticketValidator">
      <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
       <beans:constructor-arg index="0" value="https://cas.boc.com:8443/casServer" />
   </beans:bean>
    </beans:property>
    <beans:property name="key" value="an_id_for_this_auth_provider_only"/>
  </beans:bean>
</beans:bean>

如果对Spring Security比较熟悉,就不用多说什么了。 
这里的"https://report.boc.com:8443/report/j_spring_cas_security_check"地址要注意,以后这个地址要注册到CAS service里,从而改变CAS的"open model". 
也只有这个地址是指向Client的,其他都指向Server 

最后,casLogoutSuccessHandler 
如果Client要注销,需在Client先注销,之后让Server注销提供的ticket。 
如果不这样,不论是只注销Client还是Server,注销后,系统仍然还是可以访问的。 
(按照开始的想法,注销Client,Client应该可以主动去Server去注销ticket,但是org.springframework.security.web.authentication.logout.LogoutFilter总注销自己,而不去跟Client交互。如果你知道的话,请告知。) 
CasLogoutSuccessHandler 代码 
Java代码 
package net.viiso.security.util; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; 
public class CasLogoutSuccessHandler implements LogoutSuccessHandler { 

private String url = ""; 
@Override 
public void onLogoutSuccess(HttpServletRequest request, 
HttpServletResponse response, Authentication authentication) 
throws IOException, ServletException { 

if ("".equals(url)) { 
url = "https://cas.boc.com:8443/casServer/logout"; 

response.sendRedirect(url); 

public void setTargetUrl(String url) { 
this.url = url; 



package net.viiso.security.util;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
public class CasLogoutSuccessHandler implements LogoutSuccessHandler {

  private String url = "";
  @Override
  public void onLogoutSuccess(HttpServletRequest request,
      HttpServletResponse response, Authentication authentication)
      throws IOException, ServletException {

    if ("".equals(url)) {
      url = "https://cas.boc.com:8443/casServer/logout";
    }
    response.sendRedirect(url);
  }
  public void setTargetUrl(String url) {
    this.url = url;
  }
}

启动后,对一个安全地址进行访问,会跳到CAS登录地址。 
如果登录成功,会跳至访问页。 
到此,简单的Client已经配置完成。 
接下来,还要在Server注册Client。这个虽然不是必须,但是出于安全考虑,如果CAS服务器在外网,就非常有必要对支持的Client进行注册了,因为当你访问Client在CAS登陆成功后,CAS会给你的Client提供登录者的用户信息。如果你模拟一个Client应用,使用暴力方式,不断给CAS提供用户口令和密码,会对安全性造成破坏。 
另外,也可以给CAS登录页加一个验证码。

 

分享到:
评论

相关推荐

    CAS单点登录HTTP协议版本配置指南

    ### CAS单点登录HTTP协议版本配置指南 #### 一、CAS版本及所需组件 本配置指南涉及的CAS版本如下: - **服务端**:cas-server-3.4.7 - **客户端**:cas-client-3.2.0 对于服务端而言,仅需解压`cas-server-webapp...

    spring-boot-websocket-client代码示例

    `spring-boot-websocket-client`项目展示了如何使用Spring Boot创建一个WebSocket客户端,包括设置WebSocket配置、客户端连接、订阅和发送消息。结合服务端的处理,我们可以构建出一个完整的实时通信系统。通过学习...

    activemq-client-5.8.0.jar

    8. **安全(Security)**:ActiveMQ可以配置用户认证和授权,保护消息的访问和传输。 9. **协议支持**:除了JMS,ActiveMQ还支持多种协议,如AMQP、STOMP、MQTT和OpenWire。 **使用activemq-client-5.8.0.jar的...

    rabbitmq-java-client-bin-3.3.4.zip

    在"rabbitmq-java-client-bin-3.3.4.zip"这个压缩包中,包含的是RabbitMQ的Java客户端库,这是与RabbitMQ服务器通信的一个关键组件。RabbitMQ提供了多种语言的客户端,Java客户端则是针对Java开发者设计的,使得Java...

    rabbitmq-java-client-bin-3.3.4

    总的来说,"rabbitmq-java-client-bin-3.3.4"是一个强大的工具,它为Java开发者提供了直接与RabbitMQ服务器通信的能力,使得构建可靠、高效的消息传递系统变得简单。通过深入理解和熟练运用这个客户端,开发者可以...

    springboot集成mqtt 单topic和多topic

    至此,我们已经完成了Spring Boot集成MQTT的基本配置,包括单Topic和多Topic的订阅与消息消费。通过这种方式,你的应用能够灵活地处理来自不同Topic的实时数据,为物联网应用提供了强大的支持。注意,实际项目中还...

    spring-boot-tutorials-master.zip

    - **Spring AMQP**:Spring Boot通过Spring AMQP模块,提供了与RabbitMQ交互的API和配置。 - **消息模型**:了解Direct、Fanout、Topic和Header四种交换器类型及其应用场景。 4. **Swagger2**: - **API文档生成...

    rabbitmq-java-client-3.4.1.zip

    在这个"rabbitmq-java-client-3.4.1.zip"压缩包中,包含的是RabbitMQ Java客户端库的3.4.1版本,这个版本的客户端可以让你在Java应用中轻松地与RabbitMQ服务器进行交互。 **RabbitMQ核心概念:** 1. **消息**:是...

    libmosquitto MQTT-Client

    **3. Delphi7集成libmosquitto** 在Delphi7中使用libmosquitto,首先需要将库编译为适用于Delphi的动态链接库(DLL),然后通过PInvoke(Platform Invoke)技术调用其API。这涉及到以下几个步骤: - 编译...

    rabbitmq-dotnet-client-3.5.0

    `ConnectionFactory`类是创建连接的主要入口点,开发者可以通过设置其属性如`Host`、`Port`、`UserName`、`Password`来指定连接参数,然后使用`CreateConnection()`方法建立连接。 2. 通道操作:在RabbitMQ中,通道...

    rabbitmq-java-client-bin-2.7.0.zip

    在这个"rabbitmq-java-client-bin-2.7.0.zip"压缩包中,我们主要关注的是RabbitMQ的Java客户端库。 RabbitMQ Java客户端是Java开发者与RabbitMQ服务器进行交互的主要工具,允许程序发送和接收消息。2.7.0是这个...

    rocketmq-client.zip

    在这个"rocketmq-client.zip"压缩包中,我们看到主要关注的是Python客户端如何与Java版本的RocketMQ进行交互,同时兼容Python 2和Python 3环境,并且提到了需要安装`jpype1`这个库来实现这种跨语言的通信。...

    rabbitmq-dotnet-client-3.6.4-dotnet-4.6.1.rar

    3. **声明交换机和队列**:使用`channel.ExchangeDeclare()`和`channel.QueueDeclare()`方法,定义交换机类型(如direct、topic、fanout等)和队列属性。 4. **绑定交换机和队列**:通过`channel.QueueBind()`方法...

    spring-cloud-starter-stream-rabbit MQ使用规范

    在 Spring Cloud Stream RabbitMQ 中,我们使用广播模式(topic)作为交换机模式,每一个服务仅允许拥有一个交换机。交换机是消息队列的核心组件,负责将消息路由到相应的队列中。 通道(Channel) Spring Cloud ...

    rocketmq-spring-rocketmq-spring-all-2.0.3_rocketmq_

    RocketMQ Spring是阿里巴巴开源的一款基于Apache RocketMQ的消息中间件与Spring框架深度整合的产品,它使得在Spring Boot项目中集成RocketMQ变得极其简便。RocketMQ是一款高性能、高可用、分布式的消息队列服务,常...

    MQTT-Client-master.rar_MQTT 服务器_MQTT client_MQTT-master_mqtt 客户

    3. **发布功能**:允许用户输入消息内容和主题,将消息发布到指定的Topic。 4. **订阅功能**:用户可以订阅一个或多个Topic,当有新消息发布到这些Topic时,客户端会收到通知。 5. **断线重连机制**:在网络不稳定时...

    Spring Boot集群管理工具KafkaAdminClient使用方法解析

    KafkaAdminClient 是 Spring Boot 集群管理工具中的一部分,主要用于管理和检视 Kafka 集群中的Topic、Broker、ACL 等对象。下面将详细介绍 KafkaAdminClient 的使用方法和原理。 创建 Topic KafkaAdminClient ...

    rabbitmq-java-client-master.zip

    3. **Java客户端库**:"rabbitmq-java-client"是RabbitMQ官方提供的Java SDK,提供了连接管理、通道(Channel)操作、消息发布与消费等接口,使得Java开发者可以方便地集成RabbitMQ到他们的应用中。 4. **RabbitMQ...

    rabbitmp-java-client

    Java客户端是RabbitMQ与Java应用程序交互的主要方式,`rabbitmq-java-client`库提供了丰富的API来实现发送和接收消息。在这个`rabbitmq-java-client-master`压缩包中,我们很可能会找到用于构建RabbitMQ Java应用的...

    spring-jms

    3. **消息转换**: Spring JMS支持消息与应用程序对象之间的转换,通过MessageConverter接口实现。这使得可以将Java对象序列化为消息体,反之亦然。 4. **事务管理**: Spring JMS允许与Spring的声明式事务管理集成,...

Global site tag (gtag.js) - Google Analytics