概述
Shiro内置JdbcRealm使用
方式一:jdbcRealm.ini
- 创建
jdbcRealm.ini
文件
#注意 文件格式必须为ini,编码为ANSI
#声明Realm,指定realm类型
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#配置数据源
#dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource=com.alibaba.druid.pool.DruidDataSource
# mysql-connector-java 5 用的驱动url是com.mysql.jdbc.Driver,mysql-connector-java6以后用的是com.mysql.cj.jdbc.Driver
dataSource.driverClassName=com.mysql.cj.jdbc.Driver
#避免安全警告
dataSource.url=jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
dataSource.username=xxx
dataSource.password=xxx
#指定数据源
jdbcRealm.dataSource=$dataSource
#注意!!!! 开启查找权限, 默认是false,不会去查找角色对应的权限
jdbcRealm.permissionsLookupEnabled=true
#指定SecurityManager的Realms实现,设置realms,可以有多个,用逗号隔开
securityManager.realms=$jdbcRealm
- 使用
// 通过工厂创建SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbcRealm.ini");
// 通过工厂获取securityManager环境
SecurityManager securityManager = factory.getInstance();
// 把securityManager进行注入
SecurityUtils.setSecurityManager(securityManager);
// 获取主体
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("jack","123");
subject.login(token);
System.out.println("认证状态:"+subject.isAuthenticated());
System.out.println("是否具有role1角色:"+subject.hasRole("role1"));
System.out.println("是否具有good:buy权限:"+subject.isPermitted("good:buy"));
// 检查权限
// subject.checkPermission("good:add");
System.out.println("获取用户名:"+subject.getPrincipal());
方式二:声明式
- 创建jdbc数据源
// 连接数据库
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false");
ds.setUsername("xxx");
ds.setPassword("xxx");
- 使用
@Test
public void testAuthenticator2(){
// 创建securityManager环境
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 连接数据库
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false");
ds.setUsername("xxx");
ds.setPassword("xxx");
// 创建数据域
JdbcRealm jdbcRealm = new JdbcRealm();
// 设置可以获取权限
jdbcRealm.setPermissionsLookupEnabled(true);
jdbcRealm.setDataSource(ds);
// 将jdbcRealm注入securityManager中
securityManager.setRealm(jdbcRealm);
// 把securityManager进行注入
SecurityUtils.setSecurityManager(securityManager);
// 获取主体
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("jack","123");
subject.login(token);
System.out.println("认证状态:"+subject.isAuthenticated());
System.out.println("是否具有role1角色:"+subject.hasRole("role1"));
System.out.println("是否具有good:buy权限:"+subject.isPermitted("good:buy"));
// 检查权限
// subject.checkPermission("good:add");
System.out.println("获取用户名:"+subject.getPrincipal());
}
注意,使用内置JdbcRealm时,表结构需要与其默认的保持一致,否则可能无法找到相应的信息
- 表结构(仅供参考)
CREATE TABLE `roles_permissions` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`role_name` varchar(100) DEFAULT NULL,
`permission` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_roles_permissions` (`role_name`,`permission`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_roles` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`role_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_roles` (`username`,`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`password_salt` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_users_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
最后
以上就是炙热歌曲为你收集整理的Shiro内置JdbcRealm使用的全部内容,希望文章能够帮你解决Shiro内置JdbcRealm使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复