Java使用JDBC实现Oracle用户认证的方法详解
本文实例讲述了Java使用JDBC实现Oracle用户认证的方法。分享给大家供大家参考,具体如下:
两天时间写的小品,以前的J2EE环境基本使用框架。现在使用JDBC配合Oracle存储过程模拟了一下用户注册和用户认证。
一、添加必须的jar包
需要JDBC连接Oracle的包和shiro-core依赖,添加shiro-core主要为了方便使用SHA-256散列算法。
二、编写JDBC连接
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
publicclassOracle{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(Oracle.class);
publicstaticConnectiongetConnection(){
Connectionconn=null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
logger.debug("尝试连接数据库");
Stringurl="jdbc:oracle:thin:@192.168.0.20:1541:test";
Stringusername="apps";
Stringpassword="apps";
conn=DriverManager.getConnection(url,username,password);
}catch(ClassNotFoundExceptioncnfe){
logger.error(cnfe.getMessage());
}catch(SQLExceptionsqle){
logger.error(sqle.getMessage());
}
returnconn;
}
publicstaticvoidcloseConnection(Connectionconn){
try{
if(conn!=null){
conn.close();
conn=null;
}
}catch(SQLExceptionsqle){
logger.error(sqle.getMessage());
}
}
}
三、建表
--Createtable createtableLH_USER_T ( idINTEGERnotnull, usernameVARCHAR2(255),--用户名 passwordVARCHAR2(255),--密码 roleidINTEGER--外键链接 )
完整的用户添加和认证授权应该至少包含三张表:user_table、role_table和permission_table,本文不展开讨论。
四、添加用户
UserDao类负责数据库通信,密码散列由UserService类实现。
importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
importjava.sql.Types;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
publicclassUserDao{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(UserDao.class);
//添加用户
publicvoidsaveUser(intuserid,Stringusername,Stringpassword,introleid){
Stringsql="insertintolh_user_tvalues(?,?,?,?)";
Connectionconn=Oracle.getConnection();
PreparedStatementps=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(SQLExceptionsqle){
logger.error(sqle.getMessage());
}finally{
Oracle.closeConnection(conn);
if(ps!=null){
try{
ps.close();
}catch(SQLExceptione){
logger.error(e.getMessage());
}
ps=null;
}
}
}
//验证用户(后面添加)
}
UserService类
importorg.apache.shiro.crypto.hash.Sha256Hash;
publicclassUserService{
privateUserDaouserDao;
privatestaticintuserid=1;
publicUserService(){
userDao=newUserDao();
}
publicvoidsaveUser(Stringusername,Stringpassword,introleid){
StringnPassword=newSha256Hash(password).toHex();
userDao.saveUser(UserService.userid,username,nPassword,roleid);
}
//...
}
五、用户验证(Oracle存储过程)
createorreplaceprocedurevalidate_user(in_usernameinvarchar2, in_passwordinvarchar2, out_resultoutvarchar2)as tmp_uidlh_user_t.id%type; begin selectcount(*) intotmp_uid fromlh_user_tt wheret.username=in_username andt.password=in_password; out_result:='S'; exception whenNO_DATA_FOUNDthen out_result:='E'; end;
六、用户验证(JDBC调用存储过程)
importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
importjava.sql.Types;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
publicclassUserDao{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(UserDao.class);
//添加用户
//{...}
//验证用户
publicStringvalidateUser(Stringusername,Stringpassword){
Stringsql="callvalidate_user(?,?,?)";
Stringresult=null;
Connectionconn=Oracle.getConnection();
CallableStatementcs=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(SQLExceptionsqle){
logger.error(sqle.getMessage());
}finally{
Oracle.closeConnection(conn);
if(cs!=null){
try{
cs.close();
}catch(SQLExceptione){
logger.error(e.getMessage());
}
cs=null;
}
}
returnresult;
}
}
下面还需要在UserService类中添加散列算法
publicclassUserService{
privateUserDaouserDao;
privatestaticintuserid=1;
publicUserService(){
userDao=newUserDao();
}
//{...}
publicStringvalidateUser(Stringusername,Stringpassword){
StringnPassword=newSha256Hash(password).toHex();
returnuserDao.validateUser(username,nPassword);
}
}
七、总结
应用层根据service类返回的字符串判断用户是否认证成功,'E'代表失败,'S'代表成功。使用任何验证框架都需要从数据库中读取用户密码并在Java的框架中完成对比,个人更喜欢把这些工作交给数据库去完成,可以节省资源。
更多关于java相关内容感兴趣的读者可查看本站专题:《Java+MySQL数据库程序设计总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。