首页 > 其他分享 >springboot 集成shiro框架

springboot 集成shiro框架

时间:2024-06-18 14:58:17浏览次数:19  
标签:集成 return springboot shiro org apache import Shiro

目录

一、Shiro简介

二、架构体系与专业术语

三、Shiro与SpringSecurity的对比

四、Shiro优缺点

五、spring boot 集成 Shiro


一、Shiro简介

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

二、架构体系与专业术语

        Subject:主体,可以看到主体可以是任何可以与应用交互的 “用户”;

        SecurityManager:安全管理器,是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理。

        Authenticator:认证器,负责主体登录认证,验证用户是否拥有相应身份,可以自定义实现;需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;

        Authorizer:授权器,用来决定主体是否有权限进行相应的操作,能访问应用中的哪些功能;

        Realm:域,Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源;

        SessionManager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的;

        SessionDAO:DAO 大家都用过,数据访问对象,用于会话的 CRUD,比如我们想把 Session 保存到数据库,那么可以实现自己的 SessionDAO,通过如 JDBC 写到数据库;比如想把 Session 放到 Memcached 中,可以实现自己的 Memcached SessionDAO;另外 SessionDAO 中可以使用 Cache 进行缓存,以提高性能;

        CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能

        Cryptography:密码模块,可以对数据进行加密,如存储数据库的密码。

三、Shiro与SpringSecurity的对比

        SpringSecurity基于Spring开发,项目若使用Spring作为基础,配合SpringSecurity做权限更加方便,而Shiro需要和Spring进行整合开发;

        SpringSecurity功能比Shiro更加丰富,例如安全维护方面;

        SpringSecurity社区资源相对比Shiro更加丰富;

        Shiro的配置和使用比较简单,SpringSecurity上手复杂些;

        Shiro依赖性低,不需要任何框架和容器,可以独立运行。SpringSecurity依赖Spring容器;

        Shiro不仅仅可以使用Web中,它可以工作在任何应用环境中。在集群会话时Shiro最重要的一个好处或许就是它的会话独立于容器的。

四、Shiro优缺点

优点:

        简单易用:代码结构简单,易于理解和使用,能够快速集成到项目中。

        轻量级:Shiro是一个轻量级的框架,对外部依赖较少,容易集成与部署,可独立运行。

        扩展性:Shiro采用模块化的设计结构,可以方便地扩展和定制。

        功能完备:Shiro支持多种认证方式、多种数据源、多种Session管理方式等,可以满足大部分项目的安全需求。

缺点:

        社区支持:与Spring Security相比,Shiro的社区相对较小,这可能导致在某些特定问题上获取帮助的难度增加。

        与Spring框架的集成:Shiro虽然可以与Spring框架集成,但其原生支持并不如Spring Security那样深入和无缝。

五、spring boot 集成 Shiro

1.pom.xml引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.18.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springboot</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- shiro -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.5.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.新建ShiroRealm类

package com.springboot.common.shiro;

import com.springboot.repository.bean.UserBean;
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;

/**
 * Description 自定义realm
 * 在登录接口使用下面代码进行认证
 * Subject subject = SecurityUtils.getSubject();
 * UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("userName", "password");
 * subject.login(usernamePasswordToken);
 *
 * 登录成功后,可使用下面代码获取当前登录用户信息
 * Object principal = SecurityUtils.getSubject().getPrincipal();
 */
public class ShiroRealm extends AuthorizingRealm {

    /**
    * @description 权限认证
    * @param principalCollection
    * @return AuthorizationInfo
    **/
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //获取到doGetAuthenticationInfo方法return第一个参数传递的对象
        UserBean userBean = (UserBean) principalCollection.getPrimaryPrincipal();
        //此处可以查询数据库获取用户对应的权限 与 角色
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //根据查询的结果,设置权限 与 角色
//        info.addStringPermission("xxx");
//        info.addRole("xxx");
        return info;
    }

    /**
    * @description 登录认证方法
    * @param token
    * @return AuthenticationInfo
    **/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken user = (UsernamePasswordToken) token;
        String username = user.getUsername();
        //此处userBean可以通过username查询数据库获取用户信息
        UserBean userBean = new UserBean();
        userBean.setUserName("zhangsan");
        userBean.setPassword("123456");
        if (userBean == null) {
            return null;
        }
        //传递第一个参数,可以在doGetAuthorizationInfo授权方法获取到
        return new SimpleAuthenticationInfo(userBean, userBean.getPassword(), "");
    }
}

