当前位置: 移动技术网 > IT编程>开发语言>Java > Java使用JDBC实现Oracle用户认证的方法详解

Java使用JDBC实现Oracle用户认证的方法详解

2019年07月19日  | 移动技术网IT编程  | 我要评论

六姓家奴,百变大咖秀 she,中国工业地坪网

本文实例讲述了java使用jdbc实现oracle用户认证的方法。分享给大家供大家参考,具体如下:

两天时间写的小品,以前的j2ee环境基本使用框架。现在使用jdbc配合oracle存储过程模拟了一下用户注册和用户认证。

一、添加必须的jar包

需要jdbc连接oracle的包和shiro-core依赖,添加shiro-core主要为了方便使用sha-256散列算法。

二、编写jdbc连接

import java.sql.connection;
import java.sql.drivermanager;
import java.sql.sqlexception;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
public class oracle {
  private static final logger logger = loggerfactory.getlogger(oracle.class);
  public static connection getconnection() {
    connection conn = null;
    try {
      class.forname("oracle.jdbc.driver.oracledriver");
      logger.debug("尝试连接数据库");
      string url = "jdbc:oracle:thin:@192.168.0.20:1541:test";
      string username = "apps";
      string password = "apps";
      conn = drivermanager.getconnection(url, username, password);
    } catch (classnotfoundexception cnfe) {
      logger.error(cnfe.getmessage());
    } catch (sqlexception sqle) {
      logger.error(sqle.getmessage());
    }
    return conn;
  }
  public static void closeconnection(connection conn) {
    try {
      if (conn != null) {
        conn.close();
        conn = null;
      }
    } catch (sqlexception sqle) {
      logger.error(sqle.getmessage());
    }
  }
}

三、建表

-- create table
create table lh_user_t
(
 id    integer not null,
 username varchar2(255), -- 用户名
 password varchar2(255), -- 密码
 roleid  integer -- 外键链接
)

完整的用户添加和认证授权应该至少包含三张表:user_table、role_table和permission_table,本文不展开讨论。

四、添加用户

userdao类负责数据库通信,密码散列由userservice类实现。

import java.sql.callablestatement;
import java.sql.connection;
import java.sql.preparedstatement;
import java.sql.sqlexception;
import java.sql.types;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
public class userdao {
  private static final logger logger = loggerfactory.getlogger(userdao.class);
  // 添加用户
  public void saveuser(int userid, string username, string password, int roleid) {
    string sql = "insert into lh_user_t values (?,?,?,?)";
    connection conn = oracle.getconnection();
    preparedstatement ps = null;
    try {
      ps = conn.preparestatement(sql);
      ps.setint(1, userid);
      ps.setstring(2, username);
      ps.setstring(3, password);
      ps.setint(4, roleid);
      ps.executeupdate();
    } catch (sqlexception sqle) {
      logger.error(sqle.getmessage());
    } finally {
      oracle.closeconnection(conn);
      if (ps != null) {
        try {
          ps.close();
        } catch (sqlexception e) {
          logger.error(e.getmessage());
        }
        ps = null;
      }
    }
  }
  // 验证用户(后面添加)
}

userservice类

import org.apache.shiro.crypto.hash.sha256hash;
public class userservice {
  private userdao userdao;
  private static int userid = 1;
  public userservice() {
    userdao = new userdao();
  }
  public void saveuser(string username, string password, int roleid) {
    string npassword = new sha256hash(password).tohex();
    userdao.saveuser(userservice.userid, username, npassword, roleid);
  }
  //...
}

五、用户验证(oracle存储过程)

create or replace procedure validate_user(in_username in varchar2,
 in_password in varchar2,
 out_result out varchar2) as
 tmp_uid lh_user_t.id%type;
begin
 select count(*)
  into tmp_uid
  from lh_user_t t
  where t.username = in_username
   and t.password = in_password;
 out_result := 's';
exception
 when no_data_found then
  out_result := 'e';
end;

六、用户验证(jdbc调用存储过程)

import java.sql.callablestatement;
import java.sql.connection;
import java.sql.preparedstatement;
import java.sql.sqlexception;
import java.sql.types;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
public class userdao {
  private static final logger logger = loggerfactory.getlogger(userdao.class);
  // 添加用户
  // {...}
  // 验证用户
  public string validateuser(string username, string password) {
    string sql = "call validate_user(?,?,?)";
    string result = null;
    connection conn = oracle.getconnection();
    callablestatement cs = null;
    try {
      cs = conn.preparecall(sql);
      cs.setstring(1, username);
      cs.setstring(2, password);
      cs.registeroutparameter(3, types.varchar);
      cs.execute();
      result = cs.getstring(3);
    } catch (sqlexception sqle) {
      logger.error(sqle.getmessage());
    } finally {
      oracle.closeconnection(conn);
      if (cs != null) {
        try {
          cs.close();
        } catch (sqlexception e) {
          logger.error(e.getmessage());
        }
        cs = null;
      }
    }
    return result;
  }
}

下面还需要在userservice类中添加散列算法

public class userservice {
  private userdao userdao;
  private static int userid = 1;
  public userservice() {
    userdao = new userdao();
  }
  // {...}
  public string validateuser(string username, string password) {
    string npassword = new sha256hash(password).tohex();
    return userdao.validateuser(username, npassword);
  }
}

七、总结

应用层根据service类返回的字符串判断用户是否认证成功,'e' 代表失败,'s' 代表成功。使用任何验证框架都需要从数据库中读取用户密码并在java的框架中完成对比,个人更喜欢把这些工作交给数据库去完成,可以节省资源。

更多关于java相关内容感兴趣的读者可查看本站专题:《java+mysql数据库程序设计总结》、《java数据结构与算法教程》、《java文件与目录操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网