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程序设计有所帮助。