b1cat`s

关于shiro的简单学习

Word count: 1.3kReading time: 6 min
2020/04/16

关于shiro的简单学习

shiro

apache shiro是一个强大的且易用的Java安全框架,它执行身份验证、授权、加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序—从最小的移动应用程序到最大的web和企业应用程序。

Apache Shiro从设计的第一天起就支持任何应用,从最小的命令行应用到最大的web集群应用。尽管在这个教程中我们创建了一个简单的app,但这些方式也在其他地方也同样适用。

Github:https://github.com/apache/shiro

简单学习

shiro三大核心组件:

  1. Subject , 一般指“用户”,泛指所有与之交互的对象。

    在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表某个用户,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。

  2. SecurityManager, 用于管理所有的Subjectshiro的核心类,用于调度各种Shiro框架的服务。

  3. 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>

<!-- This plugin is only to test run our little application. It is not
needed in most Shiro-enabled applications: -->
<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>
<!-- Shiro uses SLF4J for logging. We'll use the 'simple' binding
in this example app. See http://www.slf4j.org for more info. -->
<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

image-20200416234611750

简单使用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
# ========
# Tutorial INI config
#
# User/pass
# =========

# -----------
# 用户名 = 密码,角色
# username = password, role1, role2, ...,roleN
#
# ---------------

[users]
root = root, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr =vespa, goodguy, schwartz

# 指定权限
# roleName = perm1, perm2 ....
[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(); //解析ini返回实例

SecurityUtils.setSecurityManager(secm); //设置单例模式

//在任意环境下都可以使用通过该代码获取当前用户(与之交互的主体)
Subject currentUser = SecurityUtils.getSubject();

Session session = currentUser.getSession();
// System.out.println(session);
log.info( "User session : [" + session + "]" ); //打印session对象

if(!currentUser.isAuthenticated()){
UsernamePasswordToken token = new UsernamePasswordToken("guest","guest");
//UsernamePasswordToken token2 = new UsernamePasswordToken("root", "root");

token.setRememberMe(true); //记住我
// currentUser.login(token);
}

//打印当前用户名
log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );
// log.info("User role is [" + currentUser.getRole() + "]" );

System.exit(0);
}

输出

image-20200416235903239

CATALOG
  1. 1. 关于shiro的简单学习
    1. 1.1. shiro
    2. 1.2. 简单学习
      1. 1.2.1. 简单构建:
      2. 1.2.2. 简单使用shiro认证: