LinkAce 增强版自助注册功能实现指南

linkace-self-register.zip

引言:
LinkAce 是一款轻量级、自托管的书签管理系统,适合个人或小团队使用。默认情况下,用户账号只能由管理员手动添加,不支持自助注册。为了满足团队或社区用户自助注册的需求,可以通过改造实现增强版自助注册功能。本文介绍一个增强版方案,支持 邮箱验证 + Google reCAPTCHA 防刷,保证系统安全和用户体验。


1. 增强版功能概述

增强版自助注册模块提供以下功能:

  1. 用户自助注册

  2. 注册表单验证

  3. 默认普通用户权限(is_admin = false

  4. 邮箱激活验证

  5. Google reCAPTCHA 防刷,避免机器人滥用


2. 控制器实现

RegisterController.php

路径:app/Http/Controllers/Auth/RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Mail;

class RegisterController extends Controller
{
    public function showRegistrationForm()
    {
        return view('auth.register');
    }

    public function register(Request $request)
    {
        // reCAPTCHA 验证
        $recaptchaResponse = $request->input('g-recaptcha-response');
        $recaptchaSecret = env('RECAPTCHA_SECRET');
        $recaptcha = file_get_contents("https://www.google.cn/recaptcha/api/siteverify?secret={$recaptchaSecret}&response={$recaptchaResponse}");
        $recaptcha = json_decode($recaptcha);
        if (!$recaptcha->success) {
            return redirect()->back()->withErrors(['captcha' => '请完成验证码验证'])->withInput();
        }

        // 表单验证
        $validator = Validator::make($request->all(), [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        // 生成激活码
        $activationToken = Str::random(64);

        // 创建用户(未激活)
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'is_admin' => false,
            'is_active' => false,
            'activation_token' => $activationToken,
        ]);

        // 发送激活邮件
        $activationLink = url("/activate/{$activationToken}");
        Mail::raw("请点击以下链接激活您的账号:{$activationLink}", function ($message) use ($user) {
            $message->to($user->email)->subject('激活您的 LinkAce 账号');
        });

        return redirect('/login')->with('status', '注册成功,请前往邮箱激活账号');
    }

    public function activate($token)
    {
        $user = User::where('activation_token', $token)->firstOrFail();
        $user->is_active = true;
        $user->activation_token = null;
        $user->save();

        return redirect('/login')->with('status', '账号已激活,可以登录');
    }
}

3. 数据库调整

确保 users 表中有以下字段:

  • is_admin(布尔,默认 false)

  • is_active(布尔,默认 false)

  • activation_token(字符串,可为空)

迁移示例:

Schema::table('users', function (Blueprint $table) {
    $table->boolean('is_admin')->default(false);
    $table->boolean('is_active')->default(false);
    $table->string('activation_token', 64)->nullable();
});

执行迁移:

php artisan migrate

4. 注册页面视图

路径:resources/views/auth/register.blade.php

@extends('layouts.app')

@section('content')
<div class="container" style="max-width: 500px; margin: 50px auto;">
    <h2 style="text-align:center; margin-bottom: 20px;">注册新账号</h2>
    <form method="POST" action="/register">
        @csrf
        <div style="margin-bottom:10px;">
            <label>用户名</label>
            <input type="text" name="name" value="{{ old('name') }}" required style="width:100%; padding:8px;">
            @error('name')<div style="color:red;">{{ $message }}</div>@enderror
        </div>
        <div style="margin-bottom:10px;">
            <label>邮箱</label>
            <input type="email" name="email" value="{{ old('email') }}" required style="width:100%; padding:8px;">
            @error('email')<div style="color:red;">{{ $message }}</div>@enderror
        </div>
        <div style="margin-bottom:10px;">
            <label>密码</label>
            <input type="password" name="password" required style="width:100%; padding:8px;">
            @error('password')<div style="color:red;">{{ $message }}</div>@enderror
        </div>
        <div style="margin-bottom:10px;">
            <label>确认密码</label>
            <input type="password" name="password_confirmation" required style="width:100%; padding:8px;">
        </div>

        <!-- reCAPTCHA -->
        <div class="g-recaptcha" data-sitekey="{{ env('RECAPTCHA_SITEKEY') }}"></div>
        @error('captcha')<div style="color:red;">{{ $message }}</div>@enderror
        <br>

        <button type="submit" style="width:100%; padding:10px; background-color:#4CAF50; color:white; border:none; cursor:pointer;">注册</button>
    </form>
</div>

<script src="https://www.google.cn/recaptcha/api.js" async defer></script>
@endsection

5. 路由设置

文件:routes/web.php

use App\Http\Controllers\Auth\RegisterController;

Route::get('/register', [RegisterController::class, 'showRegistrationForm']);
Route::post('/register', [RegisterController::class, 'register']);
Route::get('/activate/{token}', [RegisterController::class, 'activate']);

6. 环境变量配置

.env 文件中添加:

RECAPTCHA_SITEKEY=你的SiteKey
RECAPTCHA_SECRET=你的SecretKey

MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=your_该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
MAIL_PASSWORD=your_email_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your_该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
MAIL_FROM_NAME="LinkAce"

7. 部署步骤总结

  1. 创建 RegisterController.php 并放入 app/Http/Controllers/Auth/

  2. 创建 register.blade.php 并放入 resources/views/auth/

  3. routes/web.php 添加注册与激活路由。

  4. 调整 users 表,增加 is_adminis_activeactivation_token 字段,并执行迁移。

  5. 配置邮箱和 reCAPTCHA 密钥。

  6. 访问 /register 页面即可使用增强版自助注册功能。


总结:
通过该增强版模块,LinkAce 实现了安全的自助注册功能,支持邮箱验证和验证码防刷,注册用户默认普通权限。部署后即可向更多用户开放注册,同时保证系统安全可靠。

No comments

公司简介

 

自1996年以来,公司一直专注于域名注册、虚拟主机、服务器托管、网站建设、电子商务等互联网服务,不断践行"提供企业级解决方案,奉献个性化服务支持"的理念。作为戴尔"授权解决方案提供商",同时提供与公司服务相关联的硬件产品解决方案。
备案号: 豫ICP备05004936号-1

联系方式

地址:河南省郑州市经五路2号

电话:0371-63520088

QQ:76257322

网站:800188.com

电邮:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。