Shiro(认证Authentication)

news2024/10/17 7:18:09

Shiro简介

Apache Shiro是一个强大且灵活的开源安全框架,它提供了身份验证、授权、密码学和会话管理等一系列安全相关的功能。Shiro的设计目标是易于使用,同时保持强大的安全性。它可以在任何Java应用程序中使用,无论是简单的Java SE应用程序还是复杂的Java EE企业级应用。

Shiro的四大基石

  1. Authentication(认证)

    • 认证,也称为登录,是验证用户身份的过程。
    • 用户需要提供身份(principals)和凭证(credentials)给Shiro,以便Shiro能够验证用户的身份。
    • 身份通常是用户名或电子邮件地址,而凭证通常是密码。
  2. Authorization(授权)

    • 授权是验证用户是否拥有访问某个资源或执行某个操作的权限的过程。
    • Shiro通过Realm获取用户的角色和权限信息,并根据这些信息来判断用户是否有权访问某个资源或执行某个操作。
    • 授权机制可以基于角色(RBAC)或基于权限(PBAC)来实现。
  3. Session Management(会话管理)

    • 会话管理是指管理用户登录后的会话信息。
    • Shiro提供了会话的创建、获取、销毁和超时等管理操作。
    • 通过会话管理,Shiro可以跟踪用户的登录状态和会话信息,并在用户注销或会话超时后销毁会话。
  4. Cryptography(加密)

    • 加密是保护数据安全的重要手段。
    • Shiro提供了密码加密、散列和盐值等密码学功能,以确保用户密码和其他敏感数据的安全存储和传输。
    • 加密机制可以防止数据在传输过程中被窃取或篡改,从而确保数据的完整性和保密性。

这四大基石共同构成了Shiro安全框架的基础,使得Shiro能够为用户提供全面、可靠的安全保障。通过合理的配置和使用,Shiro可以有效地提高应用程序的安全性,并保护用户的隐私和数据安全。

Shiro的核心组件

  1. Subject:代表当前操作的用户,可以是任何与软件交互的实体。Subject提供了与当前用户交互的API,如登录、注销、获取会话等。

  2. SecurityManager:Shiro的核心,它管理着所有的Subject,并与Shiro的其他组件进行交互。SecurityManager负责协调Shiro的安全操作,如身份验证、授权等。

  3. Realm:Shiro与数据源(如数据库、LDAP等)之间的桥梁。Realm负责获取安全数据(如用户、角色、权限等),并将其提供给Shiro的其他组件使用。

SpringBoot整合Shiro架构实现认证

自定义Realm

自定义Realm需要继承AuthorizingRealm类,该类封装了很多方法,且继承自Realm类。

继承AuthorizingRealm类后,我们需要重写以下两个方法:

doGetAuthorizationInfo()方法:获取权限信息

doGetAuthenticationInfo()方法:获取身份信息

package com.ktjiaoyu.thymeleaf.config.shiro;

import com.ktjiaoyu.thymeleaf.entity.Role;
import com.ktjiaoyu.thymeleaf.entity.RoleRight;
import com.ktjiaoyu.thymeleaf.entity.User;
import com.ktjiaoyu.thymeleaf.service.UserService;
import jakarta.annotation.Resource;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

import java.util.Set;

/**
 * @author cuishujian
 * @date 2024/9/29
 */
public class MyShirRealm extends AuthorizingRealm {

    @Resource
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("调用MyShiroRealm.doGetAuthorizationInfo获取权限信息");
        // 获取权限信息
        User user = (User) principalCollection.getPrimaryPrincipal();
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 这里我们暂时先不授予权限信息,在下一个Shiro(授权Authorization)再实现
        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("调用MyShiroRealm.doGetAuthenticationInfo获取身份信息!");
        // 获得身份信息
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String usrName = token.getUsername();
        User user = userService.getUserByUsrName(usrName);
        System.out.println(user);
        if (user == null){
            throw new UnknownAccountException(); // 账号错误
        }
        if (user.getUsrFlag() == null || user.getUsrFlag().intValue() == 0){
            throw new LockedAccountException(); // 账号锁定
        }
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getUsrPassword(),getName());
        return info;
    }
}

配置Shiro相关对象

package com.ktjiaoyu.thymeleaf.config.shiro;


