下面是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”案例可能包含了创建一个简单的用户,定义一个角色,分配一个权限,然后进行登录、权限检查和登出的操作。通过这个案例,开发者可以快速上手 Shiro,并理解其核心功能。 学习 Shiro 的好处...
尚硅谷_Shiro_HelloWorld · 03.尚硅谷_Shiro_集成 Spring · 04.尚硅谷_Shiro_工作流程(1) · 05.尚硅谷_Shiro_DelegatingFilterProxy · 06. 尚硅谷_Shiro_权限 URL 配置细节 · 07. 尚硅谷_Shiro_认证思路...
通过"shiro的helloworld",我们可以了解到Shiro的基本使用方法,这只是一个起点,随着对Shiro的深入学习,可以实现更复杂的安全需求,如记住我功能、CSRF防护、安全管理等。在实际项目中,Shiro可以灵活地与其他技术...
在这个"Shiro HelloWorld"实例中,我们将深入理解 Shiro 的基本概念,并通过官网提供的示例代码进行实践。 1. **Shiro 认证**: Shiro 提供了身份验证(Authentication)机制,确保用户的身份是真实的。在 Shiro ...
在本资源中,我们有一个名为"Shiro简易实例:HelloWorld"的项目,它将引导你了解如何在实际应用中使用Shiro进行基础的安全设置。 首先,我们需要理解Shiro的基本概念: 1. **身份验证(Authentication)**:确认...
### Spring Boot整合Shiro搭建权限管理系统 #### 一、Spring Boot入门 在开始介绍如何使用Spring Boot整合Shiro搭建权限管理系统之前,我们首先简要回顾一下Spring Boot的基础知识。 ##### 1. 新建一个Maven工程 ...
这个"shiro 入门 hello world"项目可能包含了上述步骤的一个简单实现,从创建基本的认证和授权逻辑开始,让你快速了解Shiro的用法。通过查看和运行这个项目,你可以更好地理解Shiro框架的基础概念和实际应用。在实际...
这就是一个简单的 Shiro "Hello World" 示例,展示了如何配置 Shiro、创建 Realm 以及进行用户认证和授权。在实际项目中,你可以根据需求扩展 Realm,实现更复杂的认证和授权逻辑,同时利用 Shiro 的其他功能,如...
在“Shiro学习第一式身份验证1(HelloWorld)”中,我们将探讨如何通过 Shiro 进行基本的身份验证设置,实现一个简单的 "Hello, World!" 示例。 1. **Shiro 框架介绍**: Apache Shiro 是一款轻量级的安全框架,它...
在本文中,我们将探讨如何利用Spring Boot和Apache Shiro构建一个权限管理系统。Spring Boot以其便捷的启动和配置方式,使得快速开发变得简单。而Shiro则是一个轻量级的安全框架,用于实现用户认证和授权。 首先,...
Spring Boot 整合 Apache Shiro 搭建权限管理系统是一个常见的实践,用于构建安全的Web应用程序。Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,简化了处理安全性的工作。...
Apache Shiro是一个开源的安全框架,它为Java应用提供了一套全面的安全功能,从用户认证到...通过教程的学习,学员可以掌握Shiro的高级架构、HelloWorld程序的配置以及如何在项目中实际应用Shiro进行身份认证、授权等。
- Shiro是一个强大且易用的Java安全框架,处理认证、授权、会话管理和加密等安全相关任务。 - 认证:验证用户身份,即"你是谁"。 - 授权:确定用户可以访问哪些资源,即"你能做什么"。 - 会话管理:支持跨请求的...
### SpringBoot整合Shiro与Thymeleaf-权限管理实战 #### 一、Spring Boot简介 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目标是简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式(默认...
1. **Shiro入门**:通常从一个简单的"Hello, World!"程序开始,创建一个Shiro配置,定义Realm,并设置认证和授权规则。Shiro提供了一系列的注解和API,使得权限控制变得直观。例如,我们可以使用`@...
Apache Shiro是一个开源的权限框架,用于Java应用程序的认证、授权、加密和会话管理。它易于使用,直观,其设计哲学是通过提供简单、直观的API来简化身份验证和授权。 ### 权限管理基础 权限系统的核心可以分为两个...
Apache Shiro 是一个轻量级且易于使用的 Java 安全框架,它专注于提供认证、授权、加密和会话管理功能,适用于多种类型的Java应用程序。Shiro 的设计目标是简化安全管理的实现,使得开发者能更专注于业务逻辑,而...
- 无参数、无返回值:`() -> System.out.println("Hello World!")` - 有参数、无返回值:`(int x) -> System.out.println(x)` - 有参数、有返回值:`(int x, int y) -> x + y` #### 方法引用 方法引用是Lambda...
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 使用...