`

【shiro权限管理】2.shiro的HelloWorld

 
阅读更多

 

下面是shiro在javase环境下的简单使用 

 

一、新建一个java项目,将shiro相关的包以及日志包引入项目

<dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-lang</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-cache</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-config-core</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-config-ogdl</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-crypto-core</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-crypto-hash</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-crypto-cipher</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-event</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-web</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-servlet-plugin</artifactId>
      <version>1.4.1</version>
    </dependency>
    <!-- Shiro 3rd party support (keep this alphabetically ordered based on the artifactId please): -->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-aspectj</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-cas</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-quartz</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-guice</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-hazelcast</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-jaxrs</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-all</artifactId>
      <version>1.4.1</version>
    </dependency>
    <!-- Shiro samples: -->
    <dependency>
      <groupId>org.apache.shiro.samples</groupId>
      <artifactId>samples-spring-client</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring-boot-starter</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring-boot-web-starter</artifactId>
      <version>1.4.1</version>
    </dependency>
    <!-- Intra project test dependencies: -->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.4.1</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-config-ogdl</artifactId>
      <version>1.4.1</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.9.3</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

 

二、从官网上下载任意版本shiro项目,找到里面的samples/quickstart项目。将里面的Quickstart.java类复制到任意包下,然后将模板项目的resources下的logj.properties和shiro.ini文件拷贝到项目根目录下。

 

三、分块剖析Quickstart.java的样例代码

 

(1)创建SecurityManager

//下面是创建一个SecurityManager最简单的方式,使用了ini文件(shiro.ini)中配置的
//realms, users, roles 以及 permissions。我们使用了工程的模式,加载ini文件中
//的配置,进而创建出了一个SecurityManager实例。
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

 上面所指的Shiro.ini文件就是之前我们加入到测试工程的文件,其中核心的配置数据如下:

 [users]

 root = secret, admin

 guest = guest, guest

 presidentskroob = 12345, president

 lonestarr = vespa, goodguy, schwartz

 [roles] 

 admin = * 

 schwartz = lightsaber:*

 goodguy = winnebago:drive:eagle5

上面配置了root用户、guest用户、presidentskroob用户、lonestarr用户的密码以及角色,下面配置了admin以及schwartz和goodguy这三个角色的权限信息。

上面创建SecurityManager的方式以及ini的配置,仅作为测试样例的参考,在开发中不可能使用这种方式进行开发,这里大家仅作为了解即可。

(2)securityManager的一些设置

//对于这个简单的例子,我们使SecurityManager在Java虚拟机中变可访问的“单例”,

//但大部分应用都不这么做。这里为了体验快速工程,才使用这种最小开销的方式。

SecurityUtils.setSecurityManager(securityManager);

上面就是一个单例设置,日常开发中也很少这么做,这里仅作了解即可。

(3)使用Shiro的核心API

1.获取当前用户的Subject

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

 上面的代码就是使用SecurityUtils的getSubject获取当前用户的Subject。上一此我们说到在Shiro中与SecurityManager打交道的就是Subject。


2.使用Session

//测试使用Session(即便不是Web或EJB容器下)
Session session = currentUser.getSession();//调用Subject的getSession方法
session.setAttribute("someKey", "aValue");//存入Key-Value对象
String value = (String) session.getAttribute("someKey");
if (value.equals("aValue")) {
    log.info("Retrieved the correct value! [" + value + "]");
}

 上面的代码通过调用Subject的getSession方法获取session对象来使用。


3.进行认证(登录)

//测试当前用户是否已经被认证(即是否已经登录)
if (!currentUser.isAuthenticated()) {
   //将用户名与密码封装为UsernamePasswordToken对象
    UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
    token.setRememberMe(true);//记录用户
    try {
        currentUser.login(token);//调用Subject的login方法执行登录
    } catch (UnknownAccountException uae) {
        log.info("There is no user with username of " + token.getPrincipal());
    } catch (IncorrectCredentialsException ice) {
        log.info("Password for account " + token.getPrincipal() + " was incorrect!");
    } catch (LockedAccountException lae) {
        log.info("The account for username " + token.getPrincipal() + " is locked.  " +
                "Please contact your administrator to unlock it.");
    }
    // ... catch more exceptions here (maybe custom ones specific to your application?
    catch (AuthenticationException ae) {
        //unexpected condition?  error?
    }
}

 上面的代码去校验用户是否被认证,如果没有被认证,则会将用户的账号密码封装为。UsernamePasswordToken对象,并传入Subject的login方法执行登录。如果账号密码正确,则通过认证并登录成功,如果账户没有,则会抛出UnknownAccountException异常;如果账户存在但密码错误,则会抛出IncorrectCredentialsException异常;如果用户被锁定,则会抛出LockedAccountException 异常;最后的AuthenticationException是上面所有异常的父类,在不清楚会发生何种异常时,可以直接抛出该类异常。

 

4.进行角色判定

//测试用户是否有某一个角色
if (currentUser.hasRole("schwartz")) {
    log.info("May the Schwartz be with you!");
} else {
    log.info("Hello, mere mortal.");
}

 通过Subject的hasRole方法来判定该用户是否含有指定的橘色。对于该样例,ini文件中配置的lonestarr用户是有“schwartz”这个角色的,所以控制台会输出“May the Schwartz be with you!”。

 

5.进行权限判定

//测试用户是否具备某个行为
if (currentUser.isPermitted("lightsaber:wield")) {
    log.info("You may use a lightsaber ring.  Use it wisely.");
} else {
    log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
 
//a (very powerful) Instance Level permission:
if (currentUser.isPermitted("winnebago:drive:eagle5")) {
    log.info("You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  " +
            "Here are the keys - have fun!");
} else {
    log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}

 一般在系统的权限设置中,一个用户对应一个或多个角色,而一个角色下又会拥有许多个权限,来指定该角色的行为范围。这里使用Subject的isPermitted方法来判定用户是否具备某个类型下的某些行为权限。在该样例中,第一个判断就是判定用户在lightsaber类型下是否拥有wield行为权限,而在上面的ini配置文件中我们可以看到,该用户的“schwartz”角色的权限指定为“schwartz = lightsaber:*”,即是对于lightsaber类型可以执行所有行为,所以这里的wield行为是可以通过的。

后面的"winnebago:drive:eagle5"更为具体,即是“类型:行为:实例”,指可以对某类型的谋实例做某事。换一个更好理解的配置,如“user:delete:zhangsan”,即在user模块下可以对zhangsan来进行delete操作。

 

6.用户登出(注销)

//执行登出(注销)
currentUser.logout();

 使用Subject的logout方法来执行登出操作,一般在应用中来使用户退出系统。

上面就是整个Shiro的测试样例代码的讲解。在上面的代码中,只有登录和登出的写法使我们可以在项目中直接使用的,而权限判定等一般在项目中使用声明(注解、配置)的方式来进行判定,不会使用样例程序的硬编码方式判定。

最后,执行以下main方法,观察控制台打印的日志信息

分享到:
评论

相关推荐

    Shiro HelloWorld.7z

    这个“Shiro HelloWorld”案例可能包含了创建一个简单的用户,定义一个角色,分配一个权限,然后进行登录、权限检查和登出的操作。通过这个案例,开发者可以快速上手 Shiro,并理解其核心功能。 学习 Shiro 的好处...

    尚硅谷Shiro视频教程

    尚硅谷_Shiro_HelloWorld · 03.尚硅谷_Shiro_集成 Spring · 04.尚硅谷_Shiro_工作流程(1) · 05.尚硅谷_Shiro_DelegatingFilterProxy · 06. 尚硅谷_Shiro_权限 URL 配置细节 · 07. 尚硅谷_Shiro_认证思路...

    shiro的helloworld

    通过"shiro的helloworld",我们可以了解到Shiro的基本使用方法,这只是一个起点,随着对Shiro的深入学习,可以实现更复杂的安全需求,如记住我功能、CSRF防护、安全管理等。在实际项目中,Shiro可以灵活地与其他技术...

    shiro helloworld(官网实例)

    在这个"Shiro HelloWorld"实例中,我们将深入理解 Shiro 的基本概念,并通过官网提供的示例代码进行实践。 1. **Shiro 认证**: Shiro 提供了身份验证(Authentication)机制,确保用户的身份是真实的。在 Shiro ...

    Shiro简易实例:HelloWorld

    在本资源中,我们有一个名为"Shiro简易实例:HelloWorld"的项目,它将引导你了解如何在实际应用中使用Shiro进行基础的安全设置。 首先,我们需要理解Shiro的基本概念: 1. **身份验证(Authentication)**:确认...

    Spring Boot整合Shiro搭建权限管理系统.docx

    ### Spring Boot整合Shiro搭建权限管理系统 #### 一、Spring Boot入门 在开始介绍如何使用Spring Boot整合Shiro搭建权限管理系统之前,我们首先简要回顾一下Spring Boot的基础知识。 ##### 1. 新建一个Maven工程 ...

    shiro 入门 hello world

    这个"shiro 入门 hello world"项目可能包含了上述步骤的一个简单实现,从创建基本的认证和授权逻辑开始,让你快速了解Shiro的用法。通过查看和运行这个项目,你可以更好地理解Shiro框架的基础概念和实际应用。在实际...

    从实例入手Shiro并实现HellloWorld示例源码.zip

    这就是一个简单的 Shiro "Hello World" 示例,展示了如何配置 Shiro、创建 Realm 以及进行用户认证和授权。在实际项目中,你可以根据需求扩展 Realm,实现更复杂的认证和授权逻辑,同时利用 Shiro 的其他功能,如...

    Shiro学习第一式身份验证1(HelloWorld)

    在“Shiro学习第一式身份验证1(HelloWorld)”中,我们将探讨如何通过 Shiro 进行基本的身份验证设置,实现一个简单的 "Hello, World!" 示例。 1. **Shiro 框架介绍**: Apache Shiro 是一款轻量级的安全框架,它...

    Spring Boot整合Shiro搭建权限管理系统

    在本文中,我们将探讨如何利用Spring Boot和Apache Shiro构建一个权限管理系统。Spring Boot以其便捷的启动和配置方式,使得快速开发变得简单。而Shiro则是一个轻量级的安全框架,用于实现用户认证和授权。 首先,...

    Spring Boot整合Shiro搭建权限管理系统 (2).docx

    Spring Boot 整合 Apache Shiro 搭建权限管理系统是一个常见的实践,用于构建安全的Web应用程序。Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,简化了处理安全性的工作。...

    Shiro安全开源框架的介绍

    Apache Shiro是一个开源的安全框架,它为Java应用提供了一套全面的安全功能,从用户认证到...通过教程的学习,学员可以掌握Shiro的高级架构、HelloWorld程序的配置以及如何在项目中实际应用Shiro进行身份认证、授权等。

    springboot-shiro认证系统框架--成型框架

    - Shiro是一个强大且易用的Java安全框架,处理认证、授权、会话管理和加密等安全相关任务。 - 认证:验证用户身份,即"你是谁"。 - 授权:确定用户可以访问哪些资源,即"你能做什么"。 - 会话管理:支持跨请求的...

    SpringBoot整合Shiro与Thymeleaf-权限管理实战视频

    ### SpringBoot整合Shiro与Thymeleaf-权限管理实战 #### 一、Spring Boot简介 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目标是简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式(默认...

    Shiro从入门到集群搭建

    1. **Shiro入门**:通常从一个简单的"Hello, World!"程序开始,创建一个Shiro配置,定义Realm,并设置认证和授权规则。Shiro提供了一系列的注解和API,使得权限控制变得直观。例如,我们可以使用`@...

    shiro 教程

    Apache Shiro是一个开源的权限框架,用于Java应用程序的认证、授权、加密和会话管理。它易于使用,直观,其设计哲学是通过提供简单、直观的API来简化身份验证和授权。 ### 权限管理基础 权限系统的核心可以分为两个...

    Apache Shiro 开发使用手册

    Apache Shiro 是一个轻量级且易于使用的 Java 安全框架,它专注于提供认证、授权、加密和会话管理功能,适用于多种类型的Java应用程序。Shiro 的设计目标是简化安全管理的实现,使得开发者能更专注于业务逻辑,而...

    Java8新特性&Shiro&NIO&Redis分享

    - 无参数、无返回值:`() -&gt; System.out.println("Hello World!")` - 有参数、无返回值:`(int x) -&gt; System.out.println(x)` - 有参数、有返回值:`(int x, int y) -&gt; x + y` #### 方法引用 方法引用是Lambda...

    从零开始学Spring Boot

    1.3 spring boot起步之Hello World 1.4 Spring Boot返回json数据 1.5 Spring Boot热部署 1.6 Spring Boot使用别的json解析框架 1.7 全局异常捕捉 1.8 Spring Boot datasource - mysql 1.9 JPA - Hibernate 1.10 使用...

Global site tag (gtag.js) - Google Analytics