【Shiro】Shiro从小白到大神(五)-自定义Realm
用数据库的话,至少会涉及到这几张表:
用户表,角色表,权限表
角色和用户是一对多的关系 多个用户可以拥有同一个角色
角色和权限在这里也是一对多的关系 一个角色可以拥有很多个权限
数据库表名:
t_role 角色表
并插入如下数据
t_user 用户表
roleId关联角色表
t_permission 权限表
roleId关联角色表
接下来就是设置外键,设置好之后就看架构设计:
接下来就是写代码了,首先肯定是写一个连接数据库的工具类:
DbUtils.java
package cn.chenhaoxiang.common;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* 数据库工具类
* @author chenhaoxiang
*
*/
public class DbUtils { /** * 获取数据库连接 * @return * @throws Exception */ public Connection getCon() throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/db_shiro", "root", "1234"); return con; } /** * 关闭数据库连接 * @param con * @throws Exception */ public void closeCon(Connection con)throws Exception{ if(con!=null){ con.close(); } } public static void main(String[] args) { DbUtils dbUtil=new DbUtils(); try { dbUtil.getCon(); System.out.println("数据库连接成功"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("数据库连接失败"); } }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
既然连接数据库,肯定就需要用到数据库的驱动包,在maven中导入mysql驱动包。
<!--MySQL驱动--> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
版本不同的可以自行去Maven中央仓库去进行搜索。
你的连接账号密码可能与我的不同,记得修改。
完成之后测试一波,没问题的话我们继续
接下来写一个自定义的Realm:
package cn.chenhaoxiang.realm;
import cn.chenhaoxiang.common.DbUtils;
import cn.chenhaoxiang.dao.UserDao;
import cn.chenhaoxiang.entity.User;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import java.sql.Connection;
/**
* 继承一个认证的Realm
* @author chenhaoxiang
*/
public class MyRealm extends AuthorizingRealm{ private UserDao userDao = new UserDao(); private DbUtils dbUtils = new DbUtils(); /** * 为当前登录成功的用户授予角色和权限,从数据库读取 * 如果登录失败,不会到这里来的 * @param principalCollection * @return */ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { //登录成功之后 String userName = (String) principalCollection.getPrimaryPrincipal();//获取用户信息 //认证信息 SimpleAuthorizationInfo simpleAuthenticationInfo = new SimpleAuthorizationInfo(); Connection con = null; try{ con = dbUtils.getCon(); simpleAuthenticationInfo.setRoles(userDao.getRoles(con,userName));//设置角色 simpleAuthenticationInfo.setStringPermissions(userDao.getPermissions(con,userName));//获取权限 }catch (Exception e){ e.printStackTrace(); }finally { try { dbUtils.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } return simpleAuthenticationInfo; } /** * 获取认证信息 验证当前登录的用户 * @param token * @return 登录失败返回null * @throws AuthenticationException */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String userName = (String) token.getPrincipal();//获取用户名 //通过用户名去数据库查找信息 然后和提交过来的信息比对 Connection con = null; try{ con = dbUtils.getCon(); User user = userDao.getByUserName(con,userName); if(user!=null){ AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),"aa");//第二个参数密码是数据库的密码,第三个参数realmName,我们在这里随便写一个 return authenticationInfo;//shiro内部会帮我们比对的 } return null; }catch (Exception e){ e.printStackTrace(); }finally { try { dbUtils.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } return null; }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
其他还有一些类,大家直接来我们的github下载完整示例吧。
数据库的脚本在项目的WEB-INF的sql文件夹内
演示的话,大家可以先进入登录页面,然后登录来进行测试、
可以在登录验证的MyRealm类中设置断点,这样会让你记忆深一些,也会容易理解一些,理一下验证的顺序。
源代码下载地址:
GITHUB源码下载地址: 【点我进行下载】
本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。
转载请注明出处:http://chenhaoxiang.cn/2017/12/12/2143/
本文源自【谙忆的博客】
文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。
原文链接:chenhx.blog.csdn.net/article/details/79182498
- 点赞
- 收藏
- 关注作者
评论(0)