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를 실행한 다음 다른 터미널에서 실행 명령을 실행합니다.mongo
mongo 터미널 액세스를 실행합니다.
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=admin
admin
인증 자격 증명 원본입니다.
연결 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
'programing' 카테고리의 다른 글
문자열에서 VBA 범위 (0) | 2023.07.09 |
---|---|
VM 구현을 위한 자습서/리소스 (0) | 2023.07.09 |
테이블 또는 인덱싱된 뷰가 전체 텍스트 인덱싱되지 않았기 때문에 테이블 또는 인덱싱된 뷰에서 CONTINES 또는 FREETEXT 서술어를 사용할 수 없습니다. (0) | 2023.07.09 |
Excel 셀 내부의 숫자를 0으로 채우는 방법 (0) | 2023.07.09 |
OS.walk의 디렉터리 제외 (0) | 2023.07.09 |