文章目录
完整 Demo
https://github.com/SSGamble/Shiro_ini
1.需导 jar 包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.5</version>
</dependency>
2.创建 shiro.ini 配置文件,里面自定义了一些用户身份信息。
#定义用户
[users]
#用户名:z3admin,密码:12345,角色:admin
z3admin = 12345, admin
#用户名:l4productManager,密码:abcde,角色:产品经理
l4productManager = abcde,productManager
#定义角色
[roles]
#管理员什么都能做
admin = *
#产品经理只能做产品管理
productManager = addProduct,deleteProduct,editProduct,updateProduct,listProduct
#订单经理只能做订单管理
orderManager = addOrder,deleteOrder,editOrder,updateOrder,listOrder
3.测试
3.1 获取 Subject 对象。
/**
* 获取 Subject 对象
* Shiro 这个安全框架下, Subject 就是当前用户
* @return Subject 对象
*/
private static Subject getSubject(User user) {
// 加载配置文件,并获取工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("src/main/shiro.ini");
// 获取安全管理者实例
SecurityManager sm = factory.getInstance();
// 将安全管理者放入全局对象
SecurityUtils.setSecurityManager(sm);
// 全局对象通过安全管理者生成 Subject 对象
Subject subject = SecurityUtils.getSubject();
return subject;
}
3.2 创建模拟用户,分别测试登录,是否包含角色,是否拥有权限。
测试登录
/**
* 登录
* @param user
* @return
*/
private static boolean login(User user) {
// 获取 Subject 对象
Subject subject = getSubject(user);
//如果已经登录过了,退出
if(subject.isAuthenticated())
subject.logout();
//封装用户的数据
UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword());
try {
//将用户的数据 token 最终传递到 Realm 中进行对比
subject.login(token);
} catch (AuthenticationException e) {
//验证错误
return false;
}
return subject.isAuthenticated();
}
// ====================== 测试登录 =========================
//登陆每个用户
for (User user : userList) {
if(login(user))
System.out.printf(user.getName() + " - 登陆成功,用的密码是:" + user.getPassword() + "\n");
else
System.out.printf(user.getName() + " - 登录失败,用的密码是:" + user.getPassword() + "\n");
}
------------- 测试登录输出信息 -------------
z3admin - 登陆成功,用的密码是:12345
l4productManager - 登陆成功,用的密码是:abcde
w5 - 登录失败,用的密码是:111
测试是否包含角色
/**
* 是否包含角色
* @param user 用户
* @param role 角色
* @return
*/
private static boolean hasRole(User user, String role) {
Subject subject = getSubject(user);
return subject.hasRole(role);
}
// ====================== 测试是否包含角色 ====================
// 判断能够登录的用户是否拥有某个角色
for (User user : userList) {
for (String role : roleList) {
if(login(user)) {
if(hasRole(user, role))
System.out.printf(user.getName() + " - 拥有角色:" + role + "\n");
else
System.out.printf(user.getName() + " - 不拥有角色:" + role + "\n");
}
}
}
-------------- 测试是否包含角色输出信息 -------------
z3admin - 拥有角色:admin
z3admin - 不拥有角色:productManager
l4productManager - 不拥有角色:admin
l4productManager - 拥有角色:productManager
测试是否拥有权限
/**
* 是否拥有权限
* @param user 用户
* @param permit 权限
* @return
*/
private static boolean isPermitted(User user, String permit) {
Subject subject = getSubject(user);
return subject.isPermitted(permit);
}
// ======================= 测试是否拥有权限 ==================
// 判断能够登录的用户,是否拥有某种权限
for (User user : userList) {
for (String permit : permitList) {
if(login(user)) {
if(isPermitted(user, permit))
System.out.printf(user.getName() + " - 拥有权限: " + permit + "\n");
else
System.out.printf(user.getName() + " - 不拥有权限: " + permit + "\n");
}
}
}
-------------- 测试是否拥有权限的输出信息 -------------
z3admin - 拥有权限: addProduct
z3admin - 拥有权限: addOrder
l4productManager - 拥有权限: addProduct
l4productManager - 不拥有权限: addOrder