两天时间写的小品,以前的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的框架中完成对比,个人更喜欢把这些工作交给数据库去完成,可以节省资源。

使用JDBC实现Oracle用户认证的更多相关文章

  1. Oracle用户密码认证方式

    oracle用户有两种认证方式: 操作系统认证(要求该用户属于本地DBA组,然后通过操作系统认证登录oracle,从而启动数据库) 密码文件认证 oracle使用哪种认证方式决定在于两个参数: 1.r ...

  2. Cognos第三方权限认证Oracle用户库

    一:概要描述 1.1:项目背景 Cognos具有强大的报表功能,但是却没有提供一个完善的用户管理体系,针对商业智能系统对数据的安全性要求,我们必须实现不同用户对不同数据的访问,确保企业级以及部门级的数 ...

  3. Spring Security笔记:使用数据库进行用户认证(form login using database)

    在前一节,学习了如何自定义登录页,但是用户名.密码仍然是配置在xml中的,这样显然太非主流,本节将学习如何把用户名/密码/角色存储在db中,通过db来实现用户认证 一.项目结构 与前面的示例相比,因为 ...

  4. Oracle身份认证方式

    Oracle对于普通账户和超级管理员(指sysdba和sysoper)的认证机制不一样,前者是通过数据字典,后者主要是通过操作系统验证和密码文件验证.因此一般提到操作系统认证或密码文件认证,针对的都是 ...

  5. Oracle用户,权限,角色以及登录管理 scoot 授权

    Oracle用户,权限,角色以及登录管理 1. sys和system用户的区别 system用户只能用normal身份登陆em.除非你对它授予了sysdba的系统权限或者syspoer系统权限. sy ...

  6. JDBC连接Oracle数据库的问题

    场景:最近做一个java web项目,使用jdbc连接Oracle数据库,遇到了两个问题. 问题1:jdbc连接不上Ubuntu Oracle服务器? 后来发现这个问题的原因是由于连接字符串写错了,修 ...

  7. Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理

    1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...

  8. [Django实战] 第3篇 - 用户认证(初始配置)

    当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...

  9. apache用户认证访问机制(转)

    Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证.前期准备,必须已经安装apache,如果还没安装,或者对安装很模糊的话,第1步:我们在/var/ww ...

随机推荐

  1. Composer 学习笔记

    Composer 是 PHP 的一个依赖管理工具(据说是最优秀的).它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们.目前很多项目以Composer 作为依赖管理工具,目前正在学习yii2 ...

  2. Matlab中常用机器学习函数

    更多内容请参考http://cn.mathworks.com/help/stats/index.html?s_cid=doc_ftr. Naive Bayes(朴素贝叶斯) Factor = Naiv ...

  3. vue.js 学习笔记

    /*属性*/ 标签内的属性都用 :attr="xxx" 的形式 /*模板*/ {{ msg }} -> 绑定数据 {{ *msg }} -> 数据只绑定一次 {{{ m ...

  4. iOS 将一串字符里面的某个字符全部标志出来

    NSMutableString * mutStr = [NSMutableString stringWithString:@"aaabbbbaaaccc"]; NSString * ...

  5. busybox rootfs 启动脚本分析(二)

    上次分析了busybox的启动脚本,这次分析一下init.d中一些脚本的内容. 参考链接 http://www.cnblogs.com/helloworldtoyou/p/6169678.html h ...

  6. http-code 未译

    1xx Informational Request received, continuing process. This class of status code indicates a provis ...

  7. laravel5.1学习(1)--安装

    主要学习的是laravel5.1版本,服务器用的是wampserver3.0.4集成环境: 首先,安装composer(windows系统) 下载地址:https://getcomposer.org/ ...

  8. String转json

    一.下载json 具体到http://www.json.org/上找Java-json下载,并把其放到项目源代码中,这样就可以引用其类对象了 转载地址:http://blog.csdn.net/tax ...

  9. 基于Java Mina框架的部标808服务器设计和开发

    在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...

  10. 分布式集群搭建(hadoop2.6.0+CentOS6.5)

    摘要:之前安装过hadoop1.2.1集群,发现比较老了,后来安装cloudera(hadoop2.6.0),发现集成度比较高,想知道原生的hadoop什么样子,于是着手搭建一个伪分布式集群(三台), ...