goahead设备内嵌web——环境搭建

基于前一章节环境搭建的基础上,goahead用户登录操作流程。

在web资源目录下创建一个用户登录的HTML文件,login.html文件代码内容如下

<html><head><title>login.html</title></head><body><h1>USER LOGIN</h1><form method="post" action="/action/login">Username <input type="text" name="username" value=''><br/>Password <input type="password" name="password" value=''><br/><input type="submit" name="submit" value="OK"></form></body>
</html>

form表单通过post方法想/action/login提交用户名和密码。启动goahead,web服务器。在浏览器中通过http://localhost/login.html进行访问。 会出现如下界面:

goahead有两种方式读取密码的方式,一种是从文件中读取,也就是前面我们说的auth.txt中,另一种是从参数中。在websOpenAuth中,verifyPassword通过ME_GOAHEAD_AUTH_STORE宏定义来赋值,当是“file”的时候,密码校验从文件中读取websVerifyPasswordFromFile,当“pam”的时候,密码校验从参数中获取websVerifyPasswordFromPam。在头文件me.h中ME_GOAHEAD_AUTH_STORE 默认为file。

因此我们需要在auth.txt中写入一个用户名和对应的密码以及用户的角色。用户名是通过源码编译的路径下的一个gopass工具生成,gopass工具在编译后build/linux-x64-default/bin/路径下,源码在src/utils/gopass.c中。

 gopass的用法gopass [--cipher cipher] [--file path] [--password password] realm user roles,如果没有修改源码这realm目前默认为example.com,接下来我们用gopass创建一个用户名是xiaoming密码是123456789的账户,roles先设置为manger。

./gopass --cipher md5 --file auth.txt --password 123456789 example.com xiaoming manger

然后cat 当前目录下auth.txt可以看到如下,说明我们在auth.txt中写入了一个用户名成功。

#
#   auth.txt - Authorization data
#user name=xiaoming password=26bcb2333915d776a6ac6bbd54f2d2a3 roles=manger

然后将auth.txt 内容拷贝到我们新建目录web_cfg目录下。接下来我们验证密码的正确性。首先需要了解,代码中已经在auth.c中函数PUBLIC int websOpenAuth(int minimal)中定义了login的action的响应处理,websDefineAction("login", loginServiceProc); loginServiceProc函数中websGetVar(wp, "username", "")获取用户名,这个username必须要与html文件中的name保持一致,websGetVar(wp, "password", "") 获取用户密码,同样password需要与html文件中的password的name属性保持一致。websLoginUser函数通过wp->route->verify对密码进行校验。

verify也就是前面描述的websVerifyPasswordFromFile函数。

PUBLIC bool websLoginUser(Webs *wp, cchar *username, cchar *password)
{assert(wp);assert(wp->route);assert(username);assert(password);if (!wp->route || !wp->route->verify) {return 0;}wfree(wp->username);wp->username = sclone(username);wfree(wp->password);wp->password = sclone(password);if (!(wp->route->verify)(wp)) {trace(2, "Password does not match");return 0;}trace(2, "Login successful for %s", username);websCreateSession(wp);websSetSessionVar(wp, WEBS_SESSION_USERNAME, wp->username);return 1;
}

修改route.txt文件,用以配置一些属性,其中handler设置为action

route uri=/action/login handler=action redirect=200@/ redirect=401@/login.html
route uri=/

通过web界面输入用户名:xiaoming 用户密码:123456789点击ok后,form表单将用户名和密码提交到action/login.html中

用户添加 删除 修改密码

在goahead中,通过加载auth.txt,将用户名和密码加载到hash表中,具体流程是通过websLoad(auth),这里的auth指的是auth.txt的路径。在websLoad中通过解析auth.txt文件内容然后将用户名 密码以及角色添加在hash表中。

