搭建一个简单的shiro项目:本人写博客初衷是记录学习记录以及方便日后查看,如果帮助到你们最好不过
第一篇文章我们是将用户密码验证写在配置文件中,但是这不符合我们的真实开发,真实开发用户密码是存放于数据库动态验证的。所以一下我们来看看shiro如何操作
1.Shiro三大核心 Subject, SecurityManager 和 Realms
1)Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
2)SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互;相当于Spring MVC前段控制器DispatcherServlet。
3)Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限), 就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用 户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
2.Subject认证主体
Principals:身份,可以使用户名、邮件、手机号等等,用来标识一个登录主体身份
Credntials:凭证,常见的有密码,数字证书等
3.重点来了---什么是Realm?
个人理解其实Realm就是从realm中获取相应的身份信息来进行验证,简单来说,我们可以自行定义realm,在realm中,从数据库获取身份信息,然后和 用户输入的身份信息进行匹配。
4.我来用jdbcRealm举个栗子
首先新建一个maven项目
利用maven导入java包
书写jdbcRealm配置文件
数据库配置
注意:数据库的表名和字段名称一定要是截图一样
准备工作完成 下面直接开始写程序测试
package com.study.chapter01;
import org.apache.shiro.SecurityUtils;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloShiro {
private static final Logger logger = LoggerFactory.getLogger(HelloShiro.class);
public static void main(String[] args) {
// 利用工厂管理方法,加载配置文件
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
// 获取实例对象
SecurityManager securityManager = factory.getInstance();
// 将其存储进工具类方便校验(securityManager绑定到SecurityUtils)
SecurityUtils.setSecurityManager(securityManager);
// 获取当前的用户信息
Subject currentUser = SecurityUtils.getSubject();
// 获取令牌(设置固定的username password 以便测试)
UsernamePasswordToken token = new UsernamePasswordToken("ShiroA", "111111");
try {
// 身份验证
currentUser.login(token);
logger.info("HelloShiro 验证成功!!!!");
} catch (Exception e) {
e.printStackTrace();
}
// 注销
currentUser.logout();
}
}
完结 撒花