Shiro

一、Shiro

 1、shiro介绍

    Apache Shiro 是一个功能强大,易于使用的Java安全框架,他执行认证、授权、加密、会话管理等功
  能,使用Shiro易于理解的API,使你能够轻松的保护任何应用,如移动端应用,大型web应用以及企业级
  应用.
    Shiro可以非常容易的开发出足够好的应用,不仅可以用在JavaSE环境,也可以用在JavaEE环境

 2、shiro整体功能

   Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份

   Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限

   Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中

   Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储

   Web Support:Web 支持,可以非常容易的集成到 Web 环境

   Caching:缓存,比如用户登录后,其用户信息、拥有的角色 / 权限不必每次去查数据库,这样可以提高效率

   Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了

 3、核心API

   Subject:主体,代表了当前 “用户”,获取用户传递过来的数据,然后传递给SecurityManager: 安全管理器

   SecurityManager: 安全管理器(Shiro的核心),将用户传递过来的认证信息和数据库中保存的信息进行校验

   Realm:域,Shiro的Realm主要从数据库中获取安全数据(如用户、角色、权限)通过方法传递给SecurityManager安全管理器进行数据验证

 4、内部架构图

在这里插入图片描述
   Subject:当前用户主体(可以使任何与应用交互的用户)

   SecurityManager: 是Shiro的心脏;所有具体的交互都通过SecurityManager 进行控制;它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理

   Authenticator[ɔːˈθɛntɪkeɪtə]:认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,可以自定义实现

   Authrizer:授权器,或者访问控制器

   Realm:可以有1个或多个Realm,是安全实体数据源,Shiro不知道你的用户 / 权限存储在哪及以何种格式存储,所以我们一般在应用中都需要实现自己的 Realm

   SessionManager: 会话管理器

   SessionDAO: session可以保存到数据库中或者是缓存中,或者是redis中,我们可以实现自己的SessionDAO对数据进行CRUD

   CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能

   Cryptography [krɪpˈtɒɡrəfi]:密码模块,Shiro提高了一些常见的加密组件用于如密码加密

 5、核心名词介绍

   身份验证就是我们通常说的登录,一般使用用户名/密码这样的常见组合,我们shiro中使用:
    principals(用户名):身份,可以是任何东西,如用户名,邮箱等唯一即可。
    credentials:证明 / 凭证,即只有主体知道的安全值,如密码 / 数字证书等常见的 principals 和 credentials 组合就是用户名 / 密码了
   Subject: 主体
   Realm : 验证主体的数据源

 6、Shiro核心对象介绍

   Md5Hash: MD5密码加密类

   DelegatingFilterProxy:代理类对象,存在spring-web包中,其作用就是一个filter的代理,用这个类的好处是可以通过spring容器来管理filter的生命周期

   ShiroFilterFactoryBean:ShiroFilter:权限控制的核心配置对象有Spring IOC容器创建,交给DelegatingFilterProxy代理

   DefaultWebSecurityManager: Shiro关于web的安全管理器对象

   AuthorizingRealm: 自定义Realm需要被继承的类,用于自定义Realm

   HashedCredentialsMatcher: 用于密码加密的类

   DefaultWebSessionManager: web的会话管理类

   UsernamePasswordToken: 封装用户名密码

   SimpleAuthenticationInfo:Realm认证方法的返回对象,封装从数据库查询出来认证的安全数据

   SimpleAuthorizationInfo:Realm授权方法的返回对象,封装从数据库查询出来授权的安全数据

二、Shiro快速入门

   shiro.ini 文件

[users]
# # 用户名=密码,角色 root: 用户名 secret:密码 admin: 角色
root = secret, admin
# 用户名=密码,角色
guest = guest, guest
# 用户名=密码,角色
presidentskroob = 12345, president
# 用户名=密码,角色,角色
darkhelmet = ludicrousspeed, darklord, schwartz
# 用户名=密码,角色,角色
lonestarr = vespa, goodguy, schwartz
# -----------------------------------------------------------------------------
[roles]
# 角色= * *: 通配符代表所有权限
admin = *
# The 'schwartz' role can do anything (*) with any lightsaber:
schwartz = lightsaber:*
# The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with
# license plate 'eagle5' (instance specific id)
goodguy = winnebago:drive:eagle5

   入门代码

