- 浏览: 227373 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
yjz毕竟是云:
总结的不错!
字符流与字节流的区别 -
yiqing:
不错 有帮助
HTTP Basic Authentication认证 -
assertme:
a8350020 写道第一种方法的线程池其实是没有意义的Fut ...
线程返回值的方式介绍 -
a8350020:
第一种方法的线程池其实是没有意义的Future.get()会阻 ...
线程返回值的方式介绍 -
endual:
一个上午都无法配置好的我的eclipse使用svn 哎。。。
总结一下SVN的用法
package cn.com.superv.ead.common.httpAuth.comm; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Locale; import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; import cn.com.superv.ead.common.ClientInitConf; import sun.misc.BASE64Encoder; /** * 此类提供一些支撑HttpAuth 认证的工具方法 * @author yang,hualong * */ public class UtilHttpAuth { public final static int BASIC_AUTHEM=1; public final static int DIGEST_AUTHEM=2; public final static String AUTH = "Authorization"; public final static String BASIC = "Basic"; public final static String DIGEST = "Digest"; /*以下是digest请求需要的参数*/ public final static String USERNAME="username"; public final static String REALM="realm"; public final static String QOP="qop"; public final static String NONCE="nonce"; public final static String CNONCE="cnonce"; public final static String NCVALUE="nc"; public final static String RESPONSE="response"; public final static String URI="uri"; /* 以下是配置对其配置文件信息*/ public final static String AUTHENTICATIONMODE = "user.authenticationmode"; public final static String USER_USERNAME = "user.username"; public final static String PASSWORD = "user.password"; public final static String PROPERTIES_FILE_PATH="system"; /** * 此方法用于加密Str 串 * @author yang,hualong * @param value * @return */ public static String getBASE64(String value) { if(value == null) return null; BASE64Encoder BaseEncode = new BASE64Encoder(); return(BaseEncode.encode(value.getBytes())); } public static String calcMD5(String str) { try { MessageDigest alga = MessageDigest.getInstance("MD5"); alga.update(str.getBytes()); byte[] digesta = alga.digest(); return byte2hex(digesta); } catch (NoSuchAlgorithmException ex) { //System.out.println("出错了!!"); } return "NULL"; } private static String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; if (n < b.length - 1) hs = hs + ""; } return hs; } /** * 写一个截取需要Basic认证的字符串的方法 * @param subKeyWord * @param basic * @return * 如果不存在当前子串则直接返回null; */ public static String getBasicAuthInfo(String httpAuthKeyWord) { String basic; int index1 = httpAuthKeyWord.indexOf(AUTH); int index2 = httpAuthKeyWord.indexOf("\r\n", index1); int index = index1 + AUTH.length() + 1; if (index1 == -1 || index2 == -1||index==-1) { return null; } basic = httpAuthKeyWord.substring(index, index2); if (basic.indexOf(BASIC) == -1) { return null; } return basic; } /** * 写一个截取需要Digetst认证的字符串的方法 * @param subKeyWord * @param basic * @return * 如果不存在当前子串则直接返回null; */ public static String getDigestAuthInfo(String httpAuthKeyWord) { String digest; int index1 = httpAuthKeyWord.indexOf(AUTH); int index2 = httpAuthKeyWord.indexOf("\r\n", index1); int index = index1 + AUTH.length() + 1; if (index1 == -1 || index2 == -1) { return null; } if(index==-1){ return null; } digest = httpAuthKeyWord.substring(index, index2); if (digest.indexOf(DIGEST) == -1) { return null; } return digest; } /** * 获取 digest类型请求param * @author yang,hualong * @param digestParam 需要查找的字符串 * @param digest digest类型字符串 * @return */ public static String getDigestParam(String digest, String digestParam) { int index1, index2 = 0; /* 校验username */ if (digest == null || digestParam ==null) { return null; } if ((index1 = digest.indexOf(digestParam + "=\"")) == -1) { return null; } index1 = index1 + new String(digestParam + "=\"").length(); if ((index2 = digest.indexOf("\"", index1)) == -1) { return null; } return digest.substring(index1, index2); } /*以下部分用于读取配置文件中的信息*/ public static String getAuthenticationMode(String authenticationMode){ return ClientInitConf.getEcitsConf(authenticationMode); } public static String getUsername(String username){ return ClientInitConf.getEcitsConf(username); } public static String getPassword(String password){ return ClientInitConf.getEcitsConf(password); } public static void main(String[] args) { //验证Basic信息的方法 System.out.println("javaind\r\n"); String authBasicInfo=getDigestAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbm\"c=dddddddddddddddddusername=\"fffffff\"fffDigestffff\"ffffffff\"fffff\r\nfffff\"ffffffffffffffffffffffff"); String test="dddddddddddddddddusername=\"fffffff3333333333333\" "; // getDigestParam(test,"username"); System.out.println(getDigestParam(test,"username")); } }
/**
* 此方用于请求的Http鉴权认证 * @author yang,hualong * @param res * @param baos * @param nc */ private void httpAuthentication(HttpServletResponse res, ByteArrayOutputStream baos, int nc) { // 获取配置文件中的HttpAuth属性 String AuthenticationMode=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.AUTHENTICATIONMODE); int intAuthenticationMode=Integer.parseInt(AuthenticationMode); if (intAuthenticationMode==UtilHttpAuth.BASIC_AUTHEM) { if (basicAuth(res, baos) == false) { return; } } else if (intAuthenticationMode ==UtilHttpAuth.DIGEST_AUTHEM) { if (digestAuth(res, baos, nc) == false) { return; } } } /** * 此方法用于basic认证校验 * @param rsp * @param baos * @return */ private boolean basicAuth(HttpServletResponse rsp,ByteArrayOutputStream baos) { //String httpKeyWord=baos.toString(); // String httpKeyWord=baos.toString(); // String basic= UtilHttpAuth.getBasicAuthInfo(httpKeyWord); String basic=UtilHttpAuth.getBasicAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddddddddddddddddffffffffffBasicfffffffffffffffff\r\nfffffffffffffffffffffffffffff"); String username=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.USER_USERNAME); String password=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.PASSWORD); if(basic==null||basic.indexOf(UtilHttpAuth.getBASE64(username + ":" + password)) == -1) { sendBasicReq(rsp); return false; } return true; } private void sendBasicReq(HttpServletResponse rsp) { StringBuffer sb = new StringBuffer(); ServletOutputStream sender = null; rsp.setStatus(401,"Authorization Required"); sb.append("Basic realm=\"" +UtilHttpAuth.REALM + "\""); rsp.addHeader("WWW-Authenticate",sb.toString()); try { sender = rsp.getOutputStream(); sender.write("".getBytes()); sender.flush(); } catch(Exception e) { System.err.println(e); } } /** * digest认证方式 * @param rsp * @param baos * @param nc * @return */ private boolean digestAuth(HttpServletResponse rsp,ByteArrayOutputStream baos,int nc) { int index1 = 0,index2 = 0; String digest,temp; String username,realm,qop,nonce,ncValue,cnonce,response,uri; String MD5A1,MD5A2; /*检查序列化后的字符串是否包含Auth关键字*/ String httpAuthKeyWord=baos.toString(); digest=UtilHttpAuth.getDigestAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddusername=\"meachalyang\"realm=\"realm\"qop=\"auth\"uri=\"uri\"realm=\"realm\"fDigestfffffffffffffffff\r\nfffffffffffffffffffffffffffff"); // digest = UtilHttpAuth.getDigestAuthInfo(httpAuthKeyWord); if(digest==null){ sendDigestReq(rsp); return false; } /*校验username*/ username=UtilHttpAuth.getDigestParam(digest,UtilHttpAuth.USERNAME); String conf_username=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.USER_USERNAME); if(username==null||!username.equals(conf_username)) { sendDigestReq(rsp); return false; } realm = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.REALM); if(realm==null||!realm.equals(UtilHttpAuth.REALM)){ sendDigestReq(rsp); return false; } /*校验qop*/ qop=UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.QOP); if(qop==null||!qop.equals("auth")) { sendDigestReq(rsp); return false; } /*取得uri*/ uri=UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.URI); if(uri==null){ sendDigestReq(rsp); return false; } /*校验nonce*/ nonce = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.NONCE); if(nonce==null||!nonce.equals(UtilHttpAuth.getBASE64("--NextPart_0_2817_24856"))) { sendDigestReq(rsp); return false; } /*校验nc*/ if((index1 = digest.indexOf("nc=")) == -1) { sendDigestReq(rsp); return false; } index1 = index1 + new String("nc").length()+1; if((index2 = digest.indexOf(",",index1)) == -1) { sendDigestReq(rsp); return false; } ncValue = digest.substring(index1,index2); if(Integer.parseInt(ncValue) != nc) { sendDigestReq(rsp); return false; } /*取得cnonce*/ cnonce = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.CNONCE); if(cnonce==null){ sendDigestReq(rsp); return false; } /*校验response*/ response = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.RESPONSE).trim(); if(response==null){ sendDigestReq(rsp); return false; } String password=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.PASSWORD); String name=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.USER_USERNAME); MD5A1 = UtilHttpAuth.calcMD5(name+ ":" + UtilHttpAuth.REALM+ ":" + password); MD5A2 = UtilHttpAuth.calcMD5("POST" + ":" + uri); temp = UtilHttpAuth.calcMD5(MD5A1 + ":" + nonce + ":" + ncValue + ":" + cnonce + ":" + qop + ":" + MD5A2); if(!temp.trim().equals(response)) { sendDigestReq(rsp); return false; } return true; }
测试数据:
String digest=UtilHttpAuth.getDigestAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddusername=\"meachalyang\"realm=\"realm\"qop=\"auth\"uri=\"uri\"nonce=\"LS1OZXh0UGFydF8wXzI4MTdfMjQ4NTY=\"nc=1,cnonce=\"conce\"response=\"92dcf380bc94a077df83623d7e3e793e\"Digestfffffffffffffffff\r\nfffffffffffffffffffffffffffff"); String basic=UtilHttpAuth.getBasicAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddddddddddddddddffffffffffBasicfffffffffffffffff\r\nfffffffffffffffffffffffffffff");
- demo.rar (5.1 KB)
- 下载次数: 47
发表评论
-
转载 HashMap实现分析
2011-08-29 00:30 827** *@author annegu *@da ... -
Index Full Scan vs Index Fast Full Scan
2011-08-25 15:24 932Index Full Scan vs Index Fas ... -
oracle语句优化
2011-08-25 13:52 938Dear All 系统里有下面的语句,其中MDN是 ... -
转 读写分离
2011-08-23 23:51 1250随着一个网站的业务 ... -
拦截器与过滤器
2011-08-21 22:36 1011很多人都了解过滤器也听说过拦截器,但是要是区分它们的不同 ... -
sql写法的注意事项
2011-08-20 23:20 947基本的Sql编写注意事 ... -
字符流与字节流的区别
2011-08-20 22:50 12481 推荐 流是一个有序的字节序列,可作为一个输 ... -
SOCKET 与 HTTP
2011-08-20 22:32 11154.1 SOCKET与TCP/IP 关系 Sock ... -
tomcat中的几点配置说明
2011-08-19 22:20 9531. 如何加大tomcat连接数 在tomcat配置文 ... -
关于struts1和struts2及webork的单例和多实例
2011-08-18 23:31 845老是看到不会的问题就像转过来,记录下来,以后好看,一定 ... -
线程池的原理和连接池的原理
2011-08-18 23:18 809线程池的原理: ... -
非常好的Spring源码分析链接
2011-08-18 23:06 823http://www.ibm.com/developerwor ... -
oralce sql监控
2011-06-23 16:48 936emctl start dbconsole访问地址为:http ... -
Linux系统 学习
2011-05-31 15:33 867%mem 内存使用率 virt ... -
如何重新配置Oracle的EM Database Control
2011-05-30 17:59 887如何重新配置Oracle的 ... -
流控 demo
2011-05-05 23:05 831http://www.iteye.com/topic/19 ... -
基础VI命令学习
2011-04-21 14:13 794i编辑器是所有Unix及Linux系统下标准的编辑器,它 ... -
hibernate session统一管理的配置
2011-03-31 10:24 1065public class FlushedOpenSess ... -
查看连接池的配置
2011-03-30 16:51 1032<servlet> <serv ... -
保留一些 电信方面知识的链接
2011-03-21 14:46 807保留一些 电信方面知识的链接 写道 http://ww ...
相关推荐
基于Springcloud的基础框架,统一gateWay网关鉴权demo,附下载地址 使用方法具体见:https://blog.csdn.net/a1139628523/article/details/132664763
在这个“Udesk反馈标签鉴权Demo”中,我们主要关注的是如何在JavaWeb环境中实现Udesk工单SDK的用户签名算法,这是进行安全通信和验证客户端请求的重要环节。 首先,我们需要理解什么是鉴权。在Web开发中,鉴权通常...
基于反射实现,高效 java版开放接口统一网关鉴权demo项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目基于反射实现,高效 java版开放接口统一网关...
这个`.NET6 基于jwt鉴权demo`项目应该包含了一个简单的Web应用程序,展示了以上所有步骤。开发者可以通过运行项目,模拟登录过程,查看生成和验证JWT的实现细节。通过这种方式,开发者可以快速了解和实践在.NET 6...
Java项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目
该demo资源结合了java和微信公众号鉴权,有助于开发微信公众号,获取用户信息等
【标题】"基于反射实现,高效 Java版开放接口统一网关鉴权demo项目"揭示了这个开源项目的主要特性,即使用反射技术来提高性能,并且是针对Java开发者的开放接口鉴权解决方案。该项目旨在为Java开发者提供一个统一的...
通过以上这些知识点,我们可以构建一个健壮且安全的基于Spring Cloud Gateway的统一网关鉴权系统,确保只有经过身份验证和授权的请求才能访问后端微服务,从而提高系统的整体安全性。在实际开发中,还需要根据业务...
本项目提供的是一个使用gSOAP库实现的ONVIF协议鉴权与云台控制的代码示例。 gSOAP是开源的C/C++软件开发工具包,用于构建跨平台的Web服务客户端和服务器。它支持SOAP(Simple Object Access Protocol)和WSDL(Web ...
gSOAP是一个开源C和C++库,用于生成客户端和服务端代码,以便在HTTP上实现SOAP和WSDL协议。在ONVIF开发中,gSOAP是关键组件,因为它可以处理复杂的SOAP消息交换,这些消息在ONVIF设备之间传输,如设备发现、能力查询...
直接把项目导入idea就能打开使用,该项目在简单实现shiro登录鉴权的基础上,还实现了接收数据的统一加工处理模块,在接收post或者get请求后,能返回固定模板格式的json数据给前端,对于初期的学习与应用很有帮助。...
腾讯云鉴权是访问腾讯云服务前的一个必要步骤,它确保只有经过验证的用户或应用程序才能访问云资源。鉴权过程通常涉及到API密钥的生成和使用。在本项目中,`authentication_key.py`文件很可能是用来存储和管理这些...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本项目"spring security http接口鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security来实现HTTP接口...
虽然文件名中提到的是`dubbo demo`,这通常与分布式服务框架Dubbo有关,但在本场景下,可能是指一个使用Spring Security的示例应用。检查`dubbodemo`的源码,查找可能存在的鉴权问题,对配置进行审计,是防止安全...
4. **自定义注解**:为了简化鉴权流程,我们可以创建一个自定义注解,比如`@AuthToken`。在控制器的方法上添加此注解,可以自动处理Token的验证,避免在每个方法中重复代码。 5. **错误处理**:如果Token无效或过期...
(1)项目简介 这个demo很简单,是一个记账小工程...这个demo搭建了一个redis主从复制,具体可以参考:http://download.csdn.net/detail/zhutulang/9585010 数据库使用mysql,脚本在 src/main/resources/accounting.sql
SpringBoot AOP,即面向切面编程,是Spring框架中的一个重要特性,用于实现代码的横切关注点,如日志记录、事务管理、权限验证等。AOP通过使用代理模式,将这些关注点与核心业务逻辑分离,使得代码更加模块化,更...
微信 基于最新的微信JS-SDK说明文档 , 自定义分享实现,分享朋友,朋友圈,后台使用java做ticket定时刷新