主頁 > 區塊鏈 > 擴展IonAuth模型,第三方檔案夾中的語言檔案-Codeigniter4

擴展IonAuth模型,第三方檔案夾中的語言檔案-Codeigniter4

2022-01-24 08:19:07 區塊鏈

IonAuth 在 Codeigniter4 上的第三方檔案夾中運行。我已經擴展了控制器,因為我在我的 app/Controllers 目錄中運行了 Auth.php 并且它正在作業。

如何擴展 IonAuth 庫、模型和語言檔案等?與 Auth.php 控制器不同,這些檔案會被忽略。我不想編輯第三方檔案夾中的檔案,以便更容易升級等。謝謝。

uj5u.com熱心網友回復:

看看我的代碼 像我一樣按照我的方法 ctl auth

<?php namespace Modules\Auth\Controllers;


use Modules\Auth\Config\ModuleAuthConfig;
use Modules\Auth\Config\Services;
use Modules\Auth\Entities\AuthEntity;
use Modules\Auth\Enums\RoleType;
use Modules\Auth\Interfaces\AuthControllerInterface;
use Modules\Shared\Config\ModuleSharedConfig;
use Modules\Shared\Controllers\BaseController;
use Modules\Shared\Enums\NotificationType;

use CodeIgniter\HTTP\ResponseInterface;
use Myth\Auth\AuthTrait;
use Pusher\Pusher;
use ReCaptcha\ReCaptcha;

class Auth extends BaseController implements AuthControllerInterface
{
    use AuthTrait;


