Shiro 系列: 简单示例学习

在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范.

=======================
Shiro INI 的基本规范
=======================
[main]
# 在这里定义 SecurityManager 和 Realms 等

[users]
# 每一行定义一个用户, 格式是 username = password, role1, role2, ..., roleN

[roles]
# 角色在这里定义, 格式是 roleName = perm1, perm2, ..., permN
# 说明1: 权限名可以使用带有层次的命名方式, 使用冒号来分割层次关系, 比如 user:create 或 user:poweruser:update 权限.
# 说明2: user:* 这样的权限, 代表具有 user:create 和 user:poweruser:update 权限.

[urls]
# 对于web系统, 可在这里定义url的权限配置.

==========================
pom
==========================
Shiro jar需要 slf4j 依赖项.

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

# =======================
shiro.ini 示例文件的内容
# =======================

# =======================
shiro.ini 示例文件的内容
# =======================
# -----------------------------------------------------------------------------
# Users and their (optional) assigned roles
# username = password, role1, role2, ..., roleN
# -----------------------------------------------------------------------------
[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
aihe = aihe, goodguy, client

# -----------------------------------------------------------------------------
# Roles with assigned permissions
# roleName = perm1, perm2, ..., permN
# -----------------------------------------------------------------------------
[roles]
admin = *
client = look:*
goodguy = winnebago:drive:eagle5

==========================
API 代码示例
==========================

@Override
public void run(String... args) throws Exception {
    // 创建sessionFactory,使用ini配置文件初始化
    IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    // 创建securityManager实例
    SecurityManager securityManager = factory.getInstance();

    // 将securityManager配置在当前运行环境中
    SecurityUtils.setSecurityManager(securityManager);

    // 获取当前的subject
    Subject currentUser = SecurityUtils.getSubject();

    // session 操作
    Session session = currentUser.getSession();
    System.out.println("Id:" + session.getId());

    session.setAttribute("name", "value");
    System.out.println(session.getAttribute("name"));

    if (!currentUser.isAuthenticated()) {
        // 登录需要一个 token
        UsernamePasswordToken token = new UsernamePasswordToken("root", "secret");

        // 在 token 上设置 RememberMe
        // token.setRememberMe(true);

        // 登录
        currentUser.login(token);

        // 登录后可获取认证身份(一个或多个)
        PrincipalCollection principals = currentUser.getPrincipals();
        for (Object principal : principals) {
            System.out.println(principal.toString());
        }

        // 角色检查
        boolean granted1 = currentUser.hasRole("admin");
        System.out.println("hasRole(‘admin‘):" + granted1);

        boolean granted2 = currentUser.hasRole("winnebago:drive");
        System.out.println("hasRole(‘winnebago:drive‘):" + granted1);

        // 角色检查断言, 如果没有对应的角色, 会抛出 AuthorizationExceptions
        currentUser.checkRole("admin");

        // 权限检查
        boolean granted3 = currentUser.isPermitted("winnebago:drive");
        System.out.println("isPermitted(‘winnebago:drive‘):" + granted2);

        // 权限检查断言, 如果没有对应的权限, 会抛出 AuthorizationExceptions
        currentUser.checkPermission("winnebago:drive");

        // 登出
        currentUser.logout();

    } else {
        System.out.println("you have login");
    }
}

结果输出为:

Id:71b126e5-a79c-416d-9abb-1b5430eaf5c3
value
root
hasRole(‘admin‘):true
hasRole(‘winnebago:drive‘):true
isPermitted(‘winnebago:drive‘):false

==========================
参考
==========================
https://www.jianshu.com/p/5a35d0100a71

原文地址:https://www.cnblogs.com/harrychinese/p/shiro_simple_demo.html

时间: 2024-12-09 06:12:11

Shiro 系列: 简单示例学习的相关文章

WPF系列——简单绑定学习

1. 绑定到元素对象.(实际项目中用处不大) 界面上两个关联的控件之间绑定,比如一个TextBlock 的FontSize和一个Slider 的Value绑定: <Slider Name="sliderFontText" Minimum="1" Maximum="100" Value="10"/> <TextBox Name="txtValue" Width="200"

RPC学习----Thrift快速入门和Java简单示例

一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 二.什么是Thrift? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和

ActiveMQ学习教程(二)——简单示例

ActiveMQ学习教程(二)--简单示例 一.应用IDEA构建Maven项目 File->New->Module...->Maven->勾选->选择->Next -> GroupId:com.jd.myMaven   |    ArtifactId:activeMQ    |    version:默认   ->Finish 项目构建成功!项目结构如下所示: 二.创建生产者类,模拟生产者发消息 Step1:java/activemq/JMSProducer

动态网站开发技术学习2:VS 2010制作作第一个简单示例网站

制作一个简单示例网站的步骤: 一,启动VS 2010开发环境,选择菜单中的"文件",选择其中的"新建",再选择"网站",会弹出"新建网站"对话框. 二,在"新建网站"的对话框,在"已安装模板"中选择Visual C#,右侧的选择"ASP.NET网站"选项,单击"新建网 站"中的"文件系统",下拉菜单中有"文件系统&qu

JAVA套接字(Socket)101七天系列—第四天【一个简单示例】

一个简单示例  1. 背景 我们将在本部分讨论的示例将阐明在 Java 代码中如何使用 Socket 和 ServerSocket.客户机用Socket 连接到服务器.服务器用 ServerSocket 在端口 3000 侦听.客户机请求服务器 C: 驱动器上的文件内容. 为清楚起见,我们把示例分解成客户机端和服务器端.最后我们将把它们组合起来以使您能看到整体模样. 我们在使用 JDK 1.2 的 IBM VisualAge for Java 3.5 上开发这些代码.要自己创建这个示例,您应有完

JBoss 系列九十六:JBoss MSC - 简单介绍及一个简单示例

什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MSC 替换了之前的 JMX Kernel 和 MicroContainer,它主要特定可以总结如下三点: 高并发容器(A highly concurrent state machine) 无多相位,设计简单(No multiple phases, much simpler) 不依赖 JMX 和 Jav

Apache Shiro系列四:Shiro的架构

Shiro的设计目标就是让应用程序的安全管理更简单.更直观. 软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如果用户登录了我们的系统,我就给他们显示一个按钮,点击之后可以查看他自己的账户信息.如果没有登录,我就给他显示一个注册按钮.” 上述应用程序在很大程度上是为了满足用户的需求而编写的,即便这个“用户”不是人,而是一个其他的软件系统.你仍然是按照谁当前正在与你的系统交互的逻辑来编写你的逻辑代码. Shiro的设计

Apache Shiro系列之五:配置

Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制. 小贴士:多种配置方案: Shiro的SecurityManager是和JavaBean兼容的,所以我们可以使用诸如Java.Xml(Spring.Jboss.Guice等).YAML.Json.Groovy等配置方式.   一.基于Java代码的配置 最简单的创建并且使用SecurityManager

关于Ajax实现的简单示例

一.代码示例 关于Ajax的基本概念(包括XMLHttpRequest对象及其相关方法属性)移步这里(w3school中文版)学习了解. <!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title>使用Ajax异步加载数据</title> <script type = "text/javasc