package smartbi.hxgd.login; import java.io.IOException; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; import javax.servlet.ServletContext; import smartbi.hxgd.util.Utils; import smartbi.usermanager.auth.IAuthentication; import smartbi.usermanager.auth.UserInfo; import smartbi.usermanager.auth.UserNotExistException; import smartbi.util.StringUtil; /** * AD(活动目录)登录验证 */ public class ADAuth implements IAuthentication { private String initialContextFactory; private String providerUrl; private String prefix; /** * 配置登录验证类 * * @param ctx * 应用的上下文对象 * @throws IOException * 当出现初始化错误时。 */ public void config(ServletContext ctx) throws IOException { initialContextFactory = Utils.getAdInitialContextFactory(); providerUrl = Utils.getAdProviderUrl(); prefix = Utils.getAdPrincipalPrefix(); } /** * 判断登录用户名、密码是否正确 * * @param userName * 用户名 * @param password * 密码 * @return 如果登录成功则返回true,如果失败则返回false * @throws IOException * 当出现通信异常 */ public boolean isPasswordValidate(String userName, String password) throws IOException { /** * 20131217 * ad域验证,当密码为空时,可以直接登录。 */ if(null == userName || userName.equals("") || null == password || password.equals("")){ return false; } try { Hashtable env = initEnv(userName, password); LdapContext context = new InitialLdapContext(env, null); context.close(); return true; } catch (NamingException e) { e.printStackTrace(); return false; } } /** * 初始化访问活动目录所需要的参数设置 * * @param userName * 登录活动目录的用户名 * @param password * 登录活动目录的密码 * @return 返回相应的参数配置 */ private Hashtable initEnv(String userName, String password) { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory); env.put(Context.PROVIDER_URL, providerUrl); env.put(Context.SECURITY_PRINCIPAL, prefix + userName); env.put(Context.SECURITY_CREDENTIALS, password); return env; } /** * 获取用户的名称、别名信息 * * @param userName * 用户名 * @return 指定用户的信息 * @throws IOException * 当出现通信异常 * @throws UserNotExistException * 如果抛出此异常,则BIOffice会删除此用户 */ public UserInfo getUser(String userName) throws IOException, UserNotExistException { String name = userName.toLowerCase(); UserInfo userInfo = new UserInfo(); userInfo.setName(name); return userInfo; } /** * 返回用户是否在本Authentication类中验证密码 * * @param userName * 用户名 * @return 如果返回true,表示该用户的密码在本类中验证;如果返回false,表示该用户的密码在知识库中验证 * @throws IOException * 当出现通信异常 */ public boolean shallUserValidateInAuthentication(String userName) throws IOException { String users = Utils.getSmartbiInnerAuthUsers(); if (!StringUtil.isNullOrEmpty(users)) { String[] nameList = users.split(","); for (String name : nameList) { if (name.trim().equals(userName)) { return false; // 使用Smartbi知识库本身的方式验证 } } } return true; } /** * 设置用户的密码 * * @param oldPassword * 旧密码 * @param newPassword * 新密码 * @return 返回设置用户密码是否成功 * @throws IOException * 当出现通信异常时抛出 * @throws UnsupportedOperationException * 当该用户验证类不支持此操作时抛出 */ public boolean changePassword(String userName, String oldPassword, String newPassword) throws IOException, UnsupportedOperationException { throw new UnsupportedOperationException(); } }