    public function signInJwt(): ResponseInterface
    {


        /**
         * Attempts to verify the user's credentials
         * through a POST request.
         */
        $rules = [
            'login' => 'required',
            'password' => 'required'

        ];

        $config = config('Myth\Auth\Config\Auth');

        if ($config->validFields == ['email']) {
            $rules['login'] .= '|valid_email';
        };


        if (!$this->validate($rules)) {


            return $this->response->setJSON(['error' => $this->validator->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }

        $authEntity = new AuthEntity((array)$this->request->getVar());

        $authEntity->logInMode()->loginDate()->ipAddress($this->request->getIPAddress());


        $authService = Services::authService();
        $data = $authService->signInJwt($authEntity);
        $authConfig = new  ModuleAuthConfig();

        return $this->response->setHeader($authConfig->jwt['name'], $data['jwt']['token'])
            ->setCookie($authConfig->jwt['name'], $data['jwt']['token'], $data['jwt']['expire'])->
            setJSON($data)->setStatusCode(ResponseInterface::HTTP_OK, lang('Authenticate.auth.logIn'))
            ->setContentType('application/json');


    }

    public function signIn(): ResponseInterface
    {


        $this->setupAuthClasses();


        /**
         * Attempts to verify the user's credentials
         * through a POST request.
         */
        $rules = [
            'login' => 'required',
            'password' => 'required'

        ];

        $config = config('Myth\Auth\Config\Auth');

        if ($config->validFields == ['email']) {
            $rules['login'] .= '|valid_email';
        };


        if (!$this->validate($rules)) {


            return $this->response->setJSON(['error' => $this->validator->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }


        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->logInMode();


        $remember = $authEntity->remember ?? false;

        if (!$this->authenticate->attempt([$authEntity->loginType => $authEntity->login, 'password' => $authEntity->password], $remember)) {


            return $this->response->setJSON(['error' => $this->authenticate->error(),
            ])
                ->setStatusCode(ResponseInterface::HTTP_UNAUTHORIZED, lang('Auth.badAttempt'))
                ->setContentType('application/json');

        }

        // Is the user being forced to reset their password?
        if ($this->authenticate->user()->force_pass_reset === true) {

            //  return redirect()->to(route_to('reset-password') . '?token=' . $this->auth->user()->reset_hash)->withCookies();
            return $this->response->setJSON(['token' => $this->authenticate->user()->reset_hash])
                ->setStatusCode(ResponseInterface::HTTP_UNAUTHORIZED, lang('Authenticate.auth.foreResetPassword'))
                ->setContentType('application/json');

        }

        $authService = Services::authService();
        $data = $authService->signIn($authEntity);


        return $this->response->setJSON(
            $data
        )->setStatusCode(ResponseInterface::HTTP_OK, lang('Authenticate.auth.logIn'))
            ->setContentType('application/json');


    }


    /**
     * Log the user out.
     */
    public function signOut(): ResponseInterface
    {

        $this->setupAuthClasses();
        $authConfig = new  ModuleAuthConfig();

        $jwtHeader = $this->request->getServer('HTTP_AUTHORIZATION');
        $jwtCookie = $this->request->getCookie($authConfig->jwt['name']);


        if ($this->authenticate->check()) {
            $this->authenticate->logout();
        } else if (!is_null($jwtHeader) || !is_null($jwtCookie)) {


            $authService = Services::authService();

            $requestWithUser = Services::requestWithUser();
            $authService->signOutJwt($requestWithUser->getUser());

            $this->response->setHeader($authConfig->jwt['name'], '');
            $this->response->setCookie($authConfig->jwt['name'], '', 0);

        }

        return $this->response->setJSON(['success' => true])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Authenticate.auth.logOut'))
            ->setContentType('application/json');


    }

    /**
     * Log the user out.
     */
    public function isSignIn(): ResponseInterface
    {

        $this->setupAuthClasses();
        $requestWithUser = Services::requestWithUser();

        if ($this->authenticate->check() || isset($requestWithUser->getUser()->id)) {

            return $this->response->setJSON(['success' => true])
                ->setStatusCode(ResponseInterface::HTTP_OK, lang('check is sign in'))
                ->setContentType('application/json');
        } else {
            return $this->response->setJSON(['success' => false,
            ])
                ->setStatusCode(ResponseInterface::HTTP_OK, lang('check is sign in'))
                ->setContentType('application/json');
        }


    }


    //--------------------------------------------------------------------
    // Register
    //--------------------------------------------------------------------

    /**
     * Displays the user registration page.
     */
    public function signUp(): ResponseInterface
    {


        $throttler = \Codeigniter\Config\Services::throttler();

        if ($throttler->check($this->request->getIPAddress(), 5, MINUTE) === false) {

            return $this->response->setJSON(['data' => $throttler->getTokentime()])
                ->setStatusCode(ResponseInterface::HTTP_TOO_MANY_REQUESTS, lang('Auth.tooManyRequests', [$throttler->getTokentime()]))
                ->setContentType('application/json');

        }

        // Validate here first, since some things,
        // like the password, can only be validated properly here.
        // strong password didint work custom validation  strong_password
        // password=> strong_password
        helper('authentication');

        if (loginVia($this->request->getVar('login') ?? $this->request->getVar('login')) == 'email') {

            $lineRule = 'required|valid_email|is_unique[users.email]';
        } else if (loginVia($this->request->getVar('login') ?? $this->request->getVar('login')) == 'phone') {

            $lineRule = 'required|min_length[9]|is_unique[users.phone]';
        } else {

            return $this->response->setJSON(['error' => lang('Authenticate.auth.emailOrPhone')])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }

        $rules = [
            'username' => 'required|alpha_numeric_space|min_length[3]|is_unique[users.username]',
            'login' => $lineRule,
            'password' => 'required|min_length[6]',
            'passConfirm' => 'required|matches[password]',
            'action' => 'required',
            'token' => 'required',
            'socialLogin' => 'required'

        ];

        if (!$this->validate($rules)) {

            return $this->response->setJSON([

                'error' => service('validation')->getErrors(),
            ])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');

        }


        $authConfig = new  \Modules\Auth\Config\ModuleAuthConfig();
        // ->setExpectedHostname($_SERVER['SERVER_NAME'])
        $recaptcha = new ReCaptcha($authConfig->captcha['secretKey']);
        $resp = $recaptcha->setExpectedAction($this->request->getVar('action'))
            ->setScoreThreshold(0.2)
            ->verify($this->request->getVar('token'), $_SERVER['REMOTE_ADDR']);
        // verify the response
        if (!$resp->isSuccess() && !$this->request->getVar('socialLogin')) {
            // spam submission
            // show error message
            return $this->response->setJSON([
                'error' => $resp->getErrorCodes()])
                ->setStatusCode(ResponseInterface:: HTTP_UNAUTHORIZED, lang('Authenticate.auth.captchaError'))
                ->setContentType('application/json');
        }
        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->logInMode()->createdAt()->setRole(RoleType::Member);
        unset($authEntity->token);
        unset($authEntity->action);
        $authService = Services::authService();
        $authService->signUp($authEntity);


        $sharedConfig = new ModuleSharedConfig();

        $pusher = new Pusher(
            $sharedConfig->pusher['authKey'],
            $sharedConfig->pusher['secret'],
            $sharedConfig->pusher['appId'],
            ['cluster' => $sharedConfig->pusher['cluster'],
                'useTLS' => $sharedConfig->pusher['useTLS']]
        );
        $data['type'] = NotificationType::NewUser;
        $data['message'] = 'new user register';
        $data['counter'] = 1;
        $data['date'] = date('Y-m-d H:i:s', time());;
        $pusher->trigger('notification-channel', 'my-event', $data);


        return $this->response->setJSON(['success' => true])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Auth.registerSuccess'))
            ->setContentType('application/json');


    }

//--------------------------------------------------------------------
// Forgot Password
//--------------------------------------------------------------------

    /**
     * Displays the forgot password form.
     */
    public
    function forgot(): ResponseInterface
    {


        $rules = [

            'login' => 'required',
            'action' => 'required',
            'token' => 'required',

        ];

        if (!$this->validate($rules)) {


            return $this->response->setJSON(['error' => service('validation')->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');

        }

        $authConfig = new  \Modules\Auth\Config\ModuleAuthConfig();
        // ->setExpectedHostname($_SERVER['SERVER_NAME'])
        $recaptcha = new ReCaptcha($authConfig->captcha['secretKey']);

        $resp = $recaptcha->setExpectedAction($this->request->getVar('action'))
            ->setScoreThreshold(0.2)
            ->verify($this->request->getVar('token'), $_SERVER['REMOTE_ADDR']);
        // verify the response
        if (!$resp->isSuccess()) {
            // spam submission
            // show error message
            return $this->response->setJSON([
                'error' => $resp->getErrorCodes()])
                ->setStatusCode(ResponseInterface:: HTTP_UNAUTHORIZED, lang('Authenticate.auth.captchaError'))
                ->setContentType('application/json');
        }


        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->logInMode(false)->generateResetHash();
        unset($authEntity->token);
        unset($authEntity->action);
        $authService = Services::authService();
        $authService->forgot($authEntity);


        return $this->response->setJSON(['success' => true])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Authenticate.auth.forgotEmailSmsSent'))
            ->setContentType('application/json');

    }

    /**
     * Displays the Reset Password form.
     */
    /**
     * Verifies the code with the email and saves the new password,
     * if they all pass validation.
     *
     * @return mixed
     */

    public
    function resetPasswordViaSms(): ResponseInterface
    {


        $rules = [
            'code' => 'required',
            'phone' => 'required',
            'password' => 'required',
            'passConfirm' => 'required|matches[password]',
        ];

        if (!$this->validate($rules)) {

            return $this->response->setJSON(['error' => $this->validator->getErrors(),])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');

        }

        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->resetPassword();
        $authService = Services::authService();
        $authService->resetPasswordViaSms($authEntity);


        return $this->response->setJSON(['success' => true])->setStatusCode(ResponseInterface::HTTP_OK, lang('Auth.resetSuccess'))
            ->setContentType('application/json');


    }

    /**
     * Verifies the code with the email and saves the new password,
     * if they all pass validation.
     *
     * @return mixed
     */

    public
    function resetPasswordViaEmail(): ResponseInterface
    {


        $rules = [
            'token' => 'required',
            'email' => 'required|valid_email',
            'password' => 'required',
            'passConfirm' => 'required|matches[password]',
        ];


        if (!$this->validate($rules)) {

            return $this->response->setJSON(['error' => $this->validator->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }

        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->resetPassword()
            ->userAgent($this->request->getUserAgent())
            ->ipAddress($this->request->getIPAddress());
        $authService = Services::authService();
        $authService->resetPasswordViaEmail($authEntity);

        return $this->response->setJSON(['success' => true])->setStatusCode(ResponseInterface::HTTP_OK, lang('Auth.resetSuccess'))
            ->setContentType('application/json');


    }

    /**
     * Activate account.
     *
     * @return mixed
     */
    public
    function activateAccountViaEmail(): ResponseInterface
    {
        $rules = [
            'token' => 'required',
            'email' => 'required|valid_email',
        ];
        if (!$this->validate($rules)) {

            return $this->response->setJSON([

                'error' => $this->validator->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }


        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->activate()
            ->userAgent($this->request->getUserAgent())
            ->ipAddress($this->request->getIPAddress());


        $authService = Services::authService();
        $authService->activateAccountViaEmail($authEntity);

        return $this->response->setJSON(['success' => true])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Auth.registerSuccess'))
            ->setContentType('application/json');


    }

    /**
     * Resend activation account.
     *
     * @return mixed
     * @throws \Exception
     */
    public
    function sendActivateCodeViaEmail(): ResponseInterface
    {


        $rules = [
            'email' => 'required',
        ];

        if (!$this->validate($rules)) {
            return $this->response->setJSON(['error' => service('validation')->getErrors()
            ])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }


        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->generateActivateHash();
        $authService = Services::authService();
        $authService->sendActivateCodeViaEmail($authEntity);

        return $this->response->setJSON(['success' => true])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Auth.activationSuccess'))
            ->setContentType('application/json');

    }

    /**
     * Activate account via sma.
     *
     * @return mixed
     */
    public
    function activateAccountViaSms(): ResponseInterface
    {

        $rules = [
            'phone' => 'required',
            'code' => 'required',
        ];

        if (!$this->validate($rules)) {
            return $this->response->setJSON(['error' => service('validation')->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }


        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authEntity->activate();
        $authService = Services::authService();
        $authService->activateAccountViaSms($authEntity);


        return $this->response->setJSON(['success' => true])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Authenticate.auth.registerSuccess'))
            ->setContentType('application/json');

    }

    /**
     * Activate account via sma.
     *
     * @return mixed
     */
    public
    function sendActivateCodeViaSms(): ResponseInterface
    {

        $rules = [
            'phone' => 'required',
        ];

        if (!$this->validate($rules)) {
            return $this->response->setJSON(['error' => service('validation')->getErrors()])
                ->setStatusCode(ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Authenticate.auth.validation'))
                ->setContentType('application/json');
        }

        $authEntity = new AuthEntity((array)$this->request->getVar());
        $authService = Services::authService();
        $authService->sendActivateCodeViaSms($authEntity);


        return $this->response->setJSON(['success' => true,
        ])
            ->setStatusCode(ResponseInterface::HTTP_OK, lang('Authenticate.auth.smsActivation'))
            ->setContentType('application/json');


    }


}

物體認證

<?php namespace Modules\Auth\Entities;

use \CodeIgniter\Entity;
use CodeIgniter\I18n\Time;
use Myth\Auth\Authorization\GroupModel;
use Myth\Auth\Authorization\PermissionModel;
use Myth\Auth\Entities\User;
use Myth\Auth\Password;

class  AuthEntity extends Entity
{

    protected $id;
    protected $phone;
    protected $username;
    protected $image;
    protected $email;
    protected $password;
    protected $login;
    protected $loginType;
    protected $remember;
    protected $IpAddress;
    protected $userAgent;
    protected $role;
    protected $code;
    protected $token;
    protected $action;


    protected $attributes = [
        'id' => null,
        'username' => null,
        'phone' => null,
        'email' => null,
        'active' => null,
        'created_at' => null,
        'login' => null,
        'loginType' => null,
        'password' => null,
        'ip_address' => null,
        'date' => null,
        'success' => null,
        'role' => null,
        'code' => null,
        'token' => null,
        'user_agent' => null,
        'remember' => null,

    ];
    protected $datamap = [

        'createdAt' => 'created_at',
        'ipAddress' => 'ip_address',
        'userAgent' => 'user_agent',

    ];


    /**
     * Define properties that are automatically converted to Time instances.
     */
    protected $dates = ['reset_at', 'reset_expires', 'created_at', 'updated_at', 'deleted_at'];

    /**
     * Array of field names and the type of value to cast them as
     * when they are accessed.
     */
    protected $casts = [
        'active' => 'boolean',
        'force_pass_reset' => 'boolean',
    ];

    /**
     * Per-user permissions cache
     * @var array
     */
    protected $permissions = [];

    /**
     * Per-user roles cache
     * @var array
     */
    protected $roles = [];

    /**
     * Automatically hashes the password when set.
     *
     * @see https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence
     *
     * @param string $password
     */
    public function setPassword(string $password)
    {
        $this->attributes['password'] = $password;
        $this->attributes['password_hash'] = Password::hash($password);

        /*
            Set these vars to null in case a reset password was asked.
            Scenario:
                user (a *dumb* one with short memory) requests a
                reset-token and then does nothing => asks the
                administrator to reset his password.
            User would have a new password but still anyone with the
            reset-token would be able to change the password.
        */
        $this->attributes['reset_hash'] = null;
        $this->attributes['reset_at'] = null;
        $this->attributes['reset_expires'] = null;
    }

    /**
     * Force a user to reset their password on next page refresh
     * or login. Checked in the LocalAuthenticator's check() method.
     *
     * @return $this
     * @throws \Exception
     *
     */
    public function forcePasswordReset(): AuthEntity
    {
        $this->generateResetHash();
        $this->attributes['force_pass_reset'] = 1;

        return $this;
    }

    /**
     * Generates a secure hash to use for password reset purposes,
     * saves it to the instance.
     *
     * @return $this
     * @throws \Exception
     */
    public function generateResetHash(): AuthEntity
    {
        $this->attributes['reset_hash'] = bin2hex(random_bytes(16));
        $this->attributes['reset_expires'] = date('Y-m-d H:i:s', time()   config('Auth')->resetTime);

        return $this;
    }

    /**
     * Generates a secure random hash to use for account activation.
     *
     * @return $this
     * @throws \Exception
     */
    public function generateActivateHash(): AuthEntity
    {
        $this->attributes['activate_hash'] = bin2hex(random_bytes(16));

        return $this;
    }

    /**
     * Activate user.
     *
     * @return $this
     */
    public function activate(): AuthEntity
    {
        $this->attributes['active'] = 1;
        $this->attributes['activate_hash'] = null;

        return $this;
    }

    /**
     * Unactivate user.
     *
     * @return $this
     */
    public function deactivate(): AuthEntity
    {
        $this->attributes['active'] = 0;

        return $this;
    }

    /**
     * Checks to see if a user is active.
     *
     * @return bool
     */
    public function isActivated(): bool
    {
        return isset($this->attributes['active']) && $this->attributes['active'] == true;
    }


    public function logInMode($flag = true): AuthEntity
    {
// Determine credential type

        if ($flag == false) {

            if (filter_var($this->attributes['login'], FILTER_VALIDATE_EMAIL)) {
                $this->attributes['loginType'] = 'email';

            } else if (is_numeric($this->attributes['login'])) {
                $this->attributes['loginType'] = 'phone';

            } else {
                $this->attributes['loginType'] = 'username';

            }

        } else {


            if (filter_var($this->attributes['login'], FILTER_VALIDATE_EMAIL)) {
                $this->attributes['loginType'] = 'email';
                $this->attributes['email'] = $this->attributes['login'];
            } else if (is_numeric($this->attributes['login'])) {
                $this->attributes['loginType'] = 'phone';
                $this->attributes['phone'] = $this->attributes['login'];

            } else {
                $this->attributes['loginType'] = 'username';
                $this->attributes['username'] = $this->attributes['login'];
            }
        }
        return $this;
    }

    public function ipAddress(string $ip): AuthEntity
    {
        $this->attributes['ip_address'] = $ip;
        return $this;
    }

    public function loginDate(): AuthEntity
    {
        $this->attributes['date'] = date('Y-m-d H:i:s', time());;
        return $this;
    }

    public function loginSuccess(bool $flag): AuthEntity
    {
        $this->attributes['success'] = $flag;
        return $this;
    }

    public function createdAt(): AuthEntity
    {
        $this->attributes['created_at'] = date('Y-m-d H:i:s', time());;
        return $this;
    }

    public function setRole(string $role): AuthEntity
    {
        $this->attributes['role'] = $role;
        return $this;
    }

    public function resetPassword(): AuthEntity
    {
        $this->attributes['reset_hash'] = null;
        $this->attributes['reset_expires'] = null;
        $this->attributes['reset_at'] = date('Y-m-d H:i:s');
        $this->attributes['force_pass_reset'] = false;


        return $this;
    }

    public function userAgent(string $agent): AuthEntity
    {
        $this->attributes['user_agent'] = $agent;
        return $this;
    }
}


uj5u.com熱心網友回復:

服務認證

<?php namespace Modules\Auth\Services;


use Codeigniter\Config\Services;
use CodeIgniter\Session\SessionInterface;
use Config\Email;
use Modules\Auth\Config\ModuleAuthConfig;
use Modules\Auth\Entities\AuthEntity;
use Modules\Auth\Interfaces\AuthServiceInterface;
use Modules\Auth\Models\GroupsPermissionModel;
use Modules\Auth\Models\UsersPermissionModel;
use Modules\Shared\Config\ModuleSharedConfig;
use Modules\Shared\Libraries\MainService;
use Modules\Shared\Libraries\Sms;
use CodeIgniter\HTTP\ResponseInterface;
use Modules\Auth\Libraries\CsrfSecurity;
use Myth\Auth\Authorization\GroupModel;
use Myth\Auth\Authorization\PermissionModel;
use Myth\Auth\AuthTrait;


use Myth\Auth\Models\LoginModel;
use Myth\Auth\Models\UserModel;
use Myth\Auth\Password;


class AuthService extends MainService implements AuthServiceInterface
{
    use AuthTrait;

    private CsrfSecurity $csrfSecurity;
    private GroupModel $groupModel;
    private PermissionModel $permissionModel;
    private ModuleAuthConfig $authConfig;
    private UserModel $userModel;
    private SessionInterface $session;
    private LoginModel $loginModel;
    private ModuleSharedConfig $sharedConfig;
    private Sms $sms;
    private GroupsPermissionModel $groupsPermissionModel;
    private UsersPermissionModel $usersPermissionModel;

    private \CodeIgniter\Email\Email $email;


    public function __construct()
    {
        $this->userModel = new UserModel();
        $this->authConfig = new  ModuleAuthConfig();
        $this->groupModel = new GroupModel();
        $this->csrfSecurity = new CsrfSecurity();
        $this->permissionModel = new PermissionModel();
        $this->loginModel = new LoginModel();
        $this->session = \Config\Services::session();
        $this->sharedConfig = new ModuleSharedConfig();
        $this->sms = new Sms($this->sharedConfig->sms['userName'],
            $this->sharedConfig->sms['password'],
            0);
        $this->groupsPermissionModel = new GroupsPermissionModel();
        $this->usersPermissionModel = new UsersPermissionModel();

        $this->email = Services::email();
        $emailConfig = new Email();
        $this->email->initialize($emailConfig)->
        setFrom($emailConfig->fromEmail, getenv('siteAddress'));
    }

    public function signInJwt(AuthEntity $entity): array
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_CONFLICT);


        $findUser = $this->userModel->asObject()->where($entity->loginType, $entity->login)->first();

        if (!$findUser) {
            $entity->loginSuccess(false);
            $this->loginModel->save($entity);
            $this->httpException(lang('Authenticate.auth.accountNotExist'), ResponseInterface::HTTP_CONFLICT);
        }
        if ($findUser->active == false) {
            $entity->loginSuccess(false);
            $this->loginModel->save($entity);
            $this->httpException(lang('Authenticate.auth.accountNotActive'), ResponseInterface::HTTP_CONFLICT);

        }
        if ($findUser->status == true) {
            $entity->loginSuccess(false);
            $this->loginModel->save($entity);
            $this->httpException(lang('Authenticate.auth.accountIsBand'), ResponseInterface::HTTP_CONFLICT);

        }

        if (!Password::verify($entity->password, $findUser->password_hash)) {
            $entity->loginSuccess(false);
            $this->loginModel->save($entity);
            $this->httpException(lang('Authenticate.auth.accountNotExist'), ResponseInterface::HTTP_CONFLICT);

        }

        $entity->loginSuccess(true);
       $this->loginModel->save($entity);

        $role = $this->groupModel->asObject()->getGroupsForUser($findUser->id);

        $permissions = $this->permissionModel->asObject()->where('active', '1')->findAll();
        $permissionUser = $this->usersPermissionModel->permissionsOfUser($findUser->id);
        $permissionGroup = $this->groupsPermissionModel->permissionsOfGroup($role[0]['group_id']);

        helper('jwt');

        $timeJwt = isset($entity->remember) ? timeJwt(true) : timeJwt(false);

        $jwtToken = generateJWT($findUser->id, $timeJwt['init'], $timeJwt['expire'], $this->authConfig->jwt['secretKey']);

        $data = [
            'success' => true,
            'role' => [
                'name' => $role[0]['name'],
                'id' => $role[0]['group_id']
            ],
            'permissions' => $permissions,
            'permissionUser' => $permissionUser,
            'permissionGroup' => $permissionGroup,
            'userInformation' => [
                'id' => $findUser->id,
                'userName' => $findUser->username,
                'image' => $findUser->image,
                'firstName' => $findUser->first_name,
                'lastName' => $findUser->last_name,
                'email' => $findUser->email,
                'phone' => $findUser->phone,
            ],
            'csrf' => $this->csrfSecurity->init(),
            'jwt' => [
                "token" => $jwtToken,
                "expire" => $timeJwt['expire'],
            ],

        ];

        return $data;


    }

    public function signIn(AuthEntity $entity): array
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_CONFLICT);

        helper('cookie');


//
        $findUser = $this->userModel->asObject()->where($entity->loginType, $entity->login)->first();

        $role = $this->groupModel->asObject()->getGroupsForUser($findUser->id);
        $permissions = $this->permissionModel->asObject()->where('active', '1')->findAll();
        $permissionUser = $this->usersPermissionModel->permissionsOfUser($findUser->id);
        $permissionGroup = $this->groupsPermissionModel->permissionsOfGroup($findUser->id);

        // store user inof in session
//        $this->session->set('userInformation', [
//            'userName' => $this->authenticate->user()->username,
//            'image' => $this->authenticate->user()->image,
//            'firstName' => $this->authenticate->user()->first_name,
//            'lastName' => $this->authenticate->user()->last_name,
//            'email' => $this->authenticate->user()->email,
//            'phone' => $this->authenticate->user()->phone,
//        ]);


        $data = [
            'success' => true,
            'role' => [
                'name' => $role[0]['name'],
                'id' => $role[0]['group_id']
            ],
            'permissions' => $permissions,
            'permissionUser' => $permissionUser,
            'permissionGroup' => $permissionGroup,
            'userInformation' => [
                'id' => $findUser->id,
                'userName' => $findUser->username,
                'image' => $findUser->image,
                'firstName' => $findUser->first_name,
                'lastName' => $findUser->last_name,
                'email' => $findUser->email,
                'phone' => $findUser->phone,
            ],
            'csrf' => $this->csrfSecurity->init(),
        ];

        return $data;

    }


    /**
     * Log the user out.
     * @param object $userData
     */
    public function signOutJwt(object $userData): void
    {
        if (!isset($userData->id)) $this->httpException(lang('Authenticate.filter.jwt'), ResponseInterface::HTTP_CONFLICT);


        $findUser = $this->userModel->asObject()->where("id", $userData->id)->first();

        if (is_null($findUser)) $this->httpException(lang('Auth.forgotNoUser'), ResponseInterface::HTTP_UNAUTHORIZED);


    }



    //--------------------------------------------------------------------
    // Register
    //--------------------------------------------------------------------

    /**
     * Displays the user registration page.
     * @param AuthEntity $entity
     */
    public function signUp(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_CONFLICT);

        $entity->generateActivateHash();

        $this->userModel->withGroup($entity->role);

        if (!$this->userModel->save($entity)) {


            $message = lang('Authenticate.auth.rejectRegistration') . " , " . serializeMessages($this->userModel->errors());
            $this->httpException($message, ResponseInterface::HTTP_BAD_REQUEST);

        }


        if ($entity->loginType == 'email') {


            $isSent = $this->email
                ->setTo($entity->email)
                ->setSubject(lang('Auth.activationSubject'))
                ->setMessage(view($this->authConfig->views['emailActivation'],
                    ['hash' => $entity->toArray()['activate_hash']]))
                ->setMailType('html')->send();


            if (!$isSent) {
                $this->groupModel->removeUserFromAllGroups($this->userModel->getInsertID());
                $this->userModel->where('id', $this->userModel->getInsertID())->delete();


                $message = lang('Authenticate.auth.failRegistration') . " , " . serializeMessages($this->activator->error() ?? lang('Auth.unknownError'));
                $this->httpException($message,
                    ResponseInterface::HTTP_BAD_REQUEST, $this->email->printDebugger(['headers']));

            }
        } else if ($entity->loginType == 'phone') {


            $isSend = $this->sms->sendActivationCode($entity->phone, getenv('siteAddress'));

            if ($isSend < 2000) {

                $message = lang('Authenticate.auth.smsSendFail');
                $this->httpException($message, ResponseInterface::HTTP_FOUND);

            }
        }


    }

//--------------------------------------------------------------------
// Forgot Password
//--------------------------------------------------------------------

    /**
     * Displays the forgot password form.
     * @param AuthEntity $entity
     */
    public
    function forgot(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_CONFLICT);


        $findUser = $this->userModel->where($entity->loginType, $entity->login)->first();

        if (is_null($findUser)) $this->httpException(lang('Auth.forgotNoUser'), ResponseInterface::HTTP_UNAUTHORIZED);

        $statusEmail = false;
        $statusSms = 0;
        if (!is_null($findUser->email)) {

            $statusEmail = $this->email
                ->setTo($findUser->email)
                ->setSubject(lang('Auth.forgotSubject'))
                ->setMessage(view($this->authConfig->views['emailForgot'],
                    ['hash' => $entity->toArray()['reset_hash']]))
                ->setMailType('html')->send();


        }


        if (!is_null($findUser->phone)) {

            $statusSms = $this->sms->sendActivationCode($findUser->phone, getenv('siteAddress'));

        }


        if ($statusSms < 2000 && !$statusEmail) $this->httpException(lang('Auth.unknownError'),
            ResponseInterface::HTTP_BAD_REQUEST, $this->email->printDebugger(['headers']));


        if (!$this->userModel->update($findUser->id, $entity)) {


            $this->httpException(lang('Shared.api.reject'), ResponseInterface::HTTP_BAD_REQUEST, serializeMessages($this->userModel->errors()));

        }


    }


    /**
     * Verifies the code with the email and saves the new password,
     * if they all pass validation.
     *
     * @param AuthEntity $entity
     */

    public
    function resetPasswordViaSms(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_NOT_ACCEPTABLE);


        $findUser = $this->userModel->where('phone', $entity->phone)->first();;


        if (is_null($findUser)) $this->httpException(lang('Authenticate.forgotNoUserPhone'), ResponseInterface::HTTP_CONFLICT);


        if (!$this->sms->isActivationCodeValid($entity->phone, $entity->code)) $this->httpException(lang('Auth.resetTokenExpired'), ResponseInterface::HTTP_NOT_ACCEPTABLE);


        unset($entity->phone);
        if (!$this->userModel->update($findUser->id, $entity)) {


            $this->httpException(lang('Shared.api.reject'), ResponseInterface::HTTP_BAD_REQUEST, serializeMessages($this->userModel->errors()));

        }


    }

    /**
     * Verifies the code with the email and saves the new password,
     * if they all pass validation.
     *
     * @param AuthEntity $entity
     */

    public
    function resetPasswordViaEmail(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_NOT_ACCEPTABLE);


        $this->userModel->logResetAttempt(
            $entity->email,
            $entity->token,
            $entity->ip_address,
            $entity->user_agent
        );


        $findUser = $this->userModel->where('email', $entity->email)
            ->where('reset_hash', $entity->token)->first();


        if (is_null($findUser)) $this->httpException(lang('Auth.forgotNoUser'), ResponseInterface::HTTP_CONFLICT);


        // Reset token still valid?
        if (!empty($findUser->reset_expires) && time() > $findUser->reset_expires->getTimestamp()) $this->httpException(lang('Auth.resetTokenExpired'), ResponseInterface::HTTP_NOT_ACCEPTABLE);

        unset($entity->email);
        if (!$this->userModel->update($findUser->id, $entity)) {

            $this->httpException(lang('Shared.api.reject'), ResponseInterface::HTTP_BAD_REQUEST, serializeMessages($this->userModel->errors()));

        }

    }

    /**
     * Activate account.
     *
     * @param AuthEntity $entity
     */
    public
    function activateAccountViaEmail(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_NOT_ACCEPTABLE);

        $this->userModel->logActivationAttempt(
            $entity->token,
            $entity->ip_address,
            $entity->user_agent
        );


        $findUser = $this->userModel->where('activate_hash', $entity->token)
            ->where('active', 0)->where('email', $entity->email)
            ->first();
        if (is_null($findUser)) $this->httpException(lang('Auth.activationNoUser'), ResponseInterface::HTTP_CONFLICT);

        unset($entity->email);
        if (!$this->userModel->update($findUser->id, $entity)) {

            $this->httpException(lang('Shared.api.reject'), ResponseInterface::HTTP_BAD_REQUEST, serializeMessages($this->userModel->errors()));

        }

    }

    /**
     * Resend activation account.
     * @param AuthEntity $entity
     */
    public
    function sendActivateCodeViaEmail(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_NOT_ACCEPTABLE);

        $findUser = $this->userModel->where('email', $entity->email)
            ->where('active', 0)
            ->first();

        if (is_null($findUser)) $this->httpException(lang('Auth.activationNoUser'), ResponseInterface::HTTP_CONFLICT);


        $isSent = $this->email
            ->setTo($entity->email)
            ->setSubject(lang('Auth.activationSubject'))
            ->setMessage(view($this->authConfig->views['emailActivation'],
                ['hash' => $entity->toArray()['activate_hash']]))
            ->setMailType('html')->send();

        if (!$isSent) {


            $this->httpException(lang('Auth.unknownError'),
                ResponseInterface::HTTP_BAD_REQUEST, $this->email->printDebugger(['headers']['headers'] ?? lang('Auth.unknownError')));

        }
        unset($entity->email);


        if (!$this->userModel->update($findUser->id, $entity)) {


            $this->httpException(lang('Shared.api.reject'), ResponseInterface::HTTP_BAD_REQUEST, serializeMessages($this->userModel->errors()));

        }

    }

    /**
     * Activate account via sma.
     *
     * @param AuthEntity $entity
     */
    public function activateAccountViaSms(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_NOT_ACCEPTABLE);

        $result = $this->sms->isActivationCodeValid($entity->phone,
            $entity->code);

        if ($result == false) $this->httpException(lang('Authenticate.auth.smsActivationFail'), ResponseInterface::HTTP_CONFLICT);

        $findUser = $this->userModel->where('active', 0)
            ->where('phone', $entity->phone)->first();

        if (is_null($findUser)) $this->httpException(lang('Auth.activationNoUser'), ResponseInterface::HTTP_CONFLICT);

        unset($entity->phone);
        if (!$this->userModel->update($findUser->id, $entity)) {

            $this->httpException(lang('Shared.api.reject'), ResponseInterface::HTTP_BAD_REQUEST, serializeMessages($this->userModel->errors()));

        }
    }

    /**
     * Activate account via sma.
     *
     * @param AuthEntity $entity
     */
    public
    function sendActivateCodeViaSms(AuthEntity $entity): void
    {
        if (is_null($entity)) $this->httpException(lang('Shared.api.validation'), ResponseInterface::HTTP_NOT_ACCEPTABLE);

        $findUser = $this->userModel
            ->where('active', 0)->where('phone', $entity->phone)->first();
        if (is_null($findUser)) $this->httpException(lang('Auth.activationNoUser'), ResponseInterface::HTTP_CONFLICT);

        $result = $this->sms->sendActivationCode($entity->phone, getenv('siteAddress'));
        if ($result < 2000) $this->httpException(lang('Authenticate.auth.smsSendFail'), ResponseInterface::HTTP_BAD_REQUEST);


    }


}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420040.html

標籤:

上一篇:避免本地移動應用程式中的網路釣魚攻擊

下一篇:從主表中選擇所有記錄,但有條件地從明細表中選擇一條

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more