shiro安全框架详解。面试必备

article/2025/10/7 16:11:53

shiro核心就是过滤器。

认证授权流程:
● 认证:对用户的身份进行检查(登录验证)
● 授权:对用户的权限进行检查(是否有对应的操作权限)
● 流程图:
在这里插入图片描述
权限管理
实现权限的动态分配,但还是不太灵活:
在这里插入图片描述

安全框架:
● 安全框架就是帮助我们在应用系统开发过程完成认证及授权的工作。
● 帮助我们完成用户身份认证及权限检查功能框架
● 常用的安全框架:
● shiro:Apache Shiro是一个功能强大并且易用的java安全框架(小而简单)
● spring Security:基于Spring的一个安全框架,依赖Spring。
● OAuth2:第三方授权登录(比如说王者可以微信登录和QQ)
● 自定义安全认证中心

shiro
● Apache Shiro是一个功能强大并且易用的java安全框架(小而简单)
● 可以完成用户认证,授权,密码及会话管理。
● 可以任何的应用系统中使用(主要针对单体项目的权限管理)

Shiro的工作原理:
shiro的核心功能:
在这里插入图片描述
● Authentication 认证,验证用户是否有相应的身份-登录认证;
● Authorization 授权,即权限验证,对已经通过认证的用户检查是否具有某个权限或者角色,从而控制是否能够进行某种操作。
● Session Managment 会话管理,用户在认证成功之后创建会话,在没有退出之前,当前用户的所有信息都会保存在这个会话中,可以是普通的javaSE应用,也可以是web应用。
● Cryptography 加密,对敏感信息进行加密处理,shiro就是提供这种加密机制的。
● 支持的特性:
● Web Support—Shiro提供了过滤器,可以通过过滤器拦截web请求来处理web应用的访问控制。
Caching 缓存支持。shiro可以缓存用户信息以及用户的角色权限信息,可以提高执行效率
Concurrency shiro支持多线程应用
Testing提供测试支持
Run As 允许一个用户以另一种身份去访问
Remeber Me 记住密码功能(但一般不会去用)
● 说明:Shiro是一个安全框架,不提供用户,权限的维护,(用户的权限管理需要我们自己去设计)
shiro核心三大组件:Subject,Security Manager ,Reaim
● Subject:表示待认证和授权的用户
● SecurityManager:它是Shiro框架的核心,Shiro就是通过Security Manager来进行内部实例的管理,并通过它来提供安全管理的各种服务。
Authenticator 认证器
Anthorizer,授权器
SessionManager,会话管理器
CacheManager,缓存管理器
● Reaim:相当于Shiro进行认证和授权的数据源,充当了Shiro与安全数据之间的‘桥梁’或者‘连接器’,也就是说,当对用户进行认证(登录)和授权(访问控制)验证时,Shiro会用应用配置的Reaim中查找用户以其权限信息。
● 工作流程图:
在这里插入图片描述
shiro配置
基于spring:

