programing

Node.js 및 mongoose를 사용하여 '명령 찾기 인증 필요'를 해결하는 방법은 무엇입니까?

css3 2023. 7. 9. 12:36

Node.js 및 mongoose를 사용하여 '명령 찾기 인증 필요'를 해결하는 방법은 무엇입니까?

오류를 해결하기 위해 도움이 필요합니다.실행 중인 Ubuntu 서버 16.04:

MongoDB 셸 버전 v4.0.9

노드 11.6

몽구스 5.3.4

/etc/mongod.conf의 보안이 다음과 같은 경우:

security: authorization: "disabled"사용할 수 있습니다.

const mongoURI = 'mongodb://writeApp:writeApp9779@127.0.0.1:27017/writeapp';

const db = mongoose.connect(mongoURI, { useNewUrlParser: true });

모든 데이터베이스 명령이 작동합니다.비밀번호를 잘못 입력해서 확인해도 인증 실패로 표시됩니다.하지만 아시다시피 mongodb는 인증이 비활성화되어 있기 때문에 여전히 작동합니다.

명령줄에서 db.getUsers()가 확인한 사용자 데이터가 정확합니다.

> db.getUsers();
[
 {
    "_id" : "admin.root",
    "userId" : UUID("8f6c1295-a261-4057-9a29-8a9919437841"),
    "user" : "root",
    "db" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
 },
 {
    "_id" : "admin.writeApp",
    "userId" : UUID("ee148506-1860-4739-80db-17352e0e2ccb"),
    "user" : "writeApp",
    "db" : "admin",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "writeapp"
        },
        {
            "role" : "listDatabases",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
  }
]

진짜 문제는 /etc/mongod.conf를 나노화하고 mongo를 재시작한 후 "enabled"라는 인증을 변경한 입니다.앱을 다시 실행하면 다음 오류가 발생합니다.

{ MongoError: command find requires authentication
 ............
 ............
 ok: 0,
 errmsg: 'command find requires authentication',
code: 13,
codeName: 'Unauthorized',
name: 'MongoError',
[Symbol(mongoErrorContextSymbol)]: {} }

오랜 시간을 보낸 후 mongo shell을 사용하여 연결했습니다:

mongo -u "writeApp" -p writeApp9779 --authenticationDatabase "admin"
> use writeapp;
  switched to db writeapp
> db.users.find();
  { "_id" : ObjectId("5cb63f23755c4469f8f6e2e6"),
  ..........
  }

콘솔에서는 작동하지만 응용 프로그램에서는 작동하지 않습니다.해결책을 찾을 수가 없어요.정말로 당신의 친절한 배려가 필요합니다.참고로 여기 샘플 노드가 있습니다.js

Category.find(function(err, categories){
if(err) console.log(err);
else {
    app.locals.categories = categories;
}
});

모델:

var mongoose =require('mongoose');
var CategorySchema = mongoose.Schema({
title: {
    type:String,
    required:true
},
slug: {
    type:String
   }
});

module.exports = mongoose.model("Category", CategorySchema);

터미널과 몽고에서 연결하는 방법:

MongoDB를 설치하면 인증이 비활성화됩니다.그러니 지금은 그렇게 유지하세요.관리 데이터베이스에 루트 사용자 생성:

유형:mongod터미널에서 db를 실행한 다음 다른 터미널에서 실행 명령을 실행합니다.mongomongo 터미널 액세스를 실행합니다.

