deatil / larke-admin

larke-admin 是一套使用 Laravel 、JWT 和 RBAC 鉴权的前后端分离的通用后台管理系统。/ An admin api system with Laravel, JWT and RBAC.
https://github.com/deatil/larke-admin
Apache License 2.0
304 stars 64 forks source link

[Bug]: 我这个环境搭建好了,能到登录页面,为什么老提示密码错误? 账户密码 admin/123456。这个一直提示错误 #29

Closed jinxu96 closed 1 year ago

jinxu96 commented 1 year ago

larke-admin 版本

1.6.9

php 版本

php 8.1

Laravel 版本

laravel10

是否依旧存在

可以

bug描述

1.安装后,登录一直password error 2.\ResponseCode::LOGIN_ERROR,像这种,ResponseCode这个是不是扩展,我编辑器全局搜索LOGIN_ERROR,找不到

修改建议

1111111111

jinxu96 commented 1 year ago
    $password = $request->input('password');
    if (strlen($password) <= 16) {
        return $this->error(__('密码错误'), \ResponseCode::LOGIN_ERROR);
    }

这个判断有问题

deatil commented 1 year ago

ResponseCode 是加载的时候做的别名。 报错可以先看下错误日志

jinxu96 commented 1 year ago

我在登陆的时候提示登陆失败,然后日志中打印出来的数据是 [2023-06-17 09:10:00] local.ERROR: larke-admin-jwt-makeToken: Object of class DateTimeImmutable could not be converted to int [2023-06-17 09:10:00] local.ERROR: larke-admin-login: JWT编码失败

jinxu96 commented 1 year ago

如果改了app.php配置,'timezone' => 'UTC',为PRC,则会报local.ERROR: larke-admin-login: Unable to read key这个错误

deatil commented 1 year ago

我在登陆的时候提示登陆失败,然后日志中打印出来的数据是 [2023-06-17 09:10:00] local.ERROR: larke-admin-jwt-makeToken: Object of class DateTimeImmutable could not be converted to int [2023-06-17 09:10:00] local.ERROR: larke-admin-login: JWT编码失败

这个报错是jwt的库下载的版本有问题,你看下composer下载的jwt的库版本是不是最新的。 通常这个问题是用的composer源有问题,可以先换个源或者用默认源

deatil commented 1 year ago

admin的版本你下载的好像不是最新的版本,可以先确认下php版本和composer列出的admin版本是不是最新的,不是最新的就有可能出现问题

jinxu96 commented 1 year ago
"require": {
    "php": "^8.1",
    "lake/larke-admin": "^1.6.3",
},

另外在composer.json文件中没有找到jwt

deatil commented 1 year ago
"require": {
    "php": "^8.1",
    "lake/larke-admin": "^1.6.3",
},

另外在composer.json文件中没有找到jwt

你需要在命令行用compser命令列出包的版本看。或者先换个源重新更新拉取下,怀疑现在用的源有问题

jinxu96 commented 1 year ago

lake/larke-admin 1.6.3 An admin api library with JWT and RBAC. lake/larke-auth 1.3.0 An authorization library that supports access control models like ACL, RBAC, ABAC in Laravel. lake/larke-jwt 1.1.6 A library to work with JSON Web Token and JSON Web Signature.

deatil commented 1 year ago

lake/larke-admin 1.6.3 An admin api library with JWT and RBAC. lake/larke-auth 1.3.0 An authorization library that supports access control models like ACL, RBAC, ABAC in Laravel. lake/larke-jwt 1.1.6 A library to work with JSON Web Token and JSON Web Signature.

那就不是最新的版本。换composer源试下

jinxu96 commented 1 year ago

好了,得换腾讯源,要指定 composer require lake/larke-admin 1.6.9

jinxu96 commented 1 year ago

前端页面在左侧增加菜单,需要怎么做呀

deatil commented 1 year ago

前端页面在左侧增加菜单,需要怎么做呀

