统一身份认证
  1. 公开接口
统一身份认证
3.0
  • 3.0
  • 公开接口
    • 3.0接口说明
    • OpenAPI
      • 概述
      • 1.人员管理
        • 批量获取人员数据
        • 获取单个人员数据
        • 添加单个人员数据
        • 修改单个人员数据
        • 删除单个人员数据
        • 批量获取人员照片
        • 获取单个人员照片
        • 基本代码
        • 人员类型代码
        • 组织机构代码
      • 2.服务管理
        • 获取服务列表数据
        • 批量删除服务数据
        • 获取单个服务数据
        • 添加单个服务数据
        • 修改单个服务数据
        • 删除单个服务数据
        • 获取服务列表数据(LDAP)
        • 批量删除服务数据(LDAP)
        • 获取单个服务数据(LDAP)
        • 添加单个服务数据(LDAP)
        • 修改单个服务数据(LDAP)
        • 删除单个服务数据(LDAP)
        • 返回属性代码
        • 黑白名单标签代码
      • 3.资源管理
        • 图像资源
      • 获取TOKEN
      • DEMO
    • 登录过程接口
      • CAS协议-登录接口
      • CAS协议-票据验证接口
      • 登出接口
      • 用户身份切换
      • SAML1.1协议-登录接口
      • SAML1.1协议-票据验证接口
      • 单点登出接口
    • RestfulApi
      • 第一步 获取tickets
      • 第二步 获取ST
      • 第三部获取用户信息
  1. 公开接口

java 示例代码

