欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-22 12:11:59
本文实例讲述了java使用jdbc实现oracle用户认证的方法。分享给大家供大家参考,具体如下: 两天时间写的小品,以前的j2ee环境基本使用框架。现在使用jdbc配合...

本文实例讲述了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程序设计有所帮助。