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

时间: 2024-08-24 07:52:59

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

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

在前一节,学习了如何自定义登录页,但是用户名.密码仍然是配置在xml中的,这样显然太非主流,本节将学习如何把用户名/密码/角色存储在db中,通过db来实现用户认证 一.项目结构 与前面的示例相比,因为要连接db,所以多出了一个spring-database.xml用来定义数据库连接,此外,为了演示登录用户权限不足的场景,加了一个页面403.jsp,用来统一显示权限不足的提示信息 二.数据库表结构(oracle环境) 1 create table T_USERS 2 ( 3 d_username

Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

Shiro系列之Shiro+Mysql实现用户认证(Authentication)

网上大多数介绍Apache Shiro的资料都是使用ini文件的简单配置为例,很少用讲到如何配合数据库来实现用户认证的.我也是刚刚开始接触Shiro,在这里介绍一个入门级别的Shiro+Mysql的配置方法,这个方法仅仅是个开始,并没有和Web,Spring,Mybatis等框架进行整合,后续我还会继续和大家分享我的学习过程及心得. now we can start the things that we really care about. 数据库中创建一个用户表,字段可以很简单. CREATE

java程序通过jdbc连接oracle数据库方法

1.  赋予scott用户连接权限:Grant connect to scott: 2.   在Myeclipse中新建java项目导入jdbc包(classes12.jar):        右键项目 bulid path -〉add external archives 选择classes12.jar 3.   新建java文件, lianxi01.java import java.sql.Connection; import java.sql.ResultSet; import java.s

Linux FTP服务器的搭建与配置+基于关系型数据库实现用户认证

一.服务器端的安装: yum install vsftpd 1)查看安装后生成的哪些文件 [[email protected] ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd  <==========主志日志文件 /etc/pam.d/vsftpd<==================认证文件 /etc/rc.d/init.d/vsftpd<=============服务脚本 /etc/vsftpd<======================

SVN分级授权部署手册 --Windows用户认证

http://wenku.baidu.com/view/a0a16ea34028915f804dc2f8.html 第一章 概述 当VisualSVN 2.7采用Windows用户认证或Windows域认证时,可以使用SVN分级授权工具对VisualSVN的授权功能进行扩展,实现SVN库的创建.分库的分级授权.SVN用户密码修改等.本手册主要描述Windows用户认证的配置方法,关于采用Windows域认证的配置方法请参考<SVN分级授权工具部署手册--Windows域认证>. 第二章 安装部

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

1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量小(100人内).成本千元内.对安全性要求不高 日访问量5000--15000.成本在万元内,比如商务网站 负载可以处理.海量数据库 .安全性很高sybase<oracle<db2 数据库的选择标准: 项目的规模:a.负载量有多大:b.成本: c.安全性 需求量大: 2.Oracle认证: DBA

Oracle OS认证 口令文件 密码丢失处理

Oracle OS认证 口令文件 密码丢失处理 分类: Oracle Basic Knowledge2009-10-19 14:24 5031人阅读 评论(9) 收藏 举报 oracleos数据库sql远程登录login 一.  OS认证 1.1  OS认证介绍 Oracle安装之后默认情况下是启用了OS认证的,这里提到的OS认证是指服务器端OS认证.OS认证的意思把登录数据库的用户和口令校验放在了操作系统一级.如果以安装Oracle时的用户登录OS,那么此时在登录Oracle数据库时不需要任何

apache用户认证访问机制

Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证.前期准备,必须已经安装apache,如果还没安装,或者对安装很模糊的话,第1步:我们在/var/www(apache的主页根目录)下建立一个test目录mkdir /var/www/test第2步然后我们编辑httpd.conf添加Alias /test"/var/www/test"Options Indexes MultiViewsAllowOverride AuthConfig #表