Authentication—JdbcRealm验证

本文详细介绍了如何在Shiro框架中集成JdbcRealm,包括配置数据源、设置SQL查询语句以及创建用户表的过程。通过具体示例,展示了如何使用JdbcRealm从数据库获取用户信息并进行身份验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们已经知道SecurityManager管理着所有的组件,Shiro为他注入的默认的Realm就是IniRealm。因此要使用JdbcRealm我们需要为它注入JdbcRealm。我们可以使用ini配置文件,为SecurityManager注入组件。IniRealm一篇中我们使用[users]部分配置用户名和密码,该章节我们学习使用[main]部分配置。[main]部分配置用于配置应用程序的SecurityManager实例,以及其依赖比如Realms。

在INI配置文件中配置对象实例(如SecurityManager或其任何依赖项)听起来很困难,因为我们只能使用名称/值对。但是通过对对象图的一些约定和理解,您会发现您可以做很多事情。如下我们会配置一个Realm ,因为Shiro中SecurityManager的实例名称为securityManager,因此我们配置JdbcRealm时只需要配置securityManager = xxx即可,如下,我们为SecurityManager注入Realm。引用实例的时候使用$加上实例名称。

jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
securityManager.realm=$jdbcRealm

如此一来,我们就为SecurityManager注入了JbdcRealm,那么JdbcRealm既然从数据库获取到数据,那么他是如何连到数据库的呢,通过查看源码我们可以看到JdbcRealm有如下属性:

//为JdbcRealm配置数据源
protected DataSource dataSource;
//默认的认证查询语句 select password from users where username = ?
protected String authenticationQuery = DEFAULT_AUTHENTICATION_QUERY;
//默认的用户角色查询语句 select role_name from user_roles where username = ?
protected String userRolesQuery = DEFAULT_USER_ROLES_QUERY;
//默认的权限查询语句 select permission from roles_permissions where role_name = ?
protected String permissionsQuery = DEFAULT_PERMISSIONS_QUERY;
//是否允许权限查找
protected boolean permissionsLookupEnabled = false;
//是否加盐
protected SaltStyle saltStyle = SaltStyle.NO_SALT;

通过了解上面的属性,我们可以通过为JdbcRealm注入dataSource配置数据库数据源,这里我们使用阿里开源的druid数据源,配置如下:该配置为使用JdbcRealm的完整配置,如果有需要我们也可以为其配置 SaltStyle、authenticationQuery等属性。

[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
securityManager.realm=$jdbcRealm
dataSource = com.alibaba.druid.pool.DruidDataSource
dataSource.url = jdbc:mysql://localhost:3306/shiro
dataSource.username= root
dataSource.password = 123456
jdbcRealm.dataSource = $dataSource

通过属性authenticationQuery我们可以看出JdbcRealm是从users表中查询数据,它包含两个字段username,password,除此之外,authenticationQuery的值还可以配置为DEFAULT_SALTED_AUTHENTICATION_QUERY,该值的SQL语句为 select password, password_salt from users where username = ?可以看出使用该语句时还需要有一个字段password_salt ,因此我们在shiro库中创建users表:

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 AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

配置完成之后,我们就可以编写代码进行测试,代码如下:

public class JdbcRealmAuthentication {
	public static void main(String[] args) {
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc.ini");
		SecurityManager securityManager = factory.getInstance();
		SecurityUtils.setSecurityManager(securityManager);
		Subject subject = SecurityUtils.getSubject();
		try {
			UsernamePasswordToken upt = new UsernamePasswordToken("pharos", "123456");
			subject.login(upt);
			System.out.println("认证成功");
		} catch (AuthenticationException e) {
			System.out.println("认证失败");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值