手动在路由里添加,需要授权的菜单在后台授权后就会显示。 可以下载一个扩展插件,看下扩展的逻辑

deatil commented 1 year ago

前端开发可以看 vue-element-admin 文档

jinxu96 commented 1 year ago

前端页面在左侧增加菜单,需要怎么做呀

手动在路由里添加,需要授权的菜单在后台授权后就会显示。 可以下载一个扩展插件,看下扩展的逻辑

我加加菜单,就要写一个扩展么

deatil commented 1 year ago

前端页面在左侧增加菜单,需要怎么做呀

手动在路由里添加,需要授权的菜单在后台授权后就会显示。 可以下载一个扩展插件,看下扩展的逻辑

我加加菜单,就要写一个扩展么

可以根据 vue-element-admin 文档来。用扩展是为了解藕,更新方便些

jinxu96 commented 1 year ago

还有就是,我通过postman访问登录接口,会出现"message": "password error",通过网站登录就可以登录成功,

deatil commented 1 year ago

还有就是,我通过postman访问登录接口,会出现"message": "password error",通过网站登录就可以登录成功,

网页有用rsa加密密码的,用postman也需要加密

jinxu96 commented 1 year ago

还有就是,我通过postman访问登录接口,会出现"message": "password error",通过网站登录就可以登录成功,

网页有用rsa加密密码的,用postman也需要加密

`//Pre-request Script //--------------以下为需要加密的内容,可以根据需求定义多个------------------// var clearText = '123456'; //对应{{rsaBody}}的明文 // var clearText = '{"arg1":"def","arg2":123,"arg3":7.89}';

//---------------------------------------------------------------------// const encrypt_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRHuh7yscqNGDJolwLsyAt0yAsslRi62dfKp7oIn99KCvq1jzXriimWJ1YMsNnW4fDnyX7bH+JzRsh8XNObCAFe3CWoMp0BozRnMlx3jivd5mz+koMuu49+386dog5H54cwhE+vqf756//yrSoIk4T40zV3aeE2CpKSTXPQVWJIQIDAQAB'; const forge_url = 'https://lzq1357.gitee.io/various/forge_min.js'; //forge_min.js来自:https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js //---------------------------------------------------------------------//

function encryptRsa(encrypt_key, clearText){ console.info('cleartext: ' + clearText); //注意此处上下的BEGIN PRIVATE KEY不要删除,框架自带的 const public_key = '-----BEGIN PUBLIC KEY-----\n'

// 第一次运行时从网络加载forgeJS,会导致请求失败 if(!pm.globals.has('forgeJS')){ console.log('request forge.js from ' + forge_url); pm.sendRequest(forge_url, function (err, res) { if (err) { console.error(err); } else { console.info("request forgs.js: Succeed, please try again"); //注意:Pre-request Script中出现报错,可能会导致pm.globals.set失效 pm.globals.set('forgeJS', res.text()); } } ); return; } eval(pm.globals.get('forgeJS'));

//------------------以下内容根据需要修改定义,可以加密多个字段------------------------// var encryptedText = encryptRsa(encrypt_key, clearText); postman.setEnvironmentVariable("rsaBody", encryptedText); //rsaBody对应Body中{{}}`我加密了,还是不行

jinxu96 commented 1 year ago

