设为首页 收藏本站
查看: 1088|回复: 0

[经验分享] 使用JDBC实现Oracle用户认证

[复制链接]

尚未签到

发表于 2017-12-10 18:41:04 | 显示全部楼层 |阅读模式
  两天时间写的小品,以前的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>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 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>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>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>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>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的框架中完成对比,个人更喜欢把这些工作交给数据库去完成,可以节省资源。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-422728-1-1.html 上篇帖子: 分享一次Oracle数据导入导出经历 下篇帖子: Navicat备份远程Oracle数据库到本地
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表