博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
realm实现认证时的自定义数据表和字段匹配关系
阅读量:6888 次
发布时间:2019-06-27

本文共 2225 字,大约阅读时间需要 7 分钟。

hot3.png

疑惑: 程序是通过什么方法匹配到数据库中相应的用户名及密码的?

(1)这是配置文件,其中并未提及用户名和密码的匹配方法:

[main]jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealmdataSource=com.alibaba.druid.pool.DruidDataSourcedataSource.driverClassName=com.mysql.jdbc.DriverdataSource.url=jdbc:mysql://localhost:3306/testdataSource.username=jackdataSource.password=123jdbcRealm.dataSource=$dataSourcesecurityManager.realms=$jdbcRealm

(2)这是程序,其中也没有用户名和密码的匹配方法:

package com.shiro.hello;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 JdbcRealmTest {	public static void main(String[] args) {		// 读取配置文件,初始化SecurityManager工厂		Factory
factory = new IniSecurityManagerFactory( "classpath:jdbc_realm.ini"); // 获取securityManager实例 SecurityManager securityManager = factory.getInstance(); // 把securityManager实例绑定到SecurityUtils SecurityUtils.setSecurityManager(securityManager); // 得到当前执行的用户 Subject currentUser = SecurityUtils.getSubject(); // 创建token令牌,用户名/密码 UsernamePasswordToken token = new UsernamePasswordToken("java1234", "1234567"); try { // 身份认证 currentUser.login(token); System.out.println("身份认证成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("身份认证失败!"); } // 退出 currentUser.logout(); }}

(3)这是数据库字段:

解决办法: 通过群里发文得到了大神的指点,这里的表和字段是可以自定义的,只需要在ini配置文件中进行相应的配置即可。

[main]jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealmdataSource=com.alibaba.druid.pool.DruidDataSourcedataSource.driverClassName=com.mysql.jdbc.DriverdataSource.url=jdbc:mysql://localhost:3306/testdataSource.username=jackdataSource.password=123jdbcRealm.authenticationQuery=select password from users where username = ?jdbcRealm.dataSource=$dataSourcesecurityManager.realms=$jdbcRealm

注意这个配置文件多了一句

jdbcRealm.authenticationQuery=select password from users where username = ?

后面的sql语句就可以自定义。比如想把表名换成hello

jdbcRealm.authenticationQuery=select password from hello where username = ?

换过之后,程序就会在数据库中hello表中进行查找验证了。

转载于:https://my.oschina.net/zhanggongming/blog/718774

你可能感兴趣的文章
MySQL/MariaDB的日志
查看>>
Unity3d Textrue属性
查看>>
Netty(四)——线程模型
查看>>
Linux查看硬盘、内存
查看>>
Redis设置密码
查看>>
python简介
查看>>
C#中将DataGridView中数据导出至Excel
查看>>
我的友情链接
查看>>
性能优化之Java(Android)代码优化
查看>>
nagios自定义插件
查看>>
关于字符串的拼接
查看>>
nginx 反向代理 取得真实IP和域名
查看>>
最实用的Spring Data JPA功能
查看>>
我的软件之路
查看>>
如何用消息系统避免分布式事务?
查看>>
【python】编程语言入门经典100例--39
查看>>
Solr5.5版本使用tika索引文件夹下所有文件
查看>>
SNMP 客户端配置
查看>>
windows server 2016 系统管理 (五)
查看>>
linux+nginx+python+django环境配置
查看>>