关闭

CAS4 之 集成RESTful API

标签: CAS4restletRESTFUL
4142人阅读 评论(9) 收藏 举报
分类:

       由于公司的需求,需要将现有的CAS4Server 集成Restful API,网上搜了一些资料、以及官方文档,但都是CAS3的,不过CAS3和CAS4是有一些区别的,以下看具体配置吧!

        CAS本身已经提供了 restlet 的集成包,如果你用的是 maven 的话直接加入,我这里的Cas-server的版本是 4.0.0: 


  1. <dependency>  
  2.     <groupId>org.jasig.cas</groupId>  
  3.     <artifactId>cas-server-integration-restlet</artifactId>  
  4.     <version>4.0.0</version>  
  5.     <type>jar</type>  
  6. </dependency>  
        查看POM文件:我们可以发现需要如下依赖包:

  •      org.restlet-2.1.0.jar
  •      org.restlet.ext.spring-2.1.0.jar
  •      org.restlet.ext.slf4j-2.1.0.jar
  •      org.restlet.ext.servlet-2.1.0.jar
         事实上我们还需要另外一个jar包

  •      cglib-nodep-2.1_3.jar

    如果自己编译的话工程的话,对应的JAR包也会下载到本地的maven仓库中的,或者直接去 maven.restlet.org 上找。

       然后再在 web.xml 中加入: 


  1. <servlet>  
  2.         <servlet-name>restlet</servlet-name>  
  3.         <servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class>  
  4.         <load-on-startup>1</load-on-startup>  
  5.     </servlet>  
  6.   
  7.     <servlet-mapping>  
  8.         <servlet-name>restlet</servlet-name>  
  9.         <url-pattern>/v1/*</url-pattern>  
  10.     </servlet-mapping>  

       这里servlet-class要看好和CAS3的配置不一样!

        restlet的配置在 cas-server中已经存在在: /WEB-INF/restlet-servlet.xml文件


          客户端测试:

public class Client {

	public static String getTicket(final String server, final String username, final String password,
			final String service) {
		notNull(server, "server must not be null");
		notNull(username, "username must not be null");
		notNull(password, "password must not be null");
		notNull(service, "service must not be null");

		return getServiceTicket(server, getTicketGrantingTicket(server, username, password), service);
	}

	/**
	 * 取得ST
	 * @param server
	 * @param ticketGrantingTicket
	 * @param service
	 */
	private static String getServiceTicket(final String server, final String ticketGrantingTicket, final String service) {
		if (ticketGrantingTicket == null)
			return null;

		final HttpClient client = new HttpClient();

		final PostMethod post = new PostMethod(server + "/" + ticketGrantingTicket);

		post.setRequestBody(new NameValuePair[] { new NameValuePair("service", service) });

		try {
			client.executeMethod(post);

			final String response = post.getResponseBodyAsString();

			switch (post.getStatusCode()) {
			case 200:
				return response;

			default:
				warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!");
				info("Response (1k): " + response.substring(0, Math.min(1024, response.length())));
				break;
			}
		}

		catch (final IOException e) {
			warning(e.getMessage());
		}

		finally {
			post.releaseConnection();
		}

		return null;
	}

	/**
	 * @param server
	 * @param username
	 * @param password
	 */
	private static String getTicketGrantingTicket(final String server, final String username, final String password) {
		final HttpClient client = new HttpClient();

		final PostMethod post = new PostMethod(server);

		post.setRequestBody(new NameValuePair[] { new NameValuePair("username", username),
				new NameValuePair("password", password) });

		try {
			client.executeMethod(post);

			final String response = post.getResponseBodyAsString();
			info("TGT="+response);
			switch (post.getStatusCode()) {
			case 201: {
				final Matcher matcher = Pattern.compile(".*action=\".*/(.*?)\".*").matcher(response);

				if (matcher.matches())
					return matcher.group(1);

				warning("Successful ticket granting request, but no ticket found!");
				info("Response (1k): " + response.substring(0, Math.min(1024, response.length())));
				break;
			}

			default:
				warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!");
				info("Response (1k): " + response.substring(0, Math.min(1024, response.length())));
				break;
			}
		}

		catch (final IOException e) {
			warning(e.getMessage());
		}

		finally {
			post.releaseConnection();
		}

		return null;
	}

	private static void ticketValidate(String serverValidate, String serviceTicket, String service) {
		notNull(serviceTicket, "paramter 'serviceTicket' is not null");
		notNull(service, "paramter 'service' is not null");

		final HttpClient client = new HttpClient();
		GetMethod post = null;

		try {
			post = new GetMethod(serverValidate+"?"+"ticket="+serviceTicket+"&service="+URLEncoder.encode(service, "UTF-8"));
			client.executeMethod(post);

			final String response = post.getResponseBodyAsString();
			info(response);
			switch (post.getStatusCode()) {
			case 200: {
				info("成功取得用户数据");
			}
			default: {

			}
			}

		} catch (Exception e) {
			warning(e.getMessage());
		} finally {
			//释放资源
			post.releaseConnection();
		}

	}

	private static void notNull(final Object object, final String message) {
		if (object == null)
			throw new IllegalArgumentException(message);
	}

	public static void main(final String[] args) throws Exception {
		final String server = "http://localhost:8080/CASServer/v1/tickets";
		final String username = "username";
		final String password = "username";
		final String service = "http://localhost:8080/service";  //随意写
		final String proxyValidate = "http://localhost:8080/<span style="font-family: Arial, Helvetica, sans-serif;">CASServer</span>/proxyValidate";

		
		ticketValidate(proxyValidate, getTicket(server, username, password, service), service);
		
	}

	private static void warning(String msg) {
		System.out.println(msg);
	}

	private static void info(String msg) {
		System.out.println(msg);
	}

}
返回数据:
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
	<cas:authenticationSuccess>
		<cas:user>jy</cas:user>
        
        
	</cas:authenticationSuccess>
