Shiro框架详解

shiro_tool.zip https://blog.csdn.net/xixiyuguang/article/details/109744942 立即下载

(注:初始登录账号:admin 密码:123456)
简介:本篇博客讲解了关于Shiro的四个部分

       一:Shiro的基本介绍

       二:Shiro的项目搭建

       三:Shiro代码下载参考(项目+sql文件)

       四:关于Shrio的问题分析

	   五:数据库表设计

一:Shiro的基本介绍

1:什么是Shiro、有什么用、什么时候使用?

  shiro是一个安全框架,可以集成spring框架,

  主要功能:认证、授权、加密、回话管理

  一般在进行权限分配的项目中使用(总监、经理、员工...)

2:三大核心组件(缺一不可)

  subject:用户

  SecurityManager:安全管理

  Realm:充当Shiro与安全数据间的桥梁(最少配置一个)

二:Shiro的项目搭建

  项目流程介绍

                web.xml中配置 ----> applicationContext-shiro.xml ----> 相应类

   流程详解:

   1:在web.xml中配置两处

   1.1:过滤器代理(不配置则Shiro不生效)
<filter>

<!-- 此处的name 要和配置文件中 filter工厂的id一样 -->

<filter-name>shiroFilter</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

<init-param>

<!-- 让shiro过滤器的生命周期 交给web容器管理 -->

<param-name>targetFilterLifecycle</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>shiroFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>
     1.2:在配置懒加载和监听器(已配置就不要重复配置)
<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring/applicationContext*.xml</param-value>

org.springframework.web.context.ContextLoaderListener

2:在pom.xml导入相应jar
<dependency>

	<groupId>org.apache.shiro</groupId>
	
	<artifactId>shiro-all</artifactId>
	
	<version>1.2.3</version>

</dependency>
3:新建applicationContext-shiro.xml,并进行相关配置
<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">



<!-- 以下5个bean分别对应功能 -->

<!-- 1. 安全管理器

2. Realm

3. 自定义的加密匹配器

4. 权限认证的观察器

5. Shiro过滤工厂 -->



<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<property name="realm" ref="authRealm"></property>

</bean>

<bean id="authRealm" class="cn.tarena.ht.shiro.AuthRealm">

<property name="credentialsMatcher" ref="authCredentialMatcher"></property>

</bean>

<bean id="authCredentialMatcher" class="cn.tarena.ht.shiro.AuthCredentialMatcher"></bean>

<bean id="advisor" class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">

<property name="securityManager" ref="securityManager"></property>

</bean>

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" >

<property name="securityManager" ref="securityManager"></property>

<!-- 设置登录地址:当用户没有登录,访问非登录页面时指定的请求地址 此地址会自动放行 -->

<property name="loginUrl" value="/tologin.action"></property>

<property name="filterChainDefinitions">

<value>

<!-- anon:放行 authc拦截 -->

/login.action=anon

<!-- 放行所有的静态资源文件 -->

/staticfile/** = anon

<!-- /*代表拦截所有的请求 /**代表拦截所有请求和所有静态文件 -->

<!-- 要是只拦截项目的一部分在这里修改拦截路径即可 -->

/**=authc

</value>

</property>

</bean>

</beans>
 4:根据上面配置的五个bean进行相应功能处理(后台部分)。

      4.1:类AuthCredentialMatcher
package cn.tarena.ht.shiro;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.UsernamePasswordToken;

import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;



import cn.tarena.ht.tool.Md5Utils;

//SimpleAuthorizationInfo

public class AuthCredentialMatcher extends SimpleCredentialsMatcher {



@Override

public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {

// TODO Auto-generated method stub

//把用户输入的密码 进行加密

UsernamePasswordToken loginToken = (UsernamePasswordToken) token;

//把用户输入的密码取出 char[] 转成 String

String password = String.valueOf(loginToken.getPassword());

password = Md5Utils.getMd5(password, loginToken.getUsername());

//修改令牌中的密码

loginToken.setPassword(password.toCharArray());



return super.doCredentialsMatch(token, info);

}

}
4.2:类AuthRealm
package cn.tarena.ht.shiro;

import java.util.List;

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.SimpleAuthenticationInfo;

import org.apache.shiro.authc.UsernamePasswordToken;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

import org.apache.shiro.realm.SimpleAccountRealm;

import org.apache.shiro.subject.PrincipalCollection;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;



import cn.tarena.ht.pojo.User;

import cn.tarena.ht.service.UserService;

@Component

public class AuthRealm extends SimpleAccountRealm{

@Autowired

private UserService userService;

//登录证明

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

//得到用户名

UsernamePasswordToken loginToken = (UsernamePasswordToken) token;

//给Info准备数据

//得到正确的用户信息

User user = userService.findOneByUsername(loginToken.getUsername());

/**

* principal:代表正确的对象

* credentials:代表正确的密码

* realmName:原材料对象的名称

*/

AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());



return info;

}

//权限认证

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

//准备当前登录用户的权限列表

// List<String> privileges = new ArrayList<>();

// privileges.add("货运管理");

// privileges.add("基础信息");

// privileges.add("系统管理");

//得到当前登录的用户信息

User user = (User) principals.getPrimaryPrincipal();

//根据用户Id管理查询出当前用户对应的模块--货运、基础、系统

List<String> privileges = userService.findModuleNamesBy(user.getUserId());

System.out.println("privileges="+privileges);

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

//将当前用户的权限存入当前Shiro框架中的Realm中的SimpleAuthorizationInfo中

info.addStringPermissions(privileges);

return info;

}

}
4.3:类Md5Utils
package cn.tarena.ht.tool;

import org.apache.shiro.crypto.hash.Md5Hash;

public class Md5Utils {

public static String getMd5(String password,String salt) {

//source 加密源

//salt 盐(这里是将用户名作为盐处理)

//hashIterations 和稀泥的次数

Md5Hash mh = new Md5Hash(password, salt, 2);

return mh.toString();

}

}
4.4:Login
@RequestMapping("login")

public String login(String username,String password,Model model,HttpSession session){

//代表当前用户

Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken token = new UsernamePasswordToken(username, password);

try {

subject.login(token);

//得到登录成功的user

User user = (User) subject.getPrincipal();

session.setAttribute("_CURRENT_USER", user);

return "redirect:/home";

} catch (AuthenticationException e) {

e.printStackTrace();

model.addAttribute("errorInfo","用户名或密码不正确!");

return "/sysadmin/login/login";

}

}
5:前台部分

1:在根标签中导入shiro标签

<%@ taglib uri=“http://shiro.apache.org/tags” prefix=“shiro” %>

2:根据当前模块(权限)是否存在进行判断
<shiro:hasPermission name="部门管理">

<li><a href="${ctx}/sysadmin/dept/list" onclick="linkHighlighted(this)" target="main" id="aa_1">部门管理</a></li>

</shiro:hasPermission>

<shiro:hasPermission name="用户管理">

<li><a href="${ctx}/sysadmin/user/list" onclick="linkHighlighted(this)" target="main" id="aa_1">用户管理</a></li></shiro:hasPermission>
3:前台根据拿到的模块进行排版





6:数据库设计思想

	一个模板对应一个功能

	一个权限对应多个模板

	一个用户对应多项权限
用户登录---通过---三表关联查询所有权限模板,封装成List发送至前台,

前台接受,进行相应判断,进行排版显示

三:Shiro项目代码下载参考(项目+sql文件)

项目框架:SSM+Shiro

四:关于Shrio的开发问题分析

1:登录

最开始的想法是用ajax登录,研究了一些资料发现在shiro中,路径全部拦截了

个人在spring-shiro.xml中配置的拦截路径

