1.shiro简介
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
2.主要功能
三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
![](https://img2018.cnblogs.com/blog/858186/201810/858186-20181029105025500-1472954056.png)
3.Shiro入门Helloword
步骤:
3.1.构建基本maven项目
3.2.添加必要的maven依赖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.wfd360.shiro-demo</groupId> 8 <artifactId>shiro-demo</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <dependencies> 11 <dependency> 12 <groupId>org.apache.shiro</groupId> 13 <artifactId>shiro-core</artifactId> 14 <version>1.3.2</version> 15 </dependency> 16 17 </dependencies> 18 19 </project>
3.3.添加账号信息(模拟数据库账号)
3.4.helloWord程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.wfd360.shiro; 2 3 import org.apache.shiro.SecurityUtils; 4 import org.apache.shiro.authc.AuthenticationException; 5 import org.apache.shiro.authc.UsernamePasswordToken; 6 import org.apache.shiro.config.IniSecurityManagerFactory; 7 import org.apache.shiro.mgt.SecurityManager; 8 import org.apache.shiro.subject.Subject; 9 import org.apache.shiro.util.Factory; 10 import org.slf4j.Logger; 11 import org.slf4j.LoggerFactory; 12 13 14 /** 15 * address: www.wfd360.com 16 */ 17 public class HelloShiro { 18 private static Logger logger = LoggerFactory.getLogger(HelloShiro.class); 19 20 public static void main(String[] args) { 21 //IniSecurityManagerFactory方法在1.4.0中被注解标志为不建议使用 22 // 读取配置文件,初始化SecurityManager工厂 23 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 24 //获取securityManager 实例 25 SecurityManager securityManager = factory.getInstance(); 26 //把securityManager实例绑定到SecurityUtils 27 SecurityUtils.setSecurityManager(securityManager); 28 //得到当前执行的用户 29 Subject subject = SecurityUtils.getSubject(); 30 //认证实体,当前进来的用户 31 // 创建token令牌,用户名/密码 32 UsernamePasswordToken token = new UsernamePasswordToken("jack", "12345"); 33 //身份认证 34 try { 35 subject.login(token); 36 logger.info("登录成功!"); 37 } catch (AuthenticationException e) { //login的接口函数 38 //void login(AuthenticationToken var1) throws AuthenticationException;所以直接抓AuthenticationException异常即可 / 39 // 身份认证失败即抛出此异常 40 logger.info("登录失败!"); 41 e.printStackTrace(); 42 } 43 //登出 44 subject.logout(); 45 } 46 }
3.5运行main方法测试。