use admin
db.createUser(
  {
    user: "root",
    pwd: "pass123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
 

이제 데이터베이스를 만듭니다.

실행use진술.데이터베이스가 아직 존재하지 않는 경우 데이터베이스가 작성됩니다.

쓰기 앱 사용

작성된 데이터베이스를 확인하려면 일부 데이터를 삽입해야 합니다. 그렇지 않으면 작성되지 않습니다. db.testcollection.insert({ artist: "Mike" })

그런 다음 루트 사용자와 새 DB를 생성합니다.이제 mongodb 구성 변경

nano /etc/mongod.conf 

라인을 다음으로 변경:

security:
   authorization: "enabled"

이제 터미널에서 DB 서비스를 다시 시작합니다.

sudo systemctl restart mongod

상태 확인:

sudo systemctl status mongod

지금부터 mongo에 로그인하려면 비밀번호가 필요합니다.

mongo -u root -p pass123 --authenticationDatabase admin

이제 관리 데이터베이스에 사용자를 생성하고 writeapp과 같은 특정 데이터베이스에 관리자 권한을 부여합니다.

`use admin`

`db.createUser({user:"writetApp", pwd:"writeApp5299", roles:[{role:"dbOwner", db:"writeapp"}]});`

사용자 확인하기

db.getUsers();
[
   {
    "_id" : "admin.root",
    "userId" : UUID("8f6c1295-a261-4057-9a29-8a9919437841"),
    "user" : "root",
    "db" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
},
{
    "_id" : "admin.writeApp",
    "userId" : UUID("ee148506-1860-4739-80db-17352e0e2ccb"),
    "user" : "writeApp",
    "db" : "admin",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "writeapp"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
 }

mongo를 종료하고 로그인합니다.

`mongo -u "writeApp" -p writeApp5299 --authenticationDatabase "admin"`

이제 관리자가 아닌 다른 DB에서 사용자를 생성한 경우--authenticationDatabase "yourdbname"

이제 mongo에서 명령을 실행합니다.

 `use writeapp`

 ` db.testcollection.find();`

node.js에서 연결하는 방법:

절차 1:

const mongoURI = 'mongodb://writeApp:writeApp5299@127.0.0.1:27017/writeapp';

const db = mongoose.connect(mongoURI, { useNewUrlParser: true });

절차 2:

mongoose.connect('mongodb://writeApp:writeApp5299@127.0.0.1:27017/writeapp?auththSource=writeapp&w=1',{ useNewUrlParser: true });

두 가지 모두 작동합니다.authSource아니면 전혀 문제가 되지 않습니다.

문제: server.js 또는 app.js는 모든 모듈/middleware/routes 등을 로드하는 모든 node.js 앱 또는 진입점에서 먼저 실행됩니다.
이제 경로 중에 문제가 있는 다른 mongodb 연결이 있는 경로가 있으면 응용 프로그램 오류가 단순히 내가 보여준 오류를 보여줍니다.

command find/insert/update requires authentication

하지만 문제는 어떤 파일에 문제가 있는지 표시되지 않는다는 것입니다.그래서 각 경로에서 문제를 찾는 것은 시간이 많이 걸렸습니다.그래서 문제가 해결되었습니다.

의 결과를 보고 있습니다.db.geUsers()게시물에서 대상 데이터베이스와 인증 데이터베이스가 다릅니다. 쿼리 변를 사수 용하 URL 습니있라는 쿼리 할 수 .authSource=adminadmin인증 자격 증명 원본입니다.

연결 URL:

const mongoURI =
  "mongodb://writeApp:writeApp9779@127.0.0.1:27017/writeapp?authSource=admin";

OR

const mongoURI =
  "mongodb://writeApp:writeApp9779@localhost:27017/writeapp?authSource=admin";

업데이트: 사용자 역할

할당된 dbAdmin 역할writeApp사용자가 비시스템 컬렉션에 대한 읽기/쓰기를 제공하지 않습니다.부여시도를 부여해 .read또는readWrite사용자에게.

db.grantRolesToUser( "writeApp", [ "read" ] ) //OR
db.grantRolesToUser( "writeApp", [ "readWrite" ] )

참고: authSource URI 옵션 문서

언급URL : https://stackoverflow.com/questions/57848302/how-to-solve-command-find-requires-authentication-using-node-js-and-mongoose