/SpringMVC/Admin/**=authc

之前尝试多种方法都被拦截,最后个人匹配的路径是

@RequestMapping("admin_login1")

在带入登录名,密码,问题解决

public String login(String Username,String Password,Model model,HttpSession session){}



2:在AuthRealm中doGetAuthorizationInfo没有执行

2.1:个人首先在网上查找资料,大多数都是说是要在

          springmvc.xml中和pom中配置文件 --->结果报错

2.2:知道想到一个问题程序在什么时候执行doGetAuthorizationInfo

          doGetAuthorizationInfo执行时机有三个,如下:

                  2.2.1、subject.hasRole(“admin”) 或 subject.isPermitted(“admin”):

                              自己去调用这个是否有什么角色或者是否有什么权限的时候;

                  2.2.2、@RequiresRoles("admin") :在方法上加注解的时候;

                  2.2.3、[@shiro.hasPermission name = "admin"][/@shiro.hasPermission]:

                               在页面上加shiro标签的时候,即进这个页面的时候扫描到有这个标签的时候。

五:数据库表设计:

经典5张表结构:
	1.sys_users用户表
	2.sys_roles角色表
	3.sys_permissions权限表(或资源表)
	4.sys_users_roles用户-角色关联表
	5.sys_roles_permissions角色-权限关联表
	
如果业务中权限很多很复杂,发现经典结构不再适用,那就考虑以下结构
	1.sys_users用户表
	2.sys_roles角色表
	3.sys_permissions权限表(或资源表)
	4.sys_users_roles用户-角色关联表
	5.sys_roles_permissions用户-权限关联表


	

FDTD Solutions-入射波长模式 经常在文献中看到仿真光源使用TM/TE模式,这个确定是十分必要的,决定了仿真结果。 但是也不能局限于选择TM/TE,因为不同领域、不同软件之间的使用习惯和命名可能不同。并且在现代光波导器件中,几乎全部 都是混合模式,或者称之为quasi-TE(准TE模式)和quasi-TM(准TM模式),多数情况下都简称为TE模式和TM模式。要知道 到底是TE模式还是TM模式,需要查看其电场的主分量(即振幅... 阅读详情

相关推荐

华为AC外置Portal认证方案配置步骤指南

华为AC外置Portal认证方案配置步骤指南

m0_46129105的博客 7677

Shiro数据解密并反编译工具——ShiroTool

内置100多个key,爆破解密rememberMe加密字段内容,对解密内容进行反序列化,展示反序列化后字节流。 根据序列化协议,逐字节读取解析,进行对象结构化展示,ysoserial CommonsBeanutils CommonsCollections等payload都能识别。 对涉及class文件的,再进行class反编译出java代码。

土豆的博客 8361

Element Server Suite社区版Helm部署:私有Matrix聊天服务器快速搭建指南

在云原生和微服务架构日益普及的今天,容器化部署已成为现代应用交付的标准范式。Kubernetes作为容器编排的事实标准,通过声明式配置和自动化管理,极大地简化了复杂分布式系统的部署与运维。Helm作为Kubernetes的包管理器,通过预定义的Chart模板,将应用及其依赖打包,实现了真正的“一键部署”,显著提升了部署效率和可重复性。这种技术组合的价值在于,它让开发者能够专注于业务逻辑,而非底层基础设施的复杂性,尤其适用于需要快速搭建、易于维护的服务场景。Element Server Suite Commu

weixin_42610010的博客 300

Shiro 框架详解

Shiro 是一个开源的 Java 安全框架,由 Apache 开发和维护。Shiro 可以帮助开发人员快速实现安全特性,包括身份认证、授权、加密和会话管理等。Shiro 的目标是简化 Java 安全编程,并提供更好的开发体验。易于学习和使用:Shiro 设计简单,易于学习和使用。灵活性高:Shiro 可以适用于任何应用场景,支持多种应用程序类型。安全性高:Shiro 的安全性能比较优越,提供了多种方式来保护应用程序的安全性。

兴趣是最好的老师,勤能补拙 4857

TouchSocket TcpService:构建高性能Tcp服务的终极利器

/ 接收到的数据data");// 回复客户端await ((ITcpSessionClient)client).SendAsync("服务端已收到消息!");// 继续执行后续插件TouchSocket的TCPService以极简的API、强大的扩展性和卓越的性能,重新定义了.NET TCP服务的开发体验。无论是物联网平台还是金融级实时通信系统,TCPService均能提供可靠的基础设施支持。立即探索示例项目,开启你的高性能服务开发之旅!扩展阅读如何实现WebSocket服务?

若汝棋茗 的博客 1461

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

孤独的单刀 5475

Shiro

Shiro Apache旗下的一款安全权限框架 shiro可以完成:认证,加密,授权,会话管理,以及web集成, 什么是shiro Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。 Apache Shiro 特性 Apache Shiro是一个全面的、蕴含丰富功能的安全框架 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现`对用户访问系统的

小牧的博客 816

百度百科 X-Bk-Token 算法还原

百度百科 X-Bk-Token 算法还原

自成背后的博客 1万+

Shiro-全面详解(学习总结---从入门到深化)

身份认证/登录。权限验证,即判断用户是否能在系统中做某件 事情。会话管理,用户登录后就是一次会 话,在没有退出之前,它的所有信息都在会话中,会话可以是 JavaSE环境的,也可以是Web环境的。加密,保护数据的安全性。即密码加密存储到 数据库,而不是明文存储。Web 支持,可以非常容易的集成到Web环境。缓存。在用户登录后,用户信息、拥有的权限不必每 次去查,这样可以提高效率。Shiro支持多线程应用的并发验证,即如在一个 线程中开启另一个线程,能把权限自动传播过去。提供测试支持。

4520

哨兵1号后向散射系数土壤水分反演

打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件。

所有专家都曾始于新手 3293

环境配置与基础教程:当前大厂主流套路:使用 MLflow 全链路管理 YOLO 实验参数、指标与模型版本

YOLO26与MLflow结合实现高效实验管理 YOLO26通过移除DFL模块和实现无NMS端到端推理,在CPU推理速度上提升43%,同时简化了模型导出流程。MLflow 3.10/3.11版本新增多工作区支持、成本追踪和安全序列化等功能,为机器学习实验提供全生命周期管理。两者结合可解决传统"截图+Excel"式实验管理的痛点,实现参数追踪、指标对比和模型版本控制的自动化。 关键优势: YOLO26架构优化带来显著性能提升 MLflow提供实验到生产的全链路管理 原生集成简化了计算机视觉

ZXSXJ的博客 191

Shiro框架-史上详解

Shiro   1.权限管理概述 2.Shiro权限框架   2.1 概念   2.2 Apache Shiro 与Spring Security区别 3.Shiro认证   3.1 基于ini认证   3.2 自定义Realm --认证 4.Shiro授权   4.1 基于ini授权   4.2 自定义realm – 授权 5.项目集成shiro 认证-授权注意点   5.1 认证   5.2 授权   5.3 注解@RequiresPermissions()   5.4 标签式权限验证 6.S

kentlhxy的博客 4万+

python爬取银行年报2

python爬取公司年报(巨潮资讯网)

bboysteed的博客 4730

shiro框架详解

shiro认证和授权 啥叫权限? 程序里面的权限是啥? 就是访问路径,路径在程序中对应的就是某种能能力和资源。 如何控制权限显示呢? 权限不应该属于某一个实体,而是属于某一个角色,只不过这个是题拥有了这个角色,而拥有了 这个权限 就是RBAC权限管理思想,不是直接将权限交给用户,而是给用户分配角色,角色赋予用户相应的权限 这样大大地减少了系统的开销 基于RBAC思想进行权限的控制显示 2.搭建w...

weixin_44934751的博客 478

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Apache Shiro 框架详解

连接应用与数据源的桥梁,负责提供用户信息(认证)和权限信息(授权)。

TracyCoder的博客 1768

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

shiro权限框架详解03-shiro介绍

1、介绍shiro的一个整体架构 2、介绍shiro的主要类的作用。 3、shiro lib包的maven坐标和作用

在路上 4105

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

框架详解_Shiro安全框架详解

Shiro安全框架简介Shiro概述Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。使用shiro就可以非常快速地完成认证、授权等功能的开发,降低系统成本。用户在进行资源访问时,要求系统要对用户进行权限控制,其具体流程如图-1所示:Shiro概要架构在概念层面,Shiro 架构包...

weixin_27427397的博客 266

权限框架之Shiro详解

文章大纲 一、权限框架介绍 二、Shiro基础介绍 三、Spring Boot整合Shiro代码实战 四、项目源码与资料下载 五、参考文章 一、权限框架介绍 1. 什么是权限管理   权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。   权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 1.1 用户身份认证   身份.

Dream_ling的博客 6431

框架详解_Shiro框架详解

之间工作中曾经用到过shiro这个权限控制的框架,之前一直都是停留在用的方面,没有过多的 去理解这方面的知识,现在有时间,专门研究了一下这个Shiro权限的框架使用。Shiro是什么?Apache Shiro是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。Apache Shiro的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。框...

weixin_30005929的博客 227

简单版 快速掌握实践 SpringBoot继承Shiro框架详解!

ApacheShiro 是一个Java的安全(权限)框架。.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。.Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。

SYJ的博客 7128
上一篇: 统一异常处理
下一篇: java封装 继承 多态 的概念和作用
jack_too
博客等级 码龄9年 17粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值