关于shiro的简单学习 shiro apache shiro是一个强大的且易用的Java安全框架,它执行身份验证、授权、加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序—从最小的移动应用程序到最大的web和企业应用程序。
Apache Shiro从设计的第一天起就支持任何应用 ,从最小的命令行应用到最大的web集群应用。尽管在这个教程中我们创建了一个简单的app,但这些方式也在其他地方也同样适用。
Github:https://github.com/apache/shiro
简单学习 shiro三大核心组件:
Subject
, 一般指“用户”,泛指所有与之交互的对象。
在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表某个用户,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。
SecurityManager
, 用于管理所有的Subjectshiro的核心类,用于调度各种Shiro框架的服务。
Realms:用户的信息认证器和用户的权限认证器,由我们实现Realms来自定义权限管理规则。
简单构建: 使用maven构建:
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 <?xml version="1.0" encoding="UTF-8" ?> <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" > <modelVersion > 4.0.0</modelVersion > <groupId > org.apache.shiro.tutorials</groupId > <artifactId > shiro-tutorial</artifactId > <version > 1.0.0-SNAPSHOT</version > <name > First Apache Shiro Application</name > <packaging > jar</packaging > <properties > <project.build.sourceEncoding > UTF-8</project.build.sourceEncoding > </properties > <build > <plugins > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-compiler-plugin</artifactId > <version > 2.0.2</version > <configuration > <source > 1.5</source > <target > 1.5</target > <encoding > ${project.build.sourceEncoding}</encoding > </configuration > </plugin > <plugin > <groupId > org.codehaus.mojo</groupId > <artifactId > exec-maven-plugin</artifactId > <version > 1.1</version > <executions > <execution > <goals > <goal > java</goal > </goals > </execution > </executions > <configuration > <classpathScope > test</classpathScope > <mainClass > Tutorial</mainClass > </configuration > </plugin > </plugins > </build > <dependencies > <dependency > <groupId > org.apache.shiro</groupId > <artifactId > shiro-core</artifactId > <version > 1.1.0</version > </dependency > <dependency > <groupId > org.slf4j</groupId > <artifactId > slf4j-simple</artifactId > <version > 1.6.1</version > <scope > test</scope > </dependency > </dependencies > </project >
编写源码测试:
src\main\java\Tutorial.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.session.Session;import org.apache.shiro.subject.Subject;import org.apache.shiro.util.Factory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Tutorial { private static final transient Logger log = LoggerFactory.getLogger(Tutorial.class); public static void main (String[] args) { log.info("My First Apache Shiro Application" ); System.exit(0 ); } }
mave编译运行:
mvn compile exec:java
简单使用shiro认证: 虽然我们可以直接实例化一个SecurityManager类,但是Shiro的SecurityManager
有很多的配置选项和内部组件,使得用Java源代码来配置非常痛苦。更容易和灵活的方式是通过基于文本的配置。
为实现这个目标,Shiro提供了一个默认“common denominator”来实现基于文本 INI 的配置。人们已经厌倦了使用笨重的XML文件,在加上INI文件容易阅读,易于使用,并且依赖较少。你将看到一个简单的对象图,可以有效的使用INI配置简单对象图,就像SecurityManager
。
src\main\resources\shiro.ini
用来放置shiro认证需要的一些静态的用户账号和角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [users] root = root, adminguest = guest, guestpresidentskroob = 12345 , presidentdarkhelmet = ludicrousspeed, darklord, schwartzlonestarr =vespa, goodguy, schwartz[roles] admin = * schwartz = lightsabe:*goodguy = winnerbago:drive:eagle5
简单使用:
src\main\java\Tutorial.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 public static void main (String[] args) { log.info("My first apache shiro application" ); Factory<SecurityManager> factory = new IniSecurityManagerFactory ("classpath:shiro.ini" ); SecurityManager secm = factory.getInstance(); SecurityUtils.setSecurityManager(secm); Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); log.info( "User session : [" + session + "]" ); if (!currentUser.isAuthenticated()){ UsernamePasswordToken token = new UsernamePasswordToken ("guest" ,"guest" ); token.setRememberMe(true ); } log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." ); System.exit(0 ); }
输出