我在Practical Node.js引用了这本书Azat Mardan。一个博客项目,有两种类型的用户即。 (i)管理员和(ii)普通用户。我对身份验证和授权不了解的部分如下 -
主app.js
包含代码段
//Authentication middleware
app.use(function(req, res, next){
if(req.session && req.session.admin)
res.locals.admin = true;
next();
});
//Authorization middleware
var authorize = function(req,res,next){
if(req.session && req.session.admin)
return next();
else
return.send(401);
};
//Pages & routes
app.get(‘/login’, routes.user.login); //This displays the login form
app.post(‘/login’, routes.user.authenticate);
app.get(‘/admin’, authorize, routes.article.admin);
app.get(‘/post’, authorize, routes.article.post);
app.post(‘/post’, authorize, routes.article.postArticle);
用户路线即user.js
具有以下代码段
exports.login = function(req, res, next){
res.render(‘login’); //Pretty simple, it renders the login form page
};
exports.authenticate = function(req, res, next){
//The sanitation check is not show here
if(req.body.email && req.body.password)
{
//Here I assume, all credentials are correct
req.session.user = user;
req.session.admin = user.admin;
res.redirect(‘/admin’);
}
};
我的问题是,在app.js
中,作者如何采取或做出以下陈述,或者我理解错误。
if(req.session && req.session.admin)
res.locals.admin = true;
并且还在授权功能中,
if(req.session && req.session.admin)
req.session.admin
如何成真。我们设置req.session.admin = user.admin
是用户路线。
请注意:这不仅仅是对管理员进行身份验证,而且普通用户也应该能够登录和发布文章。
答案 0 :(得分:1)
我的名字是Azat Mardan,我是Practical Node的作者和你在上面提到的代码。
如果您使用快速会话中间件提供的Web会话, req.session.admin
将自动可用。 req.session
将在来自同一客户端的请求之间保持不变(感谢Cookie中的会话ID)。您可以在此req.session
对象上存储任何内容,包括admin = true。
答案 1 :(得分:0)
当用户输入用户名&密码req.session.admin = user.admin
被调用。它没有显示,但是应该查找用户(比如在数据库中),然后在会话中设置凭据user
(从查找中返回app.use( function... )
)。
所有请求都通过身份验证中间件var authorize = function...
,并检查是否已设置会话管理标志(即某人已成功以管理员身份登录)并将其添加到响应中。
对管理区域的所有请求也都通过授权中间件public class DataBaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "scheduleDB";
private static final int DB_VERSION = 1;
Context context;
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DB_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL("CREATE TABLE time (id INTEGER PRIMARY KEY AUTOINCREMENT, arrival VARCHAR(10), departure VARCHAR(10));");
insertTime(db,"city");
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
onCreate(db);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void insertTime(SQLiteDatabase database, String table) {
BufferedReader br = null;
String line;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
database.beginTransactionNonExclusive();
} else {
database.beginTransaction();
}
try {
br = new BufferedReader(new InputStreamReader(context.getAssets().open("time.txt")));
while ((line = br.readLine()) != null) {
String query = "INSERT INTO "+table+" (arrival, departure) VALUES (?,?)";
SQLiteStatement statement = database.compileStatement(query);
String[] time = line.split(",");
for(int i = 1, n = time.length; i < n; i+=2) {
statement.clearBindings();
statement.bindString(1,time[i-1]);//arrival
statement.bindString(2,time[i]);//departure
statement.execute();
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
database.setTransactionSuccessful();
database.endTransaction();
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
,这将再次检查会话管理标志,但如果某人尚未以管理员身份登录,则会返回401错误。