JDBC Realm使用
1、数据库及依赖
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<dependency>
<groupId>org.gatein.common</groupId>
<artifactId>common-logging</artifactId>
<version>2.2.2.Final</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
本文将使用mysql数据库及c3p0连接池;
2、到数据库shiro下建三张表:users(用户名/密码)
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
并插入一条数据(1,yyt,123)
3、ini配置(shiro_JDBC.ini)
[main]
#声明一个realm
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#声明一个数据库连接池 并设置好参数
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
dataSource.user=root
dataSource.password=kingdee
#将dataSource设置给jdbcRealm
jdbcRealm.dataSource=$dataSource
#将jdbcRealm设置给securityManager.realms
securityManager.realms=$jdbcRealm
配置意思解释:
- 变量名=全限定类名会自动创建一个类实例
- 变量名.属性=值 自动调用相应的setter方法进行赋值
- $变量名 引用之前的一个对象实例
测试代码:
package com.kingsky;
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;
public class JdbcShiro {
public static void main(String[] args) {
//读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro_JDBC.ini");
//获取到SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//把SecurityManager绑定到SecurityUtils中
SecurityUtils.setSecurityManager(securityManager);
//得到当前用户
Subject subject=SecurityUtils.getSubject();
//创建Token令牌,用户名/密码
UsernamePasswordToken passwordToken=new UsernamePasswordToken("yyt", "123");
//验证登录 会抛出异常
try {
subject.login(passwordToken);
System.out.println("身份验证成功!!!");
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("身份验证失败!!!!");
}
//退出登录
subject.logout();
}
}
查看控制台输出,输入验证成功