更新时间:2021-07-29 16:47:56 来源:极悦 浏览961次
Shiro三个核心组件: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实现。
Hello Shiro
导入slf4j-api.jar,slf4j-logj12.jar,log4j.jar,shiro-core.jar包
在classpath下创建shiro.ini文件,文件内容如下表示用户名和密码
[users]
shiro = shiro
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Assert;
import org.junit.Test;
public class ShiroTest {
@Test
public void test() {
// 1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory<SecurityManager> factroy = new IniSecurityManagerFactory("classpath:shiro.ini");
// 2、得到SecurityManager实例并绑定给SecurityUtils
SecurityManager securityManager = factroy.getInstance();
SecurityUtils.setSecurityManager(securityManager);
// 3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("shiro", "shiro");
try {
// 4、登录,即身份验证
subject.login(token);
} catch (AuthenticationException e) {
// 5、身份验证失败
e.printStackTrace();
}
Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
// 6、退出
subject.logout();
}
}
1.需要读取classpath下的shiro.ini配置文件,并通过工厂类创建SecurityManage对象,最终将其放入SecurityUtils中,方便Shiro框架随时获取
2.通过SecurityUtils获取Subject(主体)对象,其实就是当前用户,只是叫法不同罢了
3.首先使用一个Username与Password来创建一个UsernamePasswordToken对象,然后通过这个Token对象调用Subject的login方法进行身份认证
4.当登录失败,可以使用AuthenticationException来捕获这个异常;当登录成功可以调用Subject对象的getPrincipal方法来获取Username,此时Shiro已经创建了一个Session
5.最后还是通过Subject对象的logout来注销本次Sesson
只需要知道以上几个Shiro核心成员的基本用法,Shiro就是你的了
其实,Shiro的调用流程也不难理解,如下图
通过Subject调用SecurityManager,通过SecurityManager调用Realm,这个Realm说白了其实就是提供用户信息的数据源,例如上例子中的shiro.ini就是配置用户信息的一种Realm方式,在Shiro中叫做IniRealm,除此之外,还提供了其他几种Realm:有PropertiesRealm、JdbcRealm、JndiLdapRealm、ActiveDirectoryRealm等,当然也可以定制Realm来满足业务需求。
在Web开发中使用Shiro
在web开发中,还需要导入shiro-web.jar包,然后在web.xml中添加一个Listener与一个Filter。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 添加Shiro监听器 -->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoader-Listener</listener-class>
</listener>
<!-- 添加Shiro过滤器 -->
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
实际上就是通过EnvironmentLoaderListener这个监听器来初始化SecurityManager,并通过ShiroFilter来完成认证认证与授权。
以上就是极悦小编介绍的"Shiro权限控制框架",希望对大家有帮助,想了解更多可查看Shiro视频教程。极悦在线学习教程,针对没有任何Java基础的读者学习,让你从入门到精通,主要介绍了一些Java基础的核心知识,让同学们更好更方便的学习和了解Java编程,感兴趣的同学可以关注一下。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习