How could I get the user_id from authentication class of Wt?
Added by yyyy yyyy over 8 years ago
Based on the example of auth2, I write down something like this
mapClass<db_user>("user");
mapClass<DBAuthInfo>("auth_info");
mapClass<DBAuthInfo::AuthIdentityType>("auth_identity");
mapClass<DBAuthInfo::AuthTokenType>("auth_token");
What I want to do is, find out all of the identities(in table auth_indentity)
and associate user_id? I want to use the user_id to filter the data.
example :
identity "abcd" associate with user_id "1"
identity "efgh" associate with user_id "2"
Thanks
Replies (3)
RE: How could I get the user_id from authentication class of Wt? - Added by Mark Petryk over 8 years ago
yyyy,
Refer to this post and see if it helps you with your question;
http://redmine.webtoolkit.eu/boards/2/topics/11477?r=11494#message-11494
~mark
RE: How could I get the user_id from authentication class of Wt? - Added by Koen Deforche over 8 years ago
Hey,
I guess you can do it directly at the database level, using a dbo query?
Something along these lines:
typedef boost::tuple<dbo::ptr<db_user>, dbo::ptr<DBAuthInfo::AuthIdentityType>> UserIdentity;
auto q = session.query<UserIdentity>("select u, aid from user u join auth_info ai on ai.user_id = u.id join auth_identity aid on aid.auth_info_id = ai.id");
auto list = q.resultList();
for (auto& i : list) {
dbo::ptr<db_user> user;
dbo::ptr<DBAuthInfo::AuthIdentityType> identity;
boost::tie(user, identity) = i;
...
}
RE: How could I get the user_id from authentication class of Wt? - Added by yyyy yyyy over 8 years ago
Hi, Koen
Sorry for my late reply, there are compile time error on this line
for (auto& i : list) {
*wt\win\vc2012\64\include\Wt\Dbo\SqlTraits_impl.h:50: error: C3861: 'read': identifier not found
wt\win\vc2012\64\include\Wt\Dbo\SqlTraits_impl.h:50: error: C2039: 'read' : is not a member of 'Wt::Dbo::sql_value_traits'
with
[
V=UserIdentity
]*
Although far from perfect, I figure out how to build the table of user_id<--->user identity
boost::bimap<Wt::Dbo::dbo_default_traits::IdType, Wt::WString>
build_user_map(Wt::Dbo::Session &session)
{
using namespace Wt;
typedef Dbo::collection<Dbo::ptr<DBAuthInfo::AuthIdentityType>> AITCollect;
Dbo::Transaction transaction(session);
AITCollect aitc = session.find<DBAuthInfo::AuthIdentityType>();
//first user_id, second user name
typedef boost::bimap<Wt::Dbo::dbo_default_traits::IdType, WString> BMType;
BMType user_id_identity;
for(auto const &it : aitc){
auto const &identity = it->identity();
auto const &auth_id = it->authInfo().id();
Dbo::ptr<DBAuthInfo> info = session.find<DBAuthInfo>().where("id=?").bind(auth_id);
auto const user_id = info->user().id();
user_id_identity.insert(BMType::value_type(user_id, identity));
}
return user_id_identity;
}
Could I do batch find?Find the id value with a batch values rather than a value?I want to reduce the frequency of db manipulation