第一种:URL 级别粗粒度权限控制
配置 web.xml 的 shiroFilter 拦截 /*
在 spring 的 applicationContext*.xml 配置文件中配置同名 bean,配置
filterChainDefinitions 拦截控制规则
xxx.html* = anon (未登录可以访问) xxx.html* =authc (必须登录才能访问 ) xxx.html* = perms[权限] (需要特定权限才能访问) xxx.html* = roles[角色] (需要特定角色才能访问 )

第二种: 方法级别细粒度权限控制
在 spring 的 applicationContext*.xml 配置 spring aop 对 spring 管理 bean 对象开启 shiro 注解支持
@RequiresPermissions(权限) 需要特定权限才能访问
@RequiresRoles(角色) 需要特定角色才能访问
@RequiresAuthentication 需要认证才能访问

第三种:通过 shiro 自定义标签,实现页面元素显示控制
shiro:authenticated 登录后才能访问
<shiro:hasPermission name=“abc”> 需要特定权限才能访问
<shiro:hasRole name=“abc”> 需要特定角色才能访问

第四种:在程序中通过代码 判断用户是否具有指定权限( 不太常用 ,有代码侵入 )

在 Spring Boot 中整合 Shiro ,有两种不同的方案:

  1. 第一种就是原封不动的,将 SSM 整合 Shiro 的配置用 Java 重写一遍。
  2. 创建 Realm
  3. 接下来我们来自定义核心组件 Realm:

public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
if (!“javaboy”.equals(username)) {
throw new UnknownAccountException(“账户不存在!”);
}
return new SimpleAuthenticationInfo(username, “123”, getName());
}
}
在 Realm 中实现简单的认证操作即可,不做授权,授权的具体写法和 SSM 中的 Shiro 一样,不赘述。这里的认证表示用户名必须是 javaboy ,用户密码必须是 123 ,满足这样的条件,就能登录成功!

配置 Shiro
接下来进行 Shiro 的配置:

@Configuration
public class ShiroConfig {
@Bean
MyRealm myRealm() {
return new MyRealm();
}

@Bean
SecurityManager securityManager() {DefaultWebSecurityManager manager = new DefaultWebSecurityManager();manager.setRealm(myRealm());return manager;
}@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean() {ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();bean.setSecurityManager(securityManager());bean.setLoginUrl("/login");bean.setSuccessUrl("/index");bean.setUnauthorizedUrl("/unauthorizedurl");Map<String, String> map = new LinkedHashMap<>();map.put("/doLogin", "anon");map.put("/**", "authc");bean.setFilterChainDefinitionMap(map);return bean;
}

}
在这里进行 Shiro 的配置主要配置 3 个 Bean :

首先需要提供一个 Realm 的实例。
需要配置一个 SecurityManager,在 SecurityManager 中配置 Realm。
配置一个 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等。
配置登录和测试接口。
其中,ShiroFilterFactoryBean 的配置稍微多一些,配置含义如下:

setSecurityManager 表示指定 SecurityManager。
setLoginUrl 表示指定登录页面。
setSuccessUrl 表示指定登录成功页面。
接下来的 Map 中配置了路径拦截规则,注意,要有序。
这些东西都配置完成后,接下来配置登录 Controller:

@RestController
public class LoginController {
@PostMapping("/doLogin")
public void doLogin(String username, String password) {
Subject subject = SecurityUtils.getSubject();
try {
subject.login(new UsernamePasswordToken(username, password));
System.out.println(“登录成功!”);
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println(“登录失败!”);
}
}
@GetMapping("/hello")
public String hello() {
return “hello”;
}
@GetMapping("/login")
public String login() {
return “please login!”;
}
}

  1. 第二种就是使用 Shiro 官方提供的一个 Starter(死大特) 来配置,但是,这个 Starter 并没有简化多少配置。
  2. 创建工程,和上面的一样
    创建成功后,添加 shiro-spring-boot-web-starter ,这个依赖可以代替之前的 shiro-web 和 shiro-spring 两个依赖,pom.xml 文件如下:
org.springframework.boot spring-boot-starter-web org.apache.shiro shiro-spring-boot-web-starter 1.4.0 创建 Realm 这里的 Realm 和前面的一样,我就不再赘述。

配置 Shiro 基本信息
接下来在 application.properties 中配置 Shiro 的基本信息:

shiro.sessionManager.sessionIdCookieEnabled=true
shiro.sessionManager.sessionIdUrlRewritingEnabled=true
shiro.unauthorizedUrl=/unauthorizedurl
shiro.web.enabled=true
shiro.successUrl=/index
shiro.loginUrl=/login
配置解释:

第一行表示是否允许将sessionId 放到 cookie 中
第二行表示是否允许将 sessionId 放到 Url 地址拦中
第三行表示访问未获授权的页面时,默认的跳转路径
第四行表示开启 shiro
第五行表示登录成功的跳转页面
第六行表示登录页面
配置 ShiroConfig
@Configuration
public class ShiroConfig {
@Bean
MyRealm myRealm() {
return new MyRealm();
}
@Bean
DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(myRealm());
return manager;
}
@Bean
ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
definition.addPathDefinition("/doLogin", “anon”);
definition.addPathDefinition("/**", “authc”);
return definition;
}
}
这里的配置和前面的比较像,但是不再需要 ShiroFilterFactoryBean 实例了,替代它的是 ShiroFilterChainDefinition ,在这里定义 Shiro 的路径匹配规则即可。
基于javase应用-shiro的基本使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
springboot整合shrio:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/rXVkbe1R.shtml

相关文章

面试专题系列-Shiro

1.什么是shiro Apache Shiro 是 Java 的一个安全框架。使用 shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在 JavaSE环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存等。 2.Sh…

shiro(详解)

这里写自定义目录标题 什么是shiro什么是权限管理什么是身份认证什么是授权SubjectSecurityManagerAuthenticatorAuthorizerRealmSessionManagerSessionDAOCacheManagerCryptography面试题认证的开发1. 创建项目并引入依赖2. 引入shiro配置文件并加入如下配置 自定义Realm自定义…

【JAVA面试题整理】框架之Shiro

一、简单介绍一下Shiro框架 Apache Shiro是java的一个安全框架。使用shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。 三…

shiro总结

shiro主要内容: 1:SecurityUtils shiro提供的工具类,主要作用是获取 SecurityManager和Subject public abstract class SecurityUtils {private static SecurityManager securityManager;//获取Subjectpublic static Subject getSubject() {Subject subject ThreadContext.…

Java面试系列总结 :Shiro

1. 简单介绍一下Shiro框架 Apache Shiro是Java的一个安全框架。使用shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。 三个…

Shiro知识总结二

3. 与 Spring Boot 整合 3.1 框架整合 依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>o…

Shiro相关知识

1、Shiro功能概述 Apache Shiro是一个功能强大且易于使用的 Java 安全框架&#xff0c;可执行身份验证、授权、加密和会话管理。 主要功能&#xff1a; Authentication&#xff1a;身份认证。登录时验证身份信息。 Authorization&#xff1a;授权操作。访问控制的过程&…

Spring、SpringMVC、Shiro面试题

Tags : JavaEE,Spring,面试题发表时间&#xff1a; 2014-11-29 15:03:53 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 比如&#xff1a; 转自&#xff1a;Su的技术博客 原文地址&#xff…

Shiro知识总结一

1. 基础知识 1.1 什么是Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应…

Shiro总结面试问题

Shiro总结 Shiro可做哪些事&#xff1a; 认证、授权、加密、会话管理、与web集成、缓存等 最简单的Shiro应用是怎样运行的&#xff1a; 应用代码通过Subject来进行认证和授权&#xff0c;而Subject又委托给SecurityManager 我们需要给Shiro的SecurityManager注入Realm,从而让S…

python中socket进行多线程,利用 Socket怎么在Python项目中实现一个多线程并发功能...

利用 Socket怎么在Python项目中实现一个多线程并发功能 发布时间:2020-12-11 13:55:06 来源:亿速云 阅读:95 作者:Leah 这篇文章给大家介绍利用 Socket怎么在Python项目中实现一个多线程并发功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 1.S…

Jmeter多线程并发和压测结果分析

一、多线程并发 1. 线程组简介: (1). 线程数: 配置虚拟用户数量 (2). Ramp-Up时间:设置的虚拟用户数需要多长时间全部启动,如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。 (3). 循环次数 (4). 调度器-持续时间(秒),压测多长时间…

面试必问!多线程并发问题

多线程并发问题&#xff0c;基本是面试必问的。 大部分同学应该都知道Synchronized&#xff0c;Lock&#xff0c;部分同学能说到volatile、并发包&#xff0c;优秀的同学则能在前面的基础上&#xff0c;说出Synchronized、volatile的原理&#xff0c;以及并发包中常用的数据结…

实际场景中的多线程并发编程案例

目录 使用多线程的意义&#xff1a; CountDownLatch 案例一&#xff1a;多线程同步发起并发请求 案例二&#xff1a;rocketmq内&#xff0c;每个broker将自己注册到所有的nameserver时 案例三&#xff1a;利用异步线程实现同步请求 CompletableFuture 应用一&#xff1a…

【已解决】利用 Java 多线程并发编程提高数据处理效率

&#x1f389;工作场景中遇到这样一个需求&#xff1a;根据主机的 IP 地址联动更新其他模型的相关信息。需求很简单&#xff0c;只涉及一般的数据库联动查询以及更新操作&#xff0c;然而在编码实现过程中发现&#xff0c;由于主机的数量很多&#xff0c;导致循环遍历查询、更新…

c++ 多线程并发

基于C11的线程池(threadpool),简洁且可以带任意多的参数 - _Ong - 博客园 C11多线程编程(六)——线程池的实现 1. ① thread #include <iostream> #include <thread>class A { public:void operator()() {std::cout << "11111\n";} };int main…

python多线程并发请求

再api测试时&#xff0c;避免不了高并发的测试情况。所以以下案例为线程并发请求代码&#xff0c;以请求百度为例 #!/usr/bin/env python #!coding:utf-8 from __future__ import division from threading import Thread import requests import matplotlib.pyplot as plt imp…

多线程并发的一些解决思路

一、利用不变性解决并发问题 不变性&#xff08;Immutability&#xff09;模式。所谓不变性&#xff0c;简单来讲&#xff0c;就是对象一旦被创建之后&#xff0c;状态就不再发生变化。换句话说&#xff0c;就是变量一旦被赋值&#xff0c;就不允许修改了&#xff08;没有写操…

python之多线程并发

前言 今天呢笔者想和大家来聊聊python多线程的并发&#xff0c;废话就不多说了咱们直接进入主题哟。 一、线程执行 python的内置模块提供了两个内置模块&#xff1a;thread和threading&#xff0c;thread是源生模块&#xff0c;threading是扩展模块&#xff0c;在thread的基础…

python多线程并发测试

python多线程 文章目录 python多线程一、并发与并行&#xff1f;二、同步与异步的概念&#xff1f;三、线程与进程的区别&#xff1f;需求1&#xff1a;多线程执行不同任务&#xff1a;需求2&#xff1a;多线程执行相同任务&#xff1a;1.threading并发性2.多线程并发---资源共…