登陆中有一步是 loginCheck -----这里用到的是Siebel,其实我真的不懂。具体方法都在siebel执行的,Java只是调用一下。
比如调用BS接口,还有各种sql 都是siebel 提供,基本java不写sql.所以我现在sql很久没写了。都是别人提供的,而且基本随便都是几百行,我没写过。可能很多人都没听过siebel。其实我也不熟。
具体如下:
接口:包 com.xxxxx.crm.com.service
UserService
public interface UserService extends BaseService<UserModel>{
UserModel loginCheck(String loginname ,String password,boolean ldap) throws Exception;
//其他服务是后期自己再写,比如 修改密码,岗位转换 查询密码
UserModel ldapCheck(String loginName,String password)throws Exception;
UserModel getUserPwd(UserModel user);
}
实现类:包 com.xxxxx.crm.com.service.impl
UserServiceImpl
@Service
public class UserServiceImpl Extends AbstractBase<UserModel> implements UserService{
@Autowired
private UserMapper userMapper;
@Autowired
SettingMapper settingMapper;
@Override
public String getBusinessComponeseName(){
return "Employee";
}
@Override
public String getBusinessObjectName(){
return "Employee";
}
@Override
public UserModel loginCheck(String loginname,String password ,boolean ldap)throws Exception{
UserModel model =null;
if(ldap){
model = ldapCheck(loginname,password); //ldap认证方式--具体写在下方
}else{
model = new UserModel();
model.setLoginName(loginname);
model.setLoginPwd(password);
}
//不论何种认证方式,都会有密码。现在就是得到密码。为什么重新得一遍?不就是页面传过来的吗?
//可能2中认证方式的 密码不一样,也就是ldap方式获取的密码可能不一样。
String pwd = model.getLoginPwd();
SystemUtils.setUserModel(model); //把 用户名,密码存入副本中
model.setViewType(BaseModel.ViewMode_AllView);
list<UserModel> list = this.getList(model);//该方法详见AbstractBase,SiebelAdapter,基服务类
//也就是说根据当前登录用户可以查看到一个数据列表。
//这里可以解决登录接口中那个CurrentConfigModel同步问题。我问了师父,师父说是在SiebelAdapter中有设值,就是
//那个SESSION_CONFIG,设值 UserModel.
//关于这个问题,我已经找到答案了,在另一篇文章中SiebelDataBeanPoolManager中。我是一步步debug发现的。
/* 第一次登陆,走到那个SiebelDataBean sdb = JDBFactory.getSiebelDataBean();这里时,会走到
JDBFactory内的SiebelDataBean bean = SystemUtils.getSiebelDataBean(); 由于该副本SiebelDataBean第一次登陆并未设置,所以一定是空的,就会走到 bean = SiebelDataPooledManager.borrowObject(); 关键点就在borrowObject方法。 SiebelDataPooledManager内的该方法内有这样一段代码:
SiebelDataBean sdb = getGenericKeyedObjectPool().borrowObject(getKey()); 而getKey方法内就设置了用户名,密码信息。
String key = String.format("%s|%s",SystemUtils.getUserModel().getLoginName(),SystemUtils.getUserModel().getLoginPwd()); //而副本UserModel上面已经 把用户名 密码 存入副本了,这样就可以取到。 也就是borrowObject方法返回当前登录用户的Siebel数据模型。那么sdb就有了相关信息,职位,组织,登录名,登录Id,密码等信息。那么在SiebelAdapter中就可以进行设值了。就是
config.setPositionId(sdb.positionId());
config.setPositionName(sdb.PositionName());
config.setLoginId(sdb.loginId());
config.setLoginName(sdb.loginName();
这样就把sdb中当前登录用户Siebel数据模型给同步到CurrentConfigModel中了。
*/
for(UserModel user : list){
user.setLoginPwd(pwd);
//查职位列表
UserModel nuser = new UserModel();
nuser.setRowId(user.getRowId());
nuser.setViewType(BaseModel.ViewMode_AllView);
user.setMvgPositionList(this.getPositionList(nuser)); /见下方
nuser.setFrontVersion(getVersion());
SystemUtils.setUserModel(user); //把 用户其他信息也一并存入副本
return user;
}
SystemUrils.clearUserModel();
throw new Exception("0001"); //error.code.0001=登录失败,无此用户
}
//查询用户密码
@Override
public UserModel getUserPwd(UserModel user){
UserModel userm = userMapper.selectOnePwd(user);
return userm;
}
//ldap认证方式
@Override
public UserModel ldapCheck(String loginName,String password)throws Exception{
//ldap域用户认证
checkLDAP(loginName,password);
UserModel usert = new UserModel();
//根据userId获取用户密码对照表里面对应的siebel密码
usert.setLoginName(loginName);
usert = getUserPwd(usert);
return usert;
}
public void checkLDAP(String loginname,String password)throws Exception{
if(password != null && password.equals( getDefaultPassword() )){ //该方法见下方
return;
}
LDPAVerifyHelper ldap = LDAPVerifyHelper.getInstance(loginName,password);
ldap.authenricate(loginname,password);//见 LDAPVeriHelper,在另一篇文章。
}
//默认密码
public String getDefaultPassword(){
ConfigModel model = new ConfigModel();
model.setRowId("sys.user.password");//这个我完全没有找到.配置文件中也没有看到.
model = settingMapper.getConfigDetail(model);
return model.getValue(); //哦,原来是查询出来的,那个是条件。不是配置文件
}
@Override
public List<MVGBaseModel> getPositionList(UserModel model)throws Exception{
return super.getMVGValues(model,new PositionModel(),"mcgPosition");
}//明天写吧 。mvg--多值展示。
}//类尾
//查询密码的sql
<select id="selectOnePwd" resultMap="ResultMapper" parameterType="com.xxxxx.common.model.UserModel">
select fname as LOGIN,
crmpassword as PASSWOD
from s_user_login
<where>
fname=#{loginName}
</where>
</select>
查询配置详情sql,内有用户默认登陆密码,存在VALUE字段中,映射在ConfigModel。
<select id="getConfigDetail" resultMap="ConfigMapper" parameterType="com.xxxxx.common.model.ConfigModel" />
select * from T_CONFIG t
<where>t.KEY = #{rowId,jdbcType=VARCHAR}</where>
</select>