import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.alibaba.druid.sql.visitor.functions.Right;
import com.ktjiaoyu.thymeleaf.entity.RoleRight;
import com.ktjiaoyu.thymeleaf.service.RoleService;
import com.ktjiaoyu.thymeleaf.service.impl.RoleServiceImpl;
import jakarta.annotation.Resource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author cuishujian
 * @date 2024/9/29
 */
@Configuration
public class ShiroConfig {

    @Resource
    RoleService roleService;
    @Bean
    public MyShirRealm myShirRealm(){ // 自定义Realm
        System.out.println("【myShirRealm】");
        MyShirRealm shirRealm = new MyShirRealm();
        return shirRealm;
    }

    @Bean
    public SecurityManager securityManager(){ // 安全管理器 SecurityManager
        System.out.println("【securityManager】");
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 注入Realm
        securityManager.setRealm(myShirRealm());
        SecurityUtils.setSecurityManager(securityManager);
        return securityManager;
    }


    @Bean
    public ShiroFilterFactoryBean shiroFilterFactory(SecurityManager securityManager){ // Shiro过滤器:权限验证
        System.out.println("【shiroFilterFactory】");
        ShiroFilterFactoryBean shiroFilterFactory = new ShiroFilterFactoryBean();
        // 注入SecurityManager
        shiroFilterFactory.setSecurityManager(securityManager);
        // 这里我们暂时先不验证权限信息,在下一个Shiro(授权Authorization)再实现
        return shiroFilterFactory;
    }

    @Bean(name = "shiroDialect")
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }


    /**
     * 开启 Shiro注解 (如 @RequiresRoles,@RequiresPermissions)
     * 需借助 SpringAOP 扫描使用 Shiro 注解的类,并在必要时进行安排逻辑验证
     * 配置以下两个bean(DefaultAdvisorAutoProxyCreator和 AuthorizationAttributeSourceAdvisor)
     */
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setProxyTargetClass(true);
        return advisorAutoProxyCreator;
    }

    /**
     * 开启 aop 注解支持
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
}

编写控制器Controller

package com.ktjiaoyu.thymeleaf.controller;

import com.ktjiaoyu.thymeleaf.service.RightService;
import com.ktjiaoyu.thymeleaf.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author cuishujian
 * @date 2024/9/13
 */
@Controller
public class IndexController {

    @RequestMapping("/login")
    public String login(){
        return "login";
    }

    @RequestMapping("/main")
    public String toMain(Model model){
        return "main";
    }

