如何在ORDS Apex类中获取认证头Token值并用于PL/SQL验证
在Apex类中获取认证头并传入PL/SQL验证的方法
1. 在Apex类中获取认证头
如果你的Apex类用于处理外部REST请求,可以通过RestContext对象直接读取请求头。以下是实用示例:
@RestResource(urlMapping='/authValidation/*') global with sharing class AuthHeaderProcessor { @HttpPost global static void handleAuthCheck() { String authHeaderKey = 'Authorization'; String authHeaderValue = null; // 先校验请求和头是否存在,避免空指针异常 if (RestContext.request != null && RestContext.request.headers.containsKey(authHeaderKey)) { authHeaderValue = RestContext.request.headers.get(authHeaderKey); } if (authHeaderValue != null) { // 调用PL/SQL存储过程做验证 String plsqlCall = 'BEGIN verify_auth_header(:auth_val); END;'; Database.executeQuery(plsqlCall, new Map<String, Object>{'auth_val' => authHeaderValue}); } else { // 返回认证缺失的错误响应 RestContext.response.statusCode = 401; RestContext.response.responseBody = Blob.valueOf('认证头不能为空'); } } }
2. 编写PL/SQL验证逻辑
创建对应的存储过程,接收Apex传递的认证头值并执行业务验证:
CREATE OR REPLACE PROCEDURE verify_auth_header(p_auth_val IN VARCHAR2) AS BEGIN -- 示例:校验Bearer令牌格式 IF NOT REGEXP_LIKE(p_auth_val, '^Bearer [A-Za-z0-9\-_.]+$') THEN RAISE_APPLICATION_ERROR(-20001, '认证格式不符合要求'); END IF; -- 可扩展逻辑:比如解码JWT、查询数据库验证令牌有效性、校验用户权限等 -- 示例:SELECT COUNT(*) INTO v_count FROM valid_tokens WHERE token = SUBSTR(p_auth_val, 8); -- IF v_count = 0 THEN RAISE_APPLICATION_ERROR(-20002, '令牌无效'); END IF; END; /
额外说明
- 如果你的Apex类不是REST服务上下文(比如触发器、批处理任务),通常不会直接接收外部请求头。这种场景下若需操作头,一般是主动发起HTTP请求时通过
HttpRequest.getHeader()读取自己设置的头。 - 务必处理
RestContext.request为null的边界情况,避免运行时异常。 - PL/SQL验证逻辑可根据业务需求自由扩展,比如对接身份认证服务、校验用户权限等。
内容的提问来源于stack exchange,提问作者sachin vaidya
相关产品推荐
相关产品推荐