PUBLIC int websLoad(cchar *path)
{..........else if (smatch(kind, "user")) {char *name, *password, *roles;name = password = roles = 0;while ((option = stok(NULL, " \t\r\n", &next)) != 0) {key = stok(option, "=", &value);if (smatch(key, "name")) {name = value;            //用户名} else if (smatch(key, "password")) {password = value;        //密码} else if (smatch(key, "roles")) {roles = value;            //roles} else {error("Bad user keyword %s", key);continue;}}if (websAddUser(name, password, roles) == 0) {    //添加到hash表中rc = -1;break;}}...........
}

因此在auth.c中用户的操作可以通过一下函数来实现。

1、用户添加

WebsUser *websAddUser(cchar *username, cchar *password, cchar *roles)
{WebsUser    *user;if (!username) {error("User is missing name");return 0;}if (websLookupUser(username)) {error("User %s already exists", username);/* Already exists */return 0;}if ((user = createUser(username, password, roles)) == 0) {return 0;}if (hashEnter(users, username, valueSymbol(user), 0) == 0) {return 0;}return user;
}

2、用户删除

PUBLIC int websRemoveUser(cchar *username)
{WebsKey     *key;assert(username);if ((key = hashLookup(users, username)) != 0) {freeUser(key->content.value.symbol);}return hashDelete(users, username);
}static void freeUser(WebsUser *up)
{assert(up);hashFree(up->abilities);wfree(up->name);wfree(up->password);wfree(up->roles);wfree(up);
}

3、修改密码

PUBLIC int websSetUserPassword(cchar *username, cchar *password)
{WebsUser    *user;assert(username);if ((user = websLookupUser(username)) == 0) {return -1;}wfree(user->password);user->password = sclone(password);return 0;
}

4、查找用户

WebsUser *websLookupUser(cchar *username)
{WebsKey     *key;assert(username);if ((key = hashLookup(users, username)) == 0) {return 0;}return (WebsUser*) key->content.value.symbol;
}

5、设置用户角色

PUBLIC int websSetUserRoles(cchar *username, cchar *roles)
{WebsUser    *user;assert(username);if ((user = websLookupUser(username)) == 0) {return -1;}wfree(user->roles);user->roles = sclone(roles);computeUserAbilities(user);return 0;
}

goahead内嵌web——用户登录相关推荐

  1. 内嵌iframe_内嵌页面session超时,内嵌页面显示登录界面问题解决方案

    内嵌页面session超时,内嵌页面显示登录界面问题解决方案 我们在开发web项目的时候 经常用到iframe嵌套,这里的话 不管是开发的时候,还是正式环境使用.当session超时,或者重启项目,内 ...

  2. 内嵌WEB服务器加载原理

    内嵌WEB服务器加载原理 理解里面的tomcat是如何启动的 Startup.bat Server.start() 1,概述 我们在使用springboot项目的时候并没有使用外部的tomcat,那么 ...

  3. MFC内嵌web页面

    MFC内嵌web页面 方法一: 1.新建工程,插入ActiveX控件Microsoft Web Browser 2.添加关联变量WebDlg 3.添加代码WebDlg.Navigate(_T(&quo ...

  4. .NET5 开发手机提词应用,基于内嵌Web服务器及PowerPoint自动化

    项目说明 我使用电脑录制视频教程的时候,会展示PPT给观众,同时也有一些提示性的文字给我自己看.这就类似于很多电视节目录制现场的"提词器". 节目录制现场的提词器 在PC环境下,P ...

  5. java wed登录面 代码_Java Web用户登录实例代码

    实现功能: 1.用户登陆.注销 2.利用session记录用户登陆信息 3.在JSP中展示已登陆用户信息 实现原理: 登陆后通过判断用户名和密码是否和存储的一致,如果一致,就把用户信息放到sessio ...

  6. 三维视频融合 开放源代码 混合模式 内嵌web容器 c++ js 混合开发 时空克隆引擎 数字孪生 点卯 系列 魔镜系列

    元宇宙的兴起,让以三维视频融合与三维投影融合为核心.以倾斜摄影和三维地图构筑的CIM作为托底的时空克隆引擎,成为时代的主流技术,以此打造了混合架构的魔镜平台 济南用魔镜打造元宇宙城市,难道是真的? 开 ...

  7. 三维视频融合 倾斜摄影模型 开放c++源代码 支持与java js交互 内嵌web容器 可用于雪亮工程 等 安防项目 稳定流畅 点卯系列

    元宇宙的兴起,让以三维视频融合与三维投影融合为核心.以倾斜摄影和三维地图构筑的CIM作为托底的时空克隆引擎,成为时代的主流技术,以此打造了混合架构的魔镜平台 济南用魔镜打造元宇宙城市,难道是真的? 开 ...

  8. web用户登录界面设计_UI设计师怎样做界面设计?

    当你构建用户界面和网站的时候,有各种各样的关于界面设计方法和模式的信息你可以使用,对常见问题的解决方案和一般可用性的建议. 下列给出的准则可能会引导你创造一个良好的用户界面,但是究竟什么才是一个良好的 ...

  9. uniapp 内嵌h5登录页面实现登录

    需求:内嵌pc端登录页面,实现uniapp登录 前提:pc端登录页面,登录成功之后会自动重定向到指定的pc端页面并加上鉴权成功的code // 举例 // www.maomin.com/login P ...

最新文章

  1. 1164: 分治 逆序对
  2. Spring Cloud(一)服务的注册与发现(Eureka)
  3. IE不能开新窗口的解决方法
  4. Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)
  5. python读音有道词典-有道词典命令行快速翻译,Python编程的利器
  6. java 安全库_国家信息安全漏洞库
  7. 达内TTS6.0课件oop_day01
  8. Spring MVC:Ajax和JQuery
  9. long 转为string_面试必问 Redis数据结构底层原理String、List篇
  10. 如何将文件二进制传输至aix服务器,有什么办法把文件从WINDOWS系统中传到AIX中?...
  11. 计算机综合基础作业,《计算机网络基础》综合作业(参考答案).doc
  12. C语言中怎么用循环统计买法,C语言入门谭浩强版简单选择法冒泡法用数组和for循环进行学生成绩简单统计处理...
  13. 带你掌握Vue过滤器filters及时间戳转换
  14. Codeforces Round #326 (Div. 2) B. Pasha and Phone C. Duff and Weight Lifting
  15. java每隔一小时fullgc_JVM菜鸟进阶高手之路六(JVM每隔一小时执行一次Full GC)
  16. 物流前沿理论与方法1
  17. objects365数据集下载
  18. word导入excel html,如何将word导入excel
  19. 阿里云服务器被恶意程序攻击
  20. 欧洲杯赛场“中国元素”引观众热议;万达两家酒店在延安红街开业窑洞房最具特色 | 美通社头条...

热门文章

  1. Nginx是什么?怎么用?(新手入门版)教程
  2. vue本地的模糊匹配
  3. 2022年「博客之星」 无知的人_的程序人生
  4. 推荐系统学习笔记之三 LFM (Latent Factor Model) 隐因子模型 + SVD (singular value decomposition) 奇异值分解
  5. java sql server连接字符串_java连接sql server
  6. 如何设置Java环境变量
  7. win10下QT5.11.1静态编译(带MYSQL)
  8. loss scale的理解
  9. POI java导出Excel设置自适应行高
  10. JVM和Java体系架构