</cas:serviceResponse>



cglib-nodep-2.1_3.jar
1
0
查看评论

CAS单点登录六-Restful API

CAS-server提供了restful api供调用,要开启restful服务,首先要找到与之对应的jar包。 cas源代码里cas-server-integration-restlet这个工程就是支持restful的模块,编译出来后得到一个jar包,3.6之前的版本也可以直接下载到这个jar包...
  • redstarofsleep
  • redstarofsleep
  • 2016-06-28 17:05
  • 6187

使用CAS的RESTFUL接口使CS系统单点登录BS系统

首先参考前面文章来配置好CAS,并且配置好RESTFUL,参考: http://blog.csdn.net/happyteafriends/article/details/7450120 场景如下, CAS地址为:http://10.1.81.223:8080/cas-server-webapp...
  • magic_wz
  • magic_wz
  • 2014-01-07 10:13
  • 8608

CAS RESTful API 开发文档

  • 2011-03-05 14:39
  • 382KB
  • 下载

CAS研究(三)-公用API分析(未完)

根据官方介绍,CAS具有一些接口,这些接口是CAS的核心,那么我们来看看有那些关键性的类:在CAS中很多地方使用了策略模式,那么根据什么方式来确定使用哪种策略呢?在很多策略类中有一个support(Credentials c)的方法,所以可以看出是根据Credentails的类型
  • yuwenruli
  • yuwenruli
  • 2011-07-20 16:46
  • 6407

CAS4.0集成(restlet)与使用实例

CAS提供了C/S端登录的组件,集成restlet即可,步骤还是很方便的,可以先下载依赖包 注意3.x版本的restlet与4.0集成的包有所不同,这里只描述4.0版本 百度云依赖包下载 密码: p917 1.加入依赖包2.配置web.xml<!-- 集成RESTFul API--&...
  • qqqqq210
  • qqqqq210
  • 2016-11-03 10:30
  • 1794

CAS Server 4.0 + RESTfull + Services调用 完全使用文档

这里面走了许多弯路, 帖出来供大家使用借鉴。 大家配置的时候参加官网(我一开始进入了没有维护的官网导致走了很多弯路):http://jasig.github.io/cas/4.0.x/protocol/REST-Protocol.html  Pom 文件加依赖,项目根POM文件...
  • jxlmz
  • jxlmz
  • 2016-04-01 10:35
  • 2261

CAS+RESTful WebService 使用文档

CAS+RESTful WebService 使用文档
  • jxlmz
  • jxlmz
  • 2016-04-01 10:38
  • 1752

cas用httpclient登录,并获取ticket,可以很方便扩展,如果要ajax登录可以基于这个接口,在resp种植castgc的cookie到浏览器

public static Map validate(HttpServletRequest req) throws Exception { String loginName = req.getParameter("loginName"); Stri...
  • yx511500623
  • yx511500623
  • 2016-01-21 16:29
  • 4233

CAS配置(一)-集成RESTFul

CAS单点登录服务器很多时候都是被B/S的应用使用,那么对已有些系统是CS的那么怎么去调用呢,这个时候就需要使用webservice来给CS的系统调用了,我们先来说说先决条件吧:1)集成需要的jar包,这个是必不可少的com.noelios.restlet.e
  • yuwenruli
  • yuwenruli
  • 2011-07-15 13:28
  • 12268

CAS4.0集成restlet手册

最近公司需求要搞单点登录,所以毋庸置疑 就选择了CAS4.0,因为有CS客户端需要调用登录接口,而CAS项目中已经集成好了restlet接口,需要配置一下即可。 1.首先在web.xml文件中加入 如下代码:    CAS配置(一)-集成RESTFul --> r...
  • liyonggang1988
  • liyonggang1988
  • 2016-03-29 15:32
  • 640
    个人资料
    • 访问:4927次
    • 积分:71
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:9条
    文章分类
    文章存档
    最新评论