Shiro(二) - 基于 ini 配置文件

完整 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

猜你喜欢

转载自blog.csdn.net/SGamble/article/details/85028166