3.新建ShiroConfig配置类

package com.springboot.common.shiro;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Description shiro配置类
 */
@Configuration
public class ShiroConfig {

    /**
    * @description 自定义认证realm
    * @return ShiroRealm
    **/
    @Bean
    public ShiroRealm shiroRealm() {
        return new ShiroRealm();
    }

    /**
    * @description shiro安全管理器
    * @return SecurityManager
    **/
    @Bean(name = "securityManager")
    public SecurityManager securityManager() {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(shiroRealm());
        return defaultWebSecurityManager;
    }

    /**
    * @description siro过滤工程
    * @param securityManager
    * @return ShiroFilterFactoryBean
    **/
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        /*
        * anon      不认证
        * authc     登录认证
        * perms     资源权限认证
        * role      角色权限
        **/
//        filterChainDefinitionMap.put("/user/**", "perms[user]");
        filterChainDefinitionMap.put("/user/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }
}

4.新建LoginController登录接口

package com.springboot.controller;

import com.springboot.common.utils.ResultVO;
import com.springboot.vo.request.UserReq;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;

/**
* @description 登录控制层
**/
@RestController
public class LoginController {

    /**
    * @description 登录接口
    * @param userReq
    * @return ResultVO
    **/
    @RequestMapping("/login")
    public ResultVO login(UserReq userReq) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userReq.getUserName(),userReq.getPassword());
        subject.login(usernamePasswordToken);
        return ResultVO.success();
    }
}

标签:集成,return,springboot,shiro,org,apache,import,Shiro
From: https://blog.csdn.net/a360284634/article/details/139765269

相关文章

  • 基于Java+SpringBoot+Vue+elementUI的学生宿舍管理平台的设计与开发
    第一章绪论1.1选题背景和意义1.2国内外学生宿舍管理平台现状第二章相关技术简介2.1开发工具介绍2.1.1IDEA2.1.2VSCode2.1.3Navicat2.1.4宝塔面板2.2关键技术介绍2.2.1Java2.2.2SpringBoot2.2.3Mybatis2.2.4Vue2.2.5MySQL2.2.6Redis2.2.7E......
  • springboot引入第三方jar包本地lib并打包
    springboot引入第三方jar包本地lib并打包亲测可用一、在项目根目录创建lib目录并放入第三方lib包--project----lib(放在这儿)----src----target二、pom中引入第三方lib<!--自定义引入jar--><dependency><groupId>commons-io</groupId><artifac......
  • sonarqube集成jenkins做代码质量管控
    1Jenkins安装sonarqube-scanner2Jenkins上配置SonarQubeScanner全局工具入口:系统管理—系统配置—全局工具配置,找到sonarqubescanner,如下图。其中第3点选择4-1下载好的sonarqubescanner即可。3Jenkins上添加凭证入口:系统管理-安全-凭证-添加凭证4Jenkins上做SonarQ......
  • springboot 集成 websocket
    1.首先添加maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>2.添加拦截器importcn.hutool.core.util.StrUtil;importcn.hutool.extra.spri......
  • Java毕业设计-基于springboot开发的图书商城管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、管理员功能介绍1.1图书列表1.2图书订单信息管理1.3图书类型管理四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的图书......
  • Java毕业设计-基于springboot开发的图书进销存管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、用户信息管理2、图书类型管理3、商品退货管理4、客户信息管理5、图书添加6、客户添加7、应收金额四、毕设内容和源代码获取总结Java......
  • SpringBoot3项目打war包部署至Tomcat
    前言:近期,在搞国产中间件的部署,那么则需要将项目打为war包,并且在tomcat内尝试成了再去部署到国产中间件吧,以免引起不必要的时间浪费。1、准备工作准备好tomcat10的版本准备好SpringBoot项目2、代码改造打war包需要从springboot依赖中排除tomcat相关的包,我们以Snowy国产快速......
  • SpringBoot3整合SpringDoc实现在线接口文档
    写在前面在现目前项目开发中,一般都是前后端分离项目。前端小姐姐负责开发前端,苦逼的我们负责后端开发事实是一个人全干,在这过程中编写接口文档就显得尤为重要了。然而作为一个程序员,最怕的莫过于自己写文档和别人不写文档大家都不想写文档,那这活就交给今天的主角Swagger来实现......
  • 毕业设计——基于springboot的电力巡检系统
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • 毕业设计——基于SpringBoot的个人博客系统
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......