`
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RestfulTest {
private static final Logger LOG = Logger.getLogger(RestfulTest.class.getName());
/**
获取服务票证(ST)
该方法用于从给定的服务器、用户名、密码和服务名中获取服务票证
它首先确保所有提供的参数都不为null,然后通过获取票据授予票证(TGT),
进而使用该TGT请求服务票证
@param server CAS服务器的URL,用于验证用户身份
@param username 用户名,用于登录CAS服务器
@param password 密码,与用户名一起用于登录CAS服务器
@param service 目标服务的URL,用于获取服务票证
@return 返回服务票证字符串
@throws IllegalArgumentException 如果任一参数为null,则抛出此异常
*/
public static String getTicket(final String server, final String username, final String password, final String service) {
// 确保传入的参数不为null
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");
// TGT, 放到 sso.buaa.edu.cn域名下的CASTGC cookie中,可实现网页登录1
String tgt = getTicketGrantingTicket(server, username, password);
// 使用TGT获取服务票证(ST)
return getServiceTicket(server, tgt, service);
}
/**
获取服务票证
该方法用于向CAS服务器请求一个服务票证(Service Ticket),以便访问指定的服务
@param server CAS服务器的地址
@param ticketGrantingTicket 用于获取服务票证的票证授予票证(Ticket-Granting Ticket)
@param service 需要访问的服务的URL
@return 如果成功获取到服务票证,则返回票证字符串;否则返回null
*/
private static String getServiceTicket(final String server, final String ticketGrantingTicket, final String service) {
// 如果票证授予票证为空,则直接返回null
if (ticketGrantingTicket == null)
return null;
// 创建HttpClient实例,用于发送HTTP请求
final HttpClient client = new HttpClient();
// 创建PostMethod实例,用于执行POST请求
final PostMethod post = new PostMethod(server + "/" + ticketGrantingTicket);
// 打印服务器地址和票证授予票证,用于调试
System.out.println("server: " + server);
System.out.println("ticketGrantingTicket: " + ticketGrantingTicket);
// 设置请求体,包含服务的URL
post.setRequestBody(new NameValuePair[]{new NameValuePair("service", service)});
// 尝试执行HTTP请求并处理响应
try {
// 执行HTTP方法
client.executeMethod(post);
// 获取响应内容
final String response = post.getResponseBodyAsString();
// 根据响应状态码处理响应
switch (post.getStatusCode()) {
case 200:
// 如果响应状态码为200,表示成功获取到服务票证,返回响应内容
return response;
default:
// 如果响应状态码异常,记录警告信息和响应内容的前1024个字符
LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!");
LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length())));
break;
}
} catch (final IOException e) {
// 如果发生IO异常,记录警告信息
LOG.warning(e.getMessage());
} finally {
// 释放连接资源,确保资源被正确回收
post.releaseConnection();
}
// 如果请求失败或发生异常,返回null
return null;
}
/**
获取Ticket Granting Ticket (TGT)
该方法用于通过CAS服务器认证用户凭据,并获取TGT,以便后续使用
@param server CAS服务器的URL
@param username 用户名
@param password 密码
@return TGT字符串,如果认证成功则返回TGT,否则返回null
/
private static String getTicketGrantingTicket(final String server, final String username, final String password) {
// 创建HttpClient实例用于发送HTTP请求
final HttpClient client = new HttpClient();
// 创建PostMethod实例,用于执行POST请求
final PostMethod post = new PostMethod(server);
// 设置请求头的Content-Type为application/x-www-form-urlencoded
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 设置请求体,包含用户名和密码
post.setRequestBody(new NameValuePair[]{
new NameValuePair("username", username),
new NameValuePair("password", password)});
try {
// 执行HTTP方法
client.executeMethod(post);
// 获取响应内容
final String response = post.getResponseBodyAsString();
// 打印请求和响应信息用于调试
System.out.println("getTicketGrantingTicket -- server: " + server);
System.out.println("getTicketGrantingTicket -- username: " + username);
System.out.println("getTicketGrantingTicket -- password: " + password);
System.out.println("getTicketGrantingTicket -- response: " + response);
// 根据响应状态码处理响应
switch (post.getStatusCode()) {
case 201: {
// 使用正则表达式提取TGT,注意正则表达式可能需要根据实际响应格式调整
final Matcher matcher = Pattern.compile(".action="./(.
?)".*").matcher(response);
if (matcher.matches()){
// 如果匹配成功,返回TGT
return matcher.group(1);
}
// 如果匹配失败,记录日志并返回null
LOG.warning("Successful ticket granting request, but no ticket found!");
LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length())));
break;
}
default:
// 如果响应状态码不是201,记录日志并返回null
LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!");
LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length())));
break;
}
} catch (final IOException e) {
// 记录IO异常信息
LOG.warning(e.getMessage());
} finally {
// 释放连接资源
post.releaseConnection();
}
// 如果以上步骤均未返回TGT,则返回null
return null;
}
/**
验证服务票证以获取用户数据
此方法通过向指定的服务器验证URL发送请求,来验证服务票证(serviceTicket)并获取用户的相关信息
它要求服务票证和服务URL作为参数,并检查它们是否为空
然后,它构造一个验证URL,发送HTTP GET请求,并处理响应
@param serverValidate 服务器验证URL,用于验证服务票证
@param serviceTicket 服务票证,需要验证的票证
@param service 服务URL,与服务票证关联的服务地址
@return 返回服务器响应的字符串,包含验证结果和用户数据
*/
public static String ticketValidate(String serverValidate, String serviceTicket, String service) {
// 检查服务票证和服务URL是否为空,如果为空,则抛出异常
notNull(serviceTicket, "paramter 'serviceTicket' is not null");
notNull(service, "paramter 'service' is not null");
// 创建HttpClient实例,用于发送HTTP请求
final HttpClient client = new HttpClient();
GetMethod post = null;
try {
// 构造验证URL,包含服务票证和服务地址,确保服务地址使用UTF-8编码
String ticketValidateUrl = serverValidate + "?" + "ticket=" + serviceTicket + "&service=" + URLEncoder.encode(service, "UTF-8");
// 记录验证URL,用于调试和日志记录
LOG.info("ticketValidateUrl: " + ticketValidateUrl);
// 创建GetMethod实例,用于发送GET请求
post = new GetMethod(ticketValidateUrl);
// 执行HTTP请求
client.executeMethod(post);
// 获取服务器响应的字符串形式
final String response = post.getResponseBodyAsString();
// 记录服务器响应,用于调试和日志记录
LOG.info(response);
// 根据HTTP状态码处理响应
switch (post.getStatusCode()) {
case 200: {
// 如果状态码为200,表示成功获取用户数据
LOG.info("成功取得用户数据");
}
default: {
// 其他状态码不做特殊处理
}
}
// 返回服务器响应的字符串
return response;
} catch (Exception e) {
// 如果发生异常,记录异常信息
LOG.warning(e.getMessage());
} finally {
// 释放资源,确保GetMethod实例占用的资源被正确释放
post.releaseConnection();
}
// 如果发生异常或资源释放失败,返回null
return null;
}
/**
检查对象是否为空,如果对象为空,则抛出带有指定消息的IllegalArgumentException
此方法用于在方法参数或一般对象使用前进行非空校验,以避免空指针异常
@param object 要检查的对象
@param message 对象为空时抛出的异常消息
*/
private static void notNull(final Object object, final String message) {
// 如果对象为null,则抛出IllegalArgumentException,传入自定义的异常消息
if (object == null)
throw new IllegalArgumentException(message);
}
/**
主程序入口
本程序主要用于演示如何通过CAS(Central Authentication Service)进行身份验证
它首先获取一个票据,然后使用该票据进行身份验证
@param args 命令行参数,本例中未使用
*/
public static void main(final String[] args) {
// CAS服务验证URL
final String serviceValidate = "http://127.0.0.1:8080/cas/serviceValidate";
// CAS服务器URL
final String server = "http://127.0.0.1:8080/cas/v1/tickets";
// 服务URL,需要进行身份验证的服务
final String service = "http://127.0.0.1:8080/cas/gmis/logincas.aspx";
// 用户名
final String username = "xxxxx";
// 密码
final String password = "xxxx";
// 获取票据并进行验证
ticketValidate(serviceValidate, getTicket(server, username, password, service), service);
}
}
`
修改于 2024-11-27 03:47:06
上一页
单点登出接口
下一页
第一步 获取tickets
Built with