public static void main(String[] args) {
// 创建安全管理器 SecurityManager
Factory<SecurityManager> factory = new
IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
// 将安全管理器设置到SecurityUtils中
SecurityUtils.setSecurityManager(securityManager);
// 获取实体
Subject currentUser = SecurityUtils.getSubject();
// 获取会话
Session session = currentUser.getSession();
session.setAttribute("someKey", "aValue");
String value = (String) session.getAttribute("someKey");
if (value.equals("aValue")) {
log.info("Retrieved the correct value! [" + value + "]");
}
// 判断是否认证
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr",
"vespa");
token.setRememberMe(true);
try {
currentUser.login(token);
} 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 (AuthenticationException ae) {
//unexpected condition? error?
}
}
//
log.info("User [" + currentUser.getPrincipal() + "] logged in
successfully.");
// 判断当前用户有哪些角色
if (currentUser.hasRole("schwartz")) {
log.info("May the Schwartz be with you!");
} else {
log.info("Hello, mere mortal.");
}
// 判断当前用户是否有lightsaber角色的weild权限
if (currentUser.isPermitted("lightsaber:weild")) {
log.info("You may use a lightsaber ring. Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
// 判断当前用户是否有winnebago角色的drive权限的eagle5操作
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!");
}
// 登出
currentUser.logout();
}

三、加密技术

 1、数据加密

所谓数据加密(Data Encryption)技术是指将一个信息(或称明文,plain text)经过加密钥匙
(Encryption key)及加密函数转换,变成无意义的密文(cipher text),而接收方则将此密文经过
解密函数、解密钥匙(Decryption key)还原成明文,加密技术是网络安全技术的基石

 2、常见加密方式

  2.1 对称加密

对称加密算法是应用较早的加密算法,又称为共享密钥加密算法。在对称加密算法中,使用的密钥只
有一个,发送和接收双方都使用这个密钥对数据进行加密和解密.这就要求加密和解密方事先都必须
知道加密的密钥.
在这里插入图片描述

  2.2 非对称加密

非对称加密算法,又称为公开密钥加密算法。它需要两个密钥,一个称为公开密钥 (public key),即公
钥,另一个称为私有密钥 (private key),即私钥。因为加密和解密使用的是两个不同的密钥,所以这种
算法称为非对称加密算法.
在这里插入图片描述

 3、常见的摘要算法

  3.1 MD5加密

MD5是一种摘要算法,它的典型应用是对一段信息产生信息摘要,以防止被篡改
public static final byte[] computeMD5(byte[] content) {
	try {
		MessageDigest md5 = MessageDigest.getInstance("MD5");
		return md5.digest(content);
	} catch (NoSuchAlgorithmException e) {
		throw new RuntimeException(e);
	}
}

@RequestMapping(value = "/register",method = RequestMethod.POST)
    public String registry(String username,String password){
        SysUsers sysUsers = new SysUsers();
        sysUsers.setUsername(username);


        String salt = "admin";
        Md5Hash md5Hash = new Md5Hash(password,"admin",1024);
        String s = md5Hash.toString();
        sysUsers.setPassword(s);
        sysUsers.setSalt(salt);
        System.out.println(sysUsers.toString());
        sysUsersService.registry(sysUsers);

        return "redirect:/jumpLogin";
    }

  3.2 SHA-1加密

MD5是一种摘要算法,它的典型应用是对一段信息产生信息摘要,以防止被篡改
SHA-1 是和 MD5 一样流行的 消息摘要算法,然而 SHA-1 比 MD5 的 安全性更强。对于长度小于 2 ^
64 位的消息
SHA-1 会产生一个 160 位的 消息摘要。基于 MD5、SHA-1 的信息摘要特性以及 不可逆,可以被应用在
检查文件完整性以及数字签名等场景
public static byte[] computeSHA1(byte[] content) {
	try {
		MessageDigest sha1 = MessageDigest.getInstance("SHA1");
		return sha1.digest(content);
	} catch (NoSuchAlgorithmException e) {
		throw new RuntimeException(e);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值