wifidog认证
前段时间使用wifidog进行wifi强制认证,现在做个小结。
1.首先简单说说wifidog认证的过程
客户端首次连接到wifi后,浏览器请求将会被重定向到:
login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s
验证通过后,客户端被重定向到网关,url格式如下:
http://网关地址:网关端口/wifidog/auth?token=
wifidong会启动一个线程周期性地报告每一个用户的状态信息,并通过如下地址发送给认证
服务器:
auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=
认证服务器根据该状态信息决定是否允许该用户继续连接,并回复网关,回复格式为:Auth:状态码,
如:Auth:1
常用状态码:
0:AUTH_DENIED,表示拒绝
1:AUTH_ALLOWED,验证通过
验证通过后,将重定向到如下地址:
portal/?gw_id=%s
wifidog的ping协议
wifidog通过ping协议将当前状态信息发送给认证服务器,发送地址为:
http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu
认证服务器须返回一个“Pong”作为回应。
2.实战应用
struts配置文件:
| 
			 1 
			2 
			3 
			4 
			5 
			6 
			7 
			8 
			9 
			10 
			11 
			12 
			 | 
			
			<package name="index" namespace="/" extends="interceptorMy,struts-default"><action name="login/" class="goodsAction" method="login"><result name="success" type="redirect">/Login/index.jsp</result><result name="input">/error.jsp</result></action><action name="ping/" class="goodsAction" method="ping"></action> <action name="auth/" class="goodsAction" method="auth"></action><action name="portal/" class="goodsAction" method="portal"></action></package> | 
		
Action方法
| 
			 1 
			2 
			3 
			4 
			5 
			6 
			7 
			8 
			9 
			10 
			11 
			12 
			13 
			14 
			15 
			16 
			17 
			18 
			19 
			20 
			21 
			22 
			23 
			24 
			25 
			26 
			27 
			28 
			29 
			30 
			31 
			32 
			33 
			34 
			35 
			36 
			37 
			38 
			39 
			40 
			41 
			42 
			43 
			44 
			45 
			46 
			47 
			48 
			49 
			50 
			51 
			52 
			53 
			 | 
			
			public String login() {    try{        System.out.println("login start!");                System.out.println("gw_port:"+gw_port);        System.out.println("login end!");                                                                                                                                                                                                                                                                                                                           }    catch(Exception e)    {        e.printStackTrace();        return INPUT;    }    return "success";}public void ping() {    try{        System.out.println("ping start!");        System.out.println(gw_id);        ServletActionContext.getResponse().getWriter().write("Pong");        System.out.println("ping end!");         }    catch(Exception e)    {        e.printStackTrace();    }}public void portal() {    try{        System.out.println("portal start");        System.out.println("protal"+token);    ServletActionContext.getResponse().sendRedirect("/demo/listAction");        System.out.println("portal end");     }    catch(Exception e)    {        e.printStackTrace();    }}public void auth() {    try{        System.out.println("auth start!");        System.out.println("mac"+mac);        System.out.println("stage"+stage);        System.out.println("token"+token);        ServletActionContext.getResponse().getWriter().write("Auth: 1");        System.out.println("auth end!");                                                                                                                                                                                                                                                                                                                           }    catch(Exception e)    {        e.printStackTrace();    }} | 
		
/Login/index.jsp代码:
| 
			 1 
			2 
			3 
			4 
			5 
			6 
			7 
			8 
			9 
			10 
			11 
			12 
			13 
			14 
			15 
			 | 
			
			<%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";    DateFormat format=new SimpleDateFormat("yyMMddHHmmss");    String formatData=format.format(new Date());    int ramdom=new Random().nextInt(1000);    String token=formatData+ramdom;    if(session.getAttribute("token")==null)       session.setAttribute("token",token);                                                                                                                                                                                                                                              %><form method="GET" action='http://192.168.1.1:2060/wifidog/auth'><input type='hidden' name='token' value="<s:property value="#session.token" />" /><input type='submit' value='Welcome!'/></form> | 
		
上面的192.168.1.1为网关的ip,2060为网关端口。
当然,完全可以在处理完login后直接跳到该地址。我们这里为演示其认证流程,故跳到该页面
效果:
客户端连接到wifi后,打开任何连接均跳到上面的index.jsp中,点击"Welcome"后,跳到/demo/listAction,即我们的目标地址。此后点击其他连接将不再拦截。
提示:安装wifidog的路由器必须可以访问Internet,否则wifidog拦截失败,无法跳到我们设定的页面。
本文出自 “青云流水” 博客,请务必保留此出处http://wxhhbdx.blog.51cto.com/2986356/1338059

登录后可发表评论
点击登录