1Panel部署兰空图床注册添加密钥验证
兰空图床项目地址:
https://github.com/lsky-org/lsky-pro
由于图床服务器为云服务器,非自建NAS,维护成本较高,所以在注册页面添加必要的验证很有必要,可是官方又没有默认提供该设置,那就只有我们自行修改编辑代码的方式来实现想要的功能了。
下面七梦以当前最新兰空图床版本V2.1版本为例:
步骤一:
在 store
方法中添加密钥验证
修改注册逻辑文件(通常位于lsky-pro/data/app/Http/Controllers/Auth/RegisterController.php
),在 $request->validate
的验证规则数组中添加 secret_key
字段的验证逻辑,添加密钥验证:
public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
'secret_key' => ['required', 'string', 'in:YOUR_PREDEFINED_KEY'], // 添加密钥验证规则
]);
-
关键说明:
-
YOUR_PREDEFINED_KEY
替换为你预设的固定密钥(例如ABC123
)。 -
使用
in:
规则确保用户输入的密钥必须与预设值完全匹配。
-
步骤二:
修改注册表单(前端)
在 lsky-pro/data/resources/views/auth/register.blade.php
中添加密钥输入字段,添加 注册密钥验证字段 的位置应放在 确认密码字段之后、注册按钮之前,与其他必填字段保持一致的布局风格。以下是具体修改步骤和代码位置:
代码修改位置
在现有 确认密码 的 <div>
块之后,添加以下代码段:
<!-- 在 "Confirm Password" 的 div 结束后添加以下内容 -->
<!-- Secret Key -->
<div class="mt-4">
<x-label for="secret_key" :value="__('注册密钥')" />
<x-input id="secret_key" class="block mt-1 w-full"
type="text"
name="secret_key"
required
placeholder="请输入注册密钥" />
</div>
完整代码示例(修改后部分)
<!-- Confirm Password -->
<div class="mt-4">
<x-label for="password_confirmation" :value="__('Confirm Password')" />
<x-input id="password_confirmation" class="block mt-1 w-full"
type="password"
name="password_confirmation" required />
</div>
<!-- ↓↓↓ 新增的密钥输入字段 ↓↓↓ -->
<!-- Secret Key -->
<div class="mt-4">
<x-label for="secret_key" :value="__('注册密钥')" />
<x-input id="secret_key" class="block mt-1 w-full"
type="text"
name="secret_key"
required
placeholder="请输入注册密钥" />
</div>
<div class="flex items-center justify-end mt-4">
<a class="underline text-sm text-gray-600 hover:text-gray-900" href="{{ route('login') }}">
{{ __('Already registered?') }}
</a>
<x-button class="ml-4">
{{ __('Register') }}
</x-button>
</div>
关键说明
字段命名与后端验证匹配:
name="secret_key"
必须与你在RegisteredUserController.php
中定义的验证字段名一致(参考之前修改的store
方法中的'secret_key'
验证规则)。required
属性确保用户必须填写此字段才能提交表单。placeholder="请输入注册密钥"
这个部分可根据需要进行删减,作用是在输入框中显示该内容。
然后重新上载 Docker 容器以生效,会发现访问兰空图床(IP:端口)就已经有注册校验的选项了。
修正反向代理配置
因为我直接用1Panel的添加反代网站进行域名反向代理,发现一个问题,网页设置中是强制开启https的,用域名访问发现并没有显示注册密码选项。所以问下全能的AI呗:
根据你的描述,问题出在 域名反向代理的配置未正确处理请求头或参数,导致兰空图床的后端逻辑未正确识别到密钥验证需求。以下是具体原因和解决方案:
原因分析
1.反向代理未传递必要请求头 使用域名反向代理时,若未正确配置 proxy_set_header
,兰空图床的Laravel框架可能无法获取原始请求的 Host 或 X-Forwarded-Proto 头,导致应用误判请求来源,进而影响前端表单的渲染逻辑(如密钥字段未显示)。
2.HTTPS强制跳转未生效 如果域名配置了 HTTPS,但反向代理未强制设置 X-Forwarded-Proto
头,Laravel 应用可能仍以 HTTP 协议处理请求,导致前端模板中的逻辑分支(如密钥字段显示)未触发。
3.应用缓存未更新 修改代码或配置后,若未清除 Laravel 的视图缓存或配置缓存,可能导致前端模板未加载最新修改。
解决方案
修正反向代理配置(核心步骤)
关键修改位置
在OpenResty的域名反向代理配置中,在 server
块中,找到以下代码段:
Nginxproxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
...
proxy_set_header X-Forwarded-Proto https; # 当前硬编码为https
需要修改为:
Nginxproxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 动态传递协议(http/https)
修改说明
- 修正
X-Forwarded-Proto
头 将proxy_set_header X-Forwarded-Proto https;
替换为proxy_set_header X-Forwarded-Proto $scheme;
,动态传递客户端真实协议(HTTP或HTTPS),而非硬编码为https
。这是Laravel识别协议的关键。 - 移除冗余头
X-Forwarded-Host
proxy_set_header X-Forwarded-Host $server_name;
可能导致与Host
头冲突,建议删除或保留为$host
。