jdbcrealm的使用
2017-03-22 17:11
134 查看
目录结构如下:
然后新建数据库
测试代码如下
说明:
当然这里的
jdbc-realm-ini.java配置文件如下
[main] jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm dataSource=com.alibaba.druid.pool.DruidDataSource dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/shiro dataSource.username=root dataSource.password="" jdbcRealm.dataSource=$dataSource #指向了框架实现的JdbcRealm,这个在系统里已经实现了 securityManager.realms=$jdbcRealm
然后新建数据库
shiro,新建三个表,表明限制为
users,
user_role,
user_permissions,然后就可以测试了
测试代码如下
import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.junit.Assert; import org.junit.Test; /** * Created by zhouyueyue on 2017/3/22. */ public class shiroTest { @Test public void testHelloworld() { Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini"); //2、得到SecurityManager实例 并绑定给SecurityUtils,全局设置,设置一次即可 SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager);//自动绑定当前线程,在多请求的环境下需要 //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { //4、登录,即身份验证 //4.1 当使用realm时,login调用的时候会调用reaml实例中的getAuthenticationInfo函数,当使用Jdbcrealm时,会调用源码中的doGetAuthenticationInfo()函数 subject.login(token); } catch (AuthenticationException e) { //5、身份验证失败 } Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录 //6、退出 subject.logout(); } }
说明:
JdbcRealm.java中将
username作为主键即唯一值从如下源码可看出
private String[] getPasswordForUser(Connection conn, String username) throws SQLException { String[] result; boolean returningSeparatedSalt = false; switch (saltStyle) { case NO_SALT: case CRYPT: case EXTERNAL: result = new String[1]; break; default: result = new String[2]; returningSeparatedSalt = true; } PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(authenticationQuery); ps.setString(1, username); // Execute query rs = ps.executeQuery(); // Loop over results - although we are only expecting one result, since usernames should be unique boolean foundResult = false; while (rs.next()) { // Check to ensure only one row is processed,大于一列会抛出异常 if (foundResult) { throw new AuthenticationException("More than one user row found for user [" + username + "]. Usernames must be unique."); } result[0] = rs.getString(1); if (returningSeparatedSalt) { result[1] = rs.getString(2); } foundResult = true; } } finally { JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(ps); } return result; }
当然这里的
username是下面函数的第一个参数
UsernamePasswordToken('输入主键','对应的密码')
相关文章推荐
- shiro(三),使用第三方jdbcRealm连接数据库操作
- Shiro中使用jdbcRealm的ini文件配置出错
- shiro使用jdbc_realm登录验证
- shiro中JdbcRealm使用salt的问题
- Apache Shiro 权限控制 使用自定义的JdbcRealm(3)
- java中使用jdbc连接SQLite3数据库
- 使用JDBC连接MySQL数据库--典型案例分析(九)----财务帐号的DAO设计及其实现
- 理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码
- JAVA中使用JDBC连接MySQL
- sharding-jdbc使用
- 使用JDBC进行批处理
- 使用JDBC连接各种数据库
- 使用JDBC连接Mysql的3种方式
- java 关于JDBC和DAO模式使用
- 水晶报表Crystal Report2008使用JDBC连接MySQL数据库-详细步骤
- Spring对JDBC封装时使用的一种CallBack来参数化一个操作的模式
- 使用JDBC连接数据库的步骤
- JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】
- 使用JNDI配置数据池问题Cannot create JDBC driver of class 'com.microsoft.sqlserver.jdbc.SQLServerDriver' f解决方法
- 在myeclispe中使用JDBC直接访问oracle数据库