Shiro权限管理


shiro概述

shiro发音shee-roh,是Apache下的一开源项目创始人来自日本。shiro是一个安全框架,用于身份验证和授权,基于以下四大模块提供了一些通俗易懂的API接口:

  • Authentication - 提供用户识别,也可叫login(我是谁?)
  • Authorization - 权限控制 (我能做什么?)
  • Cryptography - 保护和隐藏数据
  • Session Management - Session会话管理

核心概念

Subject

Sbuject一词在信息安全领域意思大致为“the currently executing user”, 这里可以理解为User但是又不限于User,它可以是第三方进程、守护进程账号等类似的任何东西。程序中获取Subject的方法:

import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();

获取到Subject后,90%的事情你都可以通过Shiro来完成,比如:登录、退出、访问Session、授权检查等。

SecurityManager

SecurityManager是整个Shiro的核心。一图胜千言:
启动一个SecurityMananger实例,对于web application项目需要在web.xml 里面配置Filter即可:

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>
        org.apache.shiro.web.servlet.IniShiroFilter
    </filter-class>
    <!-- no init-param means load the INI config
        from classpath:shiro.ini --> 
</filter>

非web项目目前官网采用INI配置文件进行配置:

[main]
cm = org.apache.shiro.authc.credential.HashedCredentialsMatcher
cm.hashAlgorithm = SHA-512
cm.hashIterations = 1024
# Base64 encoding (less text):
cm.storedCredentialsHexEncoded = false
[users]
jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB

INI文件包含两部分:main和users.

  • [main] 用于配置SecurityManager对象或SecurityManager使用的任何对象(如Realms)
  • [users] 定义一个用户静态列表,便于测试或应用。 加载shiro.ini配置文件:
    //1. Load the INI configuration
    Factory<SecurityManager> factory =
    new IniSecurityManagerFactory("classpath:shiro.ini");
    //2. Create the SecurityManager
    SecurityManager securityManager = factory.getInstance();
    //3. Make it accessible
    SecurityUtils.setSecurityManager(securityManager);
    

Realms

Realms在Shiro和应用程序数据安全之间扮演着桥梁、连接的角色(A Realm acts as the ‘bridge’ or ‘connector’ between Shiro and your application’s security data.)。 通俗的讲相当与扮演了一个安全的DAO层,可以控制用户对数据库的操作、查询域。