try { // 私钥 $prikey = Cache::get($prikeyCacheKey); dd($prikey); //打印为空 // 导入私钥 $rsakey = PublicKeyLoader::load($prikey);

        // RSA 解出密码
        $password = $rsakey->withPadding(RSA::ENCRYPTION_PKCS1)
            ->decrypt($password);

私钥打印为空

deatil commented 1 year ago

try { // 私钥 $prikey = Cache::get($prikeyCacheKey); dd($prikey); //打印为空 // 导入私钥 $rsakey = PublicKeyLoader::load($prikey);

        // RSA 解出密码
        $password = $rsakey->withPadding(RSA::ENCRYPTION_PKCS1)
            ->decrypt($password);

私钥打印为空

每次点击登录都需要请求获取一次公钥,请求登录的时候在控制台查看需要带的数据

deatil commented 1 year ago

postmam测试的话,在网页端拿取access_token来直接用好些

deatil commented 1 year ago

可以看登录的文档 https://github.com/deatil/larke-admin/blob/main/docs/api/passport.md

jinxu96 commented 1 year ago

postmam测试的话,在网页端拿取access_token来直接用好些

我试过,报token过期错误

deatil commented 1 year ago

postmam测试的话,在网页端拿取access_token来直接用好些

我试过,报token过期错误

测试把这里设置为空后再获取token来用 https://github.com/deatil/larke-admin/blob/main/src/larke/resources/config/larkeadmin.php#L61

jinxu96 commented 1 year ago

'aud' => env('LARKE_ADMIN_JWT_AUD', ''),设置为空了,然后拿到网页端的access_token,请求头部:

  1. Locale-Language: zh_CN
  2. Content-Type : application/json;charset=utf-8
  3. Authorization : Bearer xxxx 还是不行
jinxu96 commented 1 year ago

prikeyCacheKey + rsa(md5(password))这是是Larke-Admin-Passkey-Id头部的值和rsa(md5(password))的值拼接是吧,我现在` try { // 私钥 $prikey = Cache::get($prikeyCacheKey);

        // 导入私钥
        $rsakey = PublicKeyLoader::load($prikey);

        // RSA 解出密码
        $password = $rsakey->withPadding(RSA::ENCRYPTION_PKCS1)
            ->decrypt($password);
    } catch(\Exception $e) {
        Log::error('larke-admin-login: ' . $e->getMessage());

        return $this->error(__('密码错误'), \ResponseCode::LOGIN_ERROR);
    }

    $encryptPassword = AdminModel::checkPassword($adminInfo, $password);
    dd($adminInfo,$password);`

这个$password打印是空的

jinxu96 commented 1 year ago

成功了,在线rsa加密顺序不对,感谢

jinxu96 commented 1 year ago

我在前端页面配置了路由权限,给了分组路由权限,但是访问接口,没有访问权限

deatil commented 1 year ago

我在前端页面配置了路由权限,给了分组路由权限,但是访问接口,没有访问权限

需要在页面点击 更新权限缓存 才行

jinxu96 commented 1 year ago

我在前端页面配置了路由权限,给了分组路由权限,但是访问接口,没有访问权限

需要在页面点击 更新权限缓存 才行 好的

jinxu96 commented 1 year ago

# 后端静态资源处理 location ^~ /vendor/ { alias /path/public/vendor/; } location ^~ /storage/ { alias /path/public/storage/; } ,部署项目的话,这个/path/public/vendor/是什么意思,是只需要换掉path就行吗,比如wwwroot/larke-admin/public/vendor/么

deatil commented 1 year ago

# 后端静态资源处理 location ^~ /vendor/ { alias /path/public/vendor/; } location ^~ /storage/ { alias /path/public/storage/; } ,部署项目的话,这个/path/public/vendor/是什么意思,是只需要换掉path就行吗,比如wwwroot/larke-admin/public/vendor/么

是的。更改path到绝对路径。laravel的安装需要把资源链接的脚本跑一次

jinxu96 commented 1 year ago

比如自己创建了laravel项目叫test,然后composer引入你的扩展,照那个部署的话,test/public下没有vendor和srorage目录,只有test/vendor和test/storage,然后这个laravel的安装需要把资源链接的脚本跑一次是什么意思

deatil commented 1 year ago

比如自己创建了laravel项目叫test,然后composer引入你的扩展,照那个部署的话,test/public下没有vendor和srorage目录,只有test/vendor和test/storage,然后这个laravel的安装需要把资源链接的脚本跑一次是什么意思

那个文档只是示列,头像资源只用到了 srorage 这个目录。 就是需要把srorage的原始目录软链接到public目录。 那个脚本你可以看下laravel文档

jinxu96 commented 1 year ago

我现在是www/wwwroot下有一个laravel的文件夹和前端的dist文件夹,然后我按你的配置,浏览器访问空白,几个css,js文件找不到,我看路径是对的

deatil commented 1 year ago

我现在是www/wwwroot下有一个laravel的文件夹和前端的dist文件夹,然后我按你的配置,浏览器访问空白,几个css,js文件找不到,我看路径是对的

前端的打包文件,大多都需要用代理到/根目录,api接口单独做个代理。哪些css和js不能访问?

jinxu96 commented 1 year ago

我现在是这样的,登录页可以出来了,但是验证码刷不出来,然后我看network调的是这个http://mimeng.admin.com/stage-api/passport/passkey接口,这个接口响应200但是没有任何返回信息, http://mimeng.admin.com:9527/admin-api/passport/passkey这个是我直接拿出来访问的,是由信息返回的,然后前端.env.production和.env.dev的配置都是这个VUE_APP_BASE_API = 'http://mimeng.admin.com:9527/admin-api/',也换成过VUE_APP_BASE_API = 'http://mimeng.admin.com/admin-api/',但是都不行

deatil commented 1 year ago

我现在是这样的,登录页可以出来了,但是验证码刷不出来,然后我看network调的是这个http://mimeng.admin.com/stage-api/passport/passkey接口,这个接口响应200但是没有任何返回信息, http://mimeng.admin.com:9527/admin-api/passport/passkey这个是我直接拿出来访问的,是由信息返回的,然后前端.env.production和.env.dev的配置都是这个VUE_APP_BASE_API = 'http://mimeng.admin.com:9527/admin-api/',也换成过VUE_APP_BASE_API = 'http://mimeng.admin.com/admin-api/',但是都不行

你需要看具体的请求链接,链接直接请求没有问题,那基本就是没啥问题。主要就是看web请求了

deatil commented 1 year ago

http://admin.xiijq.cn/,这个可以直接访问的,

编译后的base_url是stage-api吗?看起来就是这个配置有问题。前端打包部署可以先具体的看下 vue-element-admin 文档

deatil commented 1 year ago

env配置有三个,还有个staging的可以也改下,你打包的用的估计是这个env

deatil commented 1 year ago

404是nginx返回的还是php后端返回的

deatil commented 1 year ago

nginx,我拿着http://admin.xiijq.cn/admin-api/passport/captcha这个接口直接访问

看不出来是哪的问题。你可以先看下nginx的日志和laravel的日志,然后单独的放一个php文件在前端目录看能不能访问

deatil commented 1 year ago

看起来像 include /www/server/panel/vhost/rewrite/admin.xiijq.cn.conf; 这个文件的没有改到,用的这个文件的路由

jinxu96 commented 1 year ago

这个文件我看了,里面没有内容,这个文件也要配置什么东西吗?

jinxu96 commented 1 year ago

这个文件我看了,里面没有内容,这个文件也要配置什么东西吗?

这个文件,好像是宝塔配置伪静态的

deatil commented 1 year ago

location ~ ^/(admin-api) {

这个你在根目录加了php后没有进到api接口,那可能就是配置有问题,需要根据nginx对应的版本修改下

jinxu96 commented 1 year ago

人都麻了,搞了两天了

jinxu96 commented 1 year ago

location / { alias /path/dist/; try_files $uri $uri/ /index.html; } 这样写根本访问不到首页,css,js报404,只能拿出来root /path/dist/,怀疑好几个location都不生效

deatil commented 1 year ago

location / { alias /path/dist/; try_files $uri $uri/ /index.html; } 这样写根本访问不到首页,css,js报404,只能拿出来root /path/dist/,怀疑好几个location都不生效

这个需要根据nginx版本来适配更改,默认的只是适应一个大版本的nginx