使用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的框架中完成对比,个人更喜欢把这些工作交给数据库去完成,可以节省资源。
使用JDBC实现Oracle用户认证的更多相关文章
- Oracle用户密码认证方式
oracle用户有两种认证方式: 操作系统认证(要求该用户属于本地DBA组,然后通过操作系统认证登录oracle,从而启动数据库) 密码文件认证 oracle使用哪种认证方式决定在于两个参数: 1.r ...
- Cognos第三方权限认证Oracle用户库
一:概要描述 1.1:项目背景 Cognos具有强大的报表功能,但是却没有提供一个完善的用户管理体系,针对商业智能系统对数据的安全性要求,我们必须实现不同用户对不同数据的访问,确保企业级以及部门级的数 ...
- Spring Security笔记:使用数据库进行用户认证(form login using database)
在前一节,学习了如何自定义登录页,但是用户名.密码仍然是配置在xml中的,这样显然太非主流,本节将学习如何把用户名/密码/角色存储在db中,通过db来实现用户认证 一.项目结构 与前面的示例相比,因为 ...
- Oracle身份认证方式
Oracle对于普通账户和超级管理员(指sysdba和sysoper)的认证机制不一样,前者是通过数据字典,后者主要是通过操作系统验证和密码文件验证.因此一般提到操作系统认证或密码文件认证,针对的都是 ...
- Oracle用户,权限,角色以及登录管理 scoot 授权
Oracle用户,权限,角色以及登录管理 1. sys和system用户的区别 system用户只能用normal身份登陆em.除非你对它授予了sysdba的系统权限或者syspoer系统权限. sy ...
- JDBC连接Oracle数据库的问题
场景:最近做一个java web项目,使用jdbc连接Oracle数据库,遇到了两个问题. 问题1:jdbc连接不上Ubuntu Oracle服务器? 后来发现这个问题的原因是由于连接字符串写错了,修 ...
- Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...
- [Django实战] 第3篇 - 用户认证(初始配置)
当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...
- apache用户认证访问机制(转)
Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证.前期准备,必须已经安装apache,如果还没安装,或者对安装很模糊的话,第1步:我们在/var/ww ...
随机推荐
- javaScript中的空值和假值
javaScript中有五种空值和假值,分别为false,null,undefined,"",0.从广义上来说,这五个值都是对应数据类型的无效值或空值. 这五个值的共同点是在执行i ...
- HDU 5965 枚举模拟 + dp(?)
ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然 ...
- 转-HttpClient4.3 连接管理
转 http://www.yeetrack.com/?p=782 2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大 ...
- Log4Net
注意事项 <!-- The file log4Net.config is copied into bin/Debug /release by compiler 添加如下内容到 assemblyi ...
- 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具
ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...
- 简易版C语言程序设计语法
源程序 → 外部声明 | 子程序(外部声明) 外部声明 → 函数定义| 函数声明 函数定义 → 类型标识符(复合句) 标识符类型 → 无类型 | 字符型 | 整型 | 浮点型 整型→ 长整型 | ...
- Redis数据类型介绍
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- dynamodb golang query one Item
golang dynamodb query oneItem and unmarshal to object // +build example package main import ( / ...
- php类和对象
<?php 1. 类的简单格式: [修饰符] class 类名{ [成员属性] //成员属性,也叫成员变量 [成员方法] //成员方法:也叫成员函数 } 类的完整格式: [修饰符] class ...
- 简单的oracle分页语句
SELECT * FROM ( SELECT rownum rn,te.* FROM (SELECT * FROM tb_enterprise) te WHERE rownum <= 10) ...