登陆接口补充

登陆中有一步是 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>

猜你喜欢

转载自blog.csdn.net/little_dream2018/article/details/88800991