# Shiro

# 简介

# 功能介绍

  • 认证 (登录)Authentication
  • 授权(权限管理)Authorization
  • 数据加密(用户名和密码)Cryptography
  • 会话管理(session)sessionManagement
  • Web集成 Web Support
  • 缓存技术 Caching
  • Subject

    实体,代表当前用户,方便交互,实际功能逻辑是由SecurityManager实现

  • SecurityManager

    安全管理器,负责所有与安全相关的操作,是Shiro的核心,负责与Shiro的其他组件进行交互

  • Realm

    Shiro从Realm获取安全数据(如用户,角色,权限),数据源,需要我们自己实现并提供给框架

  • Authenticator

    负责身份验证,提供接口,需要我们自己实现并提供给框架

  • Authorizer

    负责权限验证,提供接口,需要我们自己实现并提供给框架

  • SessionManager

    会话管理器,不仅仅可以在Web环境中使用,也可以在普通javaSE中使用

  • SessionDAO

    所有会话的CRUD功能

  • CacheManager

    缓存控制器,来管理用户,角色,权限等的缓存

  • Cryptography

    密码模块,提供了一些常见的加密组件用于加密和解密

# Shiro实现用户认证

  1. Subject:用户主体(把操作交给SecurityManager)
  2. SecurityManager:安全管理器(关联Realm)
  3. Realm:Shiro 拓展鉴权和认证的桥梁

# 实现过程

在这里我们基于SpringBoot进行整合,以Maven项目作为示例

# 导入相关Shiro和SpringBoot的依赖包

<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
</dependency>
1
2
3
4
5
6

# 编写自定义Realm

在Shiro中,主要分为两块重要部分,一个是认证,一个是授权

创建一个MyRealm类,并继承AuthorizingRealm

重写doGetAuthenticationInfodoGetAuthorizationInfo方法

doGetAuthorizationInfo //执行授权逻辑 doGetAuthenticationInfo //执行认证逻辑

package com.qm.shiro;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * Copyright © 2018浅梦工作室}. All rights reserved.
 *
 * @author 浅梦
 * @date 2018/12/20 23:41
 * @Description: Realm
 */
public class MyRealm extends AuthorizingRealm {

    /**
     * 执行授权逻辑
     *
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行授权逻辑");
        return null;
    }

    /**
     * 执行认证逻辑
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行认证逻辑");
        return null;
    }
}

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

注意:

这两个方法名字实在长的太像了,请仔细观察。

# 编写ShiroConfig配置类

利用SpringBoot依赖配置类的特性,编写Shiro的配置类ShiroConfig

  1. 创建ShiroConfig类
  2. 注入MyRealm
  3. 注入DefaultWebSecurityManager
  4. 注入ShiroFilterFactoryBean
  5. 在ShiroFilterFactoryBean中添加拦截设置
package com.qm.shiro;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Copyright © 2018浅梦工作室}. All rights reserved.
 *
 * @author 浅梦
 * @date 2018/12/20 23:36
 * @Description: Shiro配置类
 */
@Configuration
public class ShiroConfig {

    /**
     * 创建Realm
     */
    @Bean
    public MyRealm getMyRealm() {
        return new MyRealm();
    }

    /**
     * 创建DefaultWebSecurityManager
     */
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 关联Realm
        securityManager.setRealm(myRealm);
        return securityManager;
    }


    /**
     * 创建ShiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 1.设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 2.添加Shiro内置过滤器
        /**
         * Shiro内置过滤器,可以实现权限相关的拦截
         *      常用的过滤器:
         *      anon:无需认证
         *      authc:必须认证才可以访问
         *      user:如果使用rememberMe(记住我)的功能可以直接访问
         *      perms:该资源必须得到资源权限才可以访问
         *      role:该资源必须得到角色权限才可以访问
         */
        Map<String,String> filterMap = new LinkedHashMap<>();
        // 登录方法不需要认证,所以添加anon。
        filterMap.put("/login","anon");
        // hello需要认证(登录)后才可以访问,所以加上authc。
        filterMap.put("/hello","authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

        return shiroFilterFactoryBean;
    }


}
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

# 一个基本的Shiro搭建完成

搭建好后,基于这样一个Shiro环境进行拓展认证和授权。

最近更新: 2019/10/17 上午4:20:42