Shiro 安全框架
Posted 抽象带狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro 安全框架相关的知识,希望对你有一定的参考价值。
Shiro 安全框架(一)
什么是安全框架?
安全框架主要的作用就是对用户进行身份验证,合法用户的授权,权限的管理等相关安全管理。而目前主流的安全框架有:Shiro 和 Spring Security 两个框架。
Shiro简介
由 Java 开发的安全框架,简单易学,功能强大。
框架组成
图解:
在上图可以看到主要分为三个部分
- Subject 主体(用户,第三方等与程序对接的会话主体)
- Security Manager 安全核心(Shrio 的核心功能)
- Cryptography 密码器(主要用于加密)
而框架最重要的一块就是 Security Manager,这一块主要负责的就是各种权限验证,权限授权,权限管理。。。等安全业务。
第一个用户验证案例(无数据库)
构建 maven 项目,导入 shiro 依赖,并在 resources 下创建 shiro.ini 文件,作为本地数据。
shiro.ini:
[users]
zhangsan=123
xiaohong=45678
TestAutenticator.java:
public class TestAuthenticator
public static void main(String[] args)
// 1.创建安全管理器 securityManager,可以使用子类 DefaultSecurityManager 来实现。
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 2.给安全管理器配置权限数据 realm,用 IniRealm 来指定 ini 文件
securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
// 3.SecurityUtils 使用全局安全管理工具,并指定具体的安全管理器
SecurityUtils.setSecurityManager(securityManager);
// 4.关键对象,Subject 主体
Subject subject = SecurityUtils.getSubject();
// 5.创建令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
// 6.开始验证令牌,由于没有返回值,所以我们需要try。。。catch。。。,如果验证成功则不报错,验证不成功则会报错。
try
// 开始验证
System.out.println("认证状态"+subject.isAuthenticated()); // 查看 subject 的验证状态是否成功
subject.login(token);
System.out.println("认证状态"+subject.isAuthenticated()); // 查看 subject 的验证状态是否成功
catch (IncorrectCredentialsException e)
e.printStackTrace();
System.out.println("认证失败:密码错误");
catch (UnknownAccountException e)
e.printStackTrace();
System.out.println("认证失败:用户名错误");
验证流程分析
主要是分为两个部分:
- 用户名验证
- 密码校验
经过源码分析,得出总结:
AuthenticatingRealm 认证realm doGetAuthticationInfo()
AuthorizingRealm 授权realm doGetAuthorizationInfo()
所以我们要实现连接数据库中的数据,那我们的自定义类必须继承一个类——AuthorizingRealm
因为 AuthenticatingRealm
继承了 AuthorizingRealm
,并且以上两个方法都是抽象方法,所以我们只要自定义的 Realm 类只要继承 AuthorizingRealm
就可以重写两个方法的具体实现。达到自定义 realm。
AuthorizingRealm 这个抽象类以及它父类(AuthenticatingRealm)给我们提供了两个方法
- doGetAuthorizationInfo 获取授权信息
- doGetAuthenticationInfo 获取认证信息
以上是关于Shiro 安全框架的主要内容,如果未能解决你的问题,请参考以下文章