版权声明:本文为博主yellowcong原创文章,未经博主允许不得转载。 https://blog.csdn.net/yelllowcong/article/details/79803085
通过这个工具类,可以实现用户通过用户名和密码,获取到cas的 st,然后通过st来和访问资源进行拼接,就可以访问到需要cas授权的资源了。实现的思路:1.先通过用户名和密码,请求
/v1/tickets
接口,获取到tgt(token gerenate ticket) ,2.然后在根据第一步获取的tgt参数,请求/v1/tickets/
+tgt 的接口,获取到st(service ticket),3.然后根据第二步获取的st去访问资源,path+"?ticket="+st
,然后就可以直接访问了。
CasServerUtil
package com.yellowcong.cas.utils;
import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
/**
* 首先客户端提交用户名、密码、及Service三个参数,
* 如果验证成功便返回用户的TGT(Ticket Granting Ticket)至客户端,
* 然后客户端再根据 TGT 获取用户的 ST(Service Ticket)来进行验证登录。
* 故名思意,TGT是用于生成一个新的Ticket(ST)的Ticket,
* 而ST则是提供给客户端用于登录的Ticket,两者最大的区别在于,
* TGT是用户名密码验证成功之后所生成的Ticket,并且会保存在Server中及Cookie中,
* 而ST则必须是是根据TGT来生成,主要用于登录,并且当登录成功之后 ST 则会失效。
* 创建日期:2018年2月8日
* 创建时间:下午6:39:29
* 创建者 :yellowcong
* 机能概要:
*/
public class CasServerUtil {
//登录服务器地址
private static final String CAS_SERVER_PATH = "https://sso.yellowcong.net";
//登录地址的token
private static final String GET_TOKEN_URL = CAS_SERVER_PATH + "/v1/tickets";
//用于存储tgt ,如果不存在就获取
private static String tgt = "";
private static CasServerUtil utils = null;
private CasServerUtil(){}
public static CasServerUtil getInstance(){
if(utils == null){
synchronized (CasServerUtil.class) {
if(utils == null){
utils = new CasServerUtil();
}
}
}
return utils;
}
/**
* 创建日期:2018/02/08<br/>
* 创建时间:15:35:16<br/>
* 创建用户:yellowcong<br/>
* 机能概要: 先通过用户名密码,
* 先生成tikect的 token,然后再通过token获取到id
* @param args
* @throws Exception
*/
public static void main(String [] args) throws Exception {
String username ="yellowcong";
String password ="yellowcong";
CasServerUtil utils = CasServerUtil.getInstance();
String st = utils.getSt(username, password,"http://yellowcong.com");
System.out.println(st);
}
/**
* 创建日期:2018年2月8日<br/>
* 创建时间:下午7:26:32<br/>
* 创建用户:yellowcong<br/>
* 机能概要:通过用户名和密码来获取service ticket,通过这个可以免密码登录
* @param username cas的用户名
* @param password cas的密码
* @param tagetUrl 访问的目标表地址
* @return
*/
public String getSt(String username,String password,String tagetUrl){
//先获取到 token generate ticket
if(tgt == null || tgt.trim().equals("")){
tgt = utils.getTGT(username, password);
}
//判断tgt是否获取的情况
if(tgt == null || tgt.trim().equals("")){
return "";
}
//返回 获取的 token
return utils.getST(tgt,tagetUrl);
}
/**
* 创建日期:2018年2月8日<br/>
* 创建时间:下午6:36:54<br/>
* 创建用户:yellowcong<br/>
* 机能概要:获取到 (Tokent generate tiker ,token生成票据)tgt
* @return
*/
private String getTGT(String username,String password){
String tgt = "";
OutputStreamWriter out = null;
BufferedWriter wirter = null;
HttpsURLConnection conn = null;
try {
//第一步,获取到tgt
conn = (HttpsURLConnection) openConn(GET_TOKEN_URL);
String param ="username=" + URLEncoder.encode(username, "UTF-8");
param += "&password" + "=" + URLEncoder.encode(password, "UTF-8");
out = new OutputStreamWriter(conn.getOutputStream());
wirter = new BufferedWriter(out);
//添加参数到目标服务器
wirter.write(param);
wirter.flush();
wirter.close();
out.close();
//获取token
tgt = conn.getHeaderField("location");
//获取返回值
if (tgt != null && conn.getResponseCode() == 201) {
tgt = tgt.substring(tgt.lastIndexOf("/") + 1);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return tgt;
}
/**
* 创建日期:2018年2月8日<br/>
* 创建时间:下午7:15:16<br/>
* 创建用户:yellowcong<br/>
* 机能概要:根据票据生成工具,获取st
* @param tgt
* @return
*/
private String getST(String tgt,String tagetUrl){
String serviceTicket = "";
OutputStreamWriter out = null;
BufferedWriter wirter = null;
HttpsURLConnection conn = null;
try {
//第一步,获取到tgt
conn = (HttpsURLConnection) openConn(GET_TOKEN_URL+"/"+tgt);
//需要访问的目标网站
String param ="service=" + URLEncoder.encode(tagetUrl, "utf-8");
out = new OutputStreamWriter(conn.getOutputStream());
wirter = new BufferedWriter(out);
//添加参数到目标服务器
wirter.write(param);
wirter.flush();
wirter.close();
out.close();
//获取返回的ticket票据
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line ="";
while ((line = in.readLine()) != null) {
serviceTicket = line;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.disconnect();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return serviceTicket;
}
/**
* 创建日期:2018年2月8日<br/>
* 创建时间:下午7:28:36<br/>
* 创建用户:yellowcong<br/>
* 机能概要:通过post表单提交来获取连接
* @param urlk
* @return
* @throws Exception
*/
private URLConnection openConn(String urlk) throws Exception {
URL url = new URL(urlk);
HttpsURLConnection hsu = (HttpsURLConnection) url.openConnection();
hsu.setDoInput(true);
hsu.setDoOutput(true);
hsu.setRequestMethod("POST");
return hsu;
}
/**
* 创建日期:2018年4月3日<br/>
* 代码创建:黄聪<br/>
* 功能描述:获取cas管理的系统的资源信息<br/>
* @param path
* @return
*/
public static String getCasRequestUrl(String username,String password,String path){
//获取http信息
String st = utils.getSt(username, password,path);
//返回cas的请求url
return path+"?ticket="+st;
}
}
##参考文章
https://blog.csdn.net/xuweilinjijis/article/details/8984290