阅读视图

发现新文章,点击刷新页面。
☑️ ☆

Bitwarden / Vaultwarden --- 密码管理工具

1.介绍

Bitwarden 是一款自由且开源的密码管理服务,用户可在加密的保管库中存储敏感信息。Bitwarden 平台提供有多种客户端应用程序,包括网页用户界面、桌面应用,浏览器扩展、移动应用以及命令行界面。Bitwarden 提供云端托管服务,并支持自行部署解决方案。

在调研一些市面常用的密码管理工具之后,我选择了 Bitwarden。然后使用自托管的方式部署在服务器上,定时备份数据库,导出密码,安全性也有保证。

https://bitwarden.com/

而Vaultwarden 是一个使用 Rust 编写的非官方 Bitwarden 服务器实现,提供了不错的 web 管理界面,并与 Bitwarden 兼容。

2.部署

先在服务器执行指令。

docker run -d --name bitwardenrs \  
  --restart unless-stopped \  
  -e WEBSOCKET_ENABLED=true \  
  -v /data/password/data/:/data/ \  
  -p 6666:80 \  
  -p 3012:3012 \  
  vaultwarden/server:latest

部署完成后打开网站,登陆注册之后,删除容器。

需要配置禁止注册的功能,因为我只想自己使用。如果不禁止注册,可以忽略下面这两步。

docker stop bitwardenrs  #停止容器  
docker rm -f bitwardenrs  #删除容器
docker run -d --name bitwardenrs \  
  --restart unless-stopped \  
  -e SIGNUPS_ALLOWED=false \  
  -e WEBSOCKET_ENABLED=true \  
  -v /data/password/data/:/data/ \  
  -p 6666:80 \  
  -p 3012:3012 \  
  vaultwarden/server:latest

3.docker-compose.yml

通过 ChatGPT 我将这段代码转化成了docker-compose.yml 文件,可以更方便的部署安装。

version: '3'
services:
  bitwardenrs:
    image: vaultwarden/server:latest
    container_name: bitwardenrs
    restart: unless-stopped
    environment:
      - SIGNUPS_ALLOWED=false
      - WEBSOCKET_ENABLED=true
    volumes:
      - /data/password/data/:/data/
    ports:
      - "6666:80"
      - "3012:3012"

4.chrome 扩展

通过反向代理可以使用域名登陆 web 端,并且使用了 chrome 扩展方式,在登陆网站可以自动保存密码。

https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb

之后我只需要记住一个主密码,其他网站密码全部采用加密方式生成,方便与安全并存。

☑️ ☆

vue生命周期

学习vue中一个非常重要的领域,就是生命周期,它包含了很多的内容。每个vue实例在被创建的时候都要经历一系列的初始化过程,这个过程就是vue的生命周期。

每个vue实例在被创建的时候都要经过一系列的初始化过程——例如,需要把设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新DOM等,我们要把这一系列的过程称为组件的生命周期(组件从注册到销毁的整个过程)。我们有时候需要在组件生命周期的某个过程中,执行某些代码,基于此,vue提供了生命周期钩子函数,给了用户在不同阶段添加自己的代码的机会。

但是在此之前,我们要详细的介绍下组件的生命周期,以及生命后期中每个阶段组件完成和未完成的部分。

一、组件的生命周期

放一张大家都很熟悉的官网文章中对生命周期的注释图。

从图中可以看出,vue为生命周期提供了8个钩子函数,分别是:

  • beforeCreate: 创建前
  • created: 创建后
  • beforeMount: 挂载前
  • mounted: 挂载后
  • beforeUpate: 更新前
  • upated: 更新后
  • beforeDestoy: 销毁前
  • destoyed: 销毁后

1.beforeCreate

beforeCreate在vue实例发生之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

我们在上面的例子中在的beforeCreate钩子中调用Vue的data和method,来看一下结果:

可以看到Vue中的data和方法都是去不到的,并且是在wath之前执行

2.created

实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

主要应用:调用数据,调用方法,调用异步函数

console输出的结果我们看一下

可以看到:created钩子可以获取Vue的data,调用Vue方法,获取原本HTML上的直接加载出来的DOM,但是无法获取到通过挂载模板生成的DOM(例如:v-for循环遍历Vue.list生成li)

3.beforeMount

在挂载开始之前被调用:相关的 render 函数(模板)首次被调用。

例如通过v-for生成的html还没有被挂载到页面上

 beforeMount: function () {
    console.log('beforeMount:',document.getElementsByTagName('li').length);
  },

console打印出来的beforeMount为1

4.mounted

el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

有初始值的DOM渲染,例如我们的初始数据list,渲染出来的li,只有这里才能获取

 mounted: function () {
    console.log('mounted:',document.getElementsByTagName('li').length);
  },

结果 mounted: 3 , 可以看到到这里为止,挂载到实例上了,我们可以获取到li的个数了

5.beforeUpdate

数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

当我们更改Vue的任何数据,都会触发该函数

 beforeUpdate: function () {
    console.log('beforeUpdate 钩子执行.');
    console.log('beforeUpdate:'+this.message)
  },

6.updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。

该钩子在服务器端渲染期间不被调用。

数据更新就会触发(vue所有的数据只有有更新就会触发),如果想数据一遍就做统一的处理,可以用这个,如果想对不同数据的更新做不同的处理可以用nextTick,或者是watch进行监听

 updated: function () {
    console.log('updated 钩子执行...');
    console.log('updated:',this.message)
  },

7.beforeDestroy

实例销毁之前调用。在这一步,实例仍然完全可用。

8.destroyed

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。

结果

可以看打到销毁Vue实例时会调用这两个函数

❌