    @RequestMapping("/doLogin")
    public String doLogin(String usrName, String usrPassword, HttpServletRequest request, Model model){
        try {
            UsernamePasswordToken token = new UsernamePasswordToken(usrName,usrPassword);
            Subject subject = SecurityUtils.getSubject();
            subject.login(token);// 认证、登录
            // 认证(登录)成功
            User user = (User) subject.getPrincipal();
            request.getSession().setAttribute("loginUser",user);
            return "redirect:/main";
        }catch (UnknownAccountException | IncorrectCredentialsException e){
            model.addAttribute("msg","用户名或密码错误,登录失败!");
            return "login";
        }catch (LockedAccountException e){
            model.addAttribute("msg","用户被禁用,登录失败!");
            return "login";
        }catch (AuthenticationException e){
            model.addAttribute("msg","认证异常,登录失败!");
            return "login";
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机快速入门之 LED点阵 结合74hc595 的应用 2024/10/16

51单片机快速入门之 LED点阵 结合74hc595 的应用 74HC595是一种常用的数字电路芯片,具有串行输入并行输出的功能。它主要由两个部分组成:一个8位的移位寄存器和一个8位的存储寄存器。数据通过串行输入管脚(DS)逐位输入&#xff0…

unity Gpu优化

不一样的视角,深度解读unity性能优化。unity性能优化,unity内存优化,cpu优化,gpu优化,资源优化,资源包、资源去重优化,ugui优化。 gpu优化静态批处理静态批处理原理规则静态合批的原理静态合批的…

Spring Boot视频网站:安全与可扩展性设计

4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构,而是基于网络浏览器的方式去访问服务器,进而获取需要的数据信息,这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

Appium环境搭建、Appium连接真机

文章目录 一、安装Android SDK二、安装Appium-desktop三、安装Appium Inspector 一、安装Android SDK 首先需要安装jdk,这里就不演示安装jdk的过程了 SDK下载地址:Android SDK 下载 1、点击 Android SDK 下载 -> SKD Tools 2、选择对应的版本进行下…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

云栖实录 | 智能运维年度重磅发布及大模型实践解读

本文根据2024云栖大会实录整理而成,演讲信息如下: 演讲人: 钟炯恩 | 阿里云智能集团运维专家 张颖莹 | 阿里云智能集团算法专家 活动: 2024 云栖大会 AI 可观测专场 -智能运维:云原生大规模集群GitOps实践 2024 …

【c++】c++11多线程开发

2 C多线程 本文是参考爱编程的大丙c多线程部分内容,按照自己的理解对其进行整理的一篇学习笔记,具体一些APi的详细说明请参考大丙老师教程。 代码性能的问题主要包括两部分的内容,一个是前面提到资源的获取和释放,另外一个就是多…

使用rabbitmq-operator在k8s集群上部署rabbitmq实例

文章目录 前言一、rabbitmq-operator二、进行部署1.部署cluster-operator2.创建自己需要的特定命名空间3.创建rabbitmq的instance4.创建nodeport访问 结果验证 前言 使用rabbitmq-operator在k8s集群上部署rabbitmq实例。时区设置为上海 一、rabbitmq-operator 官网地址&#…

数学建模算法与应用 第16章 优化与模拟方法

目录 16.1 线性规划 Matlab代码示例:线性规划求解 16.2 整数规划 Matlab代码示例:整数规划求解 16.3 非线性规划 Matlab代码示例:非线性规划求解 16.4 蒙特卡洛模拟 Matlab代码示例:蒙特卡洛模拟计算圆周率 习题 16 总结…

java代码生成器集成dubbo,springcloud详解以及微服务遐想

摘要 今天终于有了点空闲时间,所以更新了一下代码生成器,修复了用户反馈的bug,本次更新主要增加了dubbo和springcloud脚手架的下载功能,架子是本人亲自搭建,方便自由扩展或者小白学习使用,你也许会问为什么…

红日安全vulnstack (二)

目录 环境搭建 网卡设置 修改Kali网段 IP 分布 WEB渗透 Weblogin服务开启 漏洞扫描 CVE工具利用 MSF上线 内网渗透 域内信息收集 凭证横向移动 权限维持 黄金票据 参考文章 https://www.cnblogs.com/bktown/p/16904232.htmlhttps://blog.csdn.net/m0_75178803/ar…

leetcode54:螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[1,2,3,…

hackmyvm-Hundred靶机

主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器,发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…

个人博客系统_测试报告

1.项目背景 基于SSM框架实现的个人博客系统,由五个页面构成:用户登录页、博客发表页、博客编辑页、博客列表页以及博客详情页。登录即可查看自己与其他用户已发布的博客,也可以使用自己的账号发布博客,通过使用Selenium定位web元…

《人工智能:CSDN 平台上的璀璨之星》

一、CSDN 上的 AI 热门话题 GPT-3 作为 CSDN 上的热门话题,其应用极为广泛。GPT-3 是 OpenAI 开发的一种基于 Transformer 架构的大规模预训练语言模型,拥有惊人的 1750 亿个参数。它具有多任务处理能力,能够执行多种自然语言处理任务&#x…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产,企业管理员必须建立高效的企业终端安全管控机制,确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统,确保任何未经授权的资产变动都能被迅…

Ajax处理错误信息(处理响应报文)

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action""><div>用户名<input type"text" class"username"></div>…

【2024-10-16】某小破站w_rid参数分析

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、参数分析三、代码一、前言 看一下小破站的参数加密 网址: aHR0cHM6Ly9zcGFjZS5iaWxpYmlsaS5jb20vNDA1Nz…

c++就业1.1.3海量数据去重的Hash与BloomFilter

找到具体的位置 通过映射 当前需要插入的指向 上一层最后一个 方便头插 布隆过滤器 - 查找是否有这个值 但是不能够返回value 服务器和过滤器进行网络交互 我们要知道这个key在不在mysql中 去查询并且在mysql中进行查询 所以在服务器部署布隆过滤器 为了节约内存 用位图 对str…

Linux权限理解及环境基础开发工具使用

前言 Linux中有两种用户&#xff0c;一种是root用户&#xff0c;另一种是普通用户&#xff0c;二者的权限不一样&#xff0c;即能做的事情不一样。下面我们来细讲一下这些不同。 root用户能在Linux系统下做任何事情&#xff0c;而普通用户只能做有限